text
selanjutnya pada pencarian kedua algoritma akan memeriksa pada
y
1
yang dilakukan dari kanan ke kiri seperti yang ditunjukkan pada gambar 2.5.
Gambar 2.4 Pencocokan pada
pattern y
2
dimulai dari karakter paling kiri
Gambar 2.5 Pencocokan pada
pattern y
1
dimulai dari karakter paling kanan
2.4 Algoritma Boyer-Moore
Algoritma Boyer-Moore dipublikasikan pada tahun 1977 oleh Robert S. Boyer dan J. Strother Moore pada tahun 1997. Algoritma Boyer-Moore dianggap sebagai algoritma
pencocokan
string
yang paling efisien pada aplikasi umum, karena sering diimplementasikan pada
text editors
untuk perintah “
search
” dan “
subtitute
” Charras Lecroq, 2001.
Algoritma ini kemudian dikembangkan menjadi beberapa varian, diantaranya Turbo Boyer-Moore, Tuned Boyer-Moore, Hoorspol dan Zhu-Takaoka. Dan dari hasil
penilitan yang dilakukan oleh Sagita 2013, disimpulkan bahwa algoritma Boyer- Moore memiliki waktu pencarian tercepat dari varian Boyer-Moore lainnya. Dimana
algoritma Turbo Boyer-Moore merupakan algoritma tercepat kedua dan yang paling lambat adalah algoritma Tuned Boyer-Moore.
Algoritma Boyer-Moore melakukan pencocokan dimulai dari karakter yang paling kanan hingga karakter paling kiri
pattern
. Jika terjadi ketidakcocokan antara karakter paling kanan
pattern
dengan karakter pada
text
yang dicocokkan, maka
Universitas Sumatera Utara
karakter pada
pattern
akan diperiksa satu persatu untuk mendeteksi apakah ada karakter pada
text
tersebut yang sama dengan karakter pada
pattern
. Apabila terjadi kecocokan, maka
pattern
akan digeser sedemikian rupa sehingga posisi karakter yang sama antara
pattern
dan
text
terletak sejajar. Secara sistematis, langkah-langkah yang dilakukan algoritma Boyer-Moore
pada saat mencocokkan
string
adalah sebagai berikut Soleh, 2011 : a.
Algoritma mulai mencocokkan
pattern
pada awal
text
. b.
Algoritma ini akan mencocokkan karakter per karakter dari kanan ke kiri
pattern
dengan karakter di
text
yang bersesuaian, sampai salah satu kondisi berikut dipenuhi :
i. Karakter pada
pattern
dan pada
text
yang dibandingkan tidak cocok
mismatch
. ii.
Semua karakter di
pattern
cocok. Kemudian algoritma akan memberitahukan penemuan di posisi ini.
c. Algoritma kemudian menggeser
pattern
dengan memaksimalkan nilai pergeseran
good-suffix
dan pergeseran
bad-character
, lalu mengulangi langkah 2 sampai
pattern
berada diujung
text
. Tabel pergeseran
bad-character
dan
good-suffix
dapat dihitung dengan kompleksitas waktu dan ruang sebesar
O n
+ σ dengan σ adalah besar ruang alfabet.
Sedangkan pada fase pencarian, algoritma ini menemukan semua kemunculan dari
pattern
dengan panjang
n
di dalam
text
sepanjang
m
dengan waktu
O nm
. Pada kasus terburuk, algoritma ini akan melakukan 3
m
pencocokan karakter, namun pada performa terbaiknya algortima ini hanya akan melakukan
O n
m
pencocokan Charras Lecroq, 2001.
2.4.1 Pergeseran Bad-Character
Misal, terjadi ketidakcocokan antara karakter
y
[
i
] =
b
pada
pattern
dengan karakter
x
[
i
+
j
] =
a
pada
text
selama pencocokan terjadi pada posisi
j
. Lalu,
y
[
i
+ 1 ..
n
– 1] =
x
[
i
+
j
+ 1 ..
j
+
n
– 1] =
v
dan
y
[
i
] ≠
x
[
i
+
j
]. Pergeseran
bad-character
terdiri dari menyejajarkan karakter
x
[
i
+
j
] pada
text
dengan kemunculan paling kanan karakter tersebut pada
pattern
, proses ini dapat dilihat pada gambar 2.6. Apabila karakter
a
tidak muncul pada
pattern
dan tidak ada kemunculan salah satu karakter pada
pattern
di
text
termasuk karakter
a
, maka
pattern
akan digeser sampai karakter paling kiri
Universitas Sumatera Utara
pada
pattern
sejajar dengan karakter setelah
x
[
i
+
j
], yaitu
x
[
i
+
j
+
1
], seperti yang dapat dilihat pada gambar 2.7 Charras Lecroq, 2001.
Gambar 2.6 Pergeseran
bad-character
,
a
muncul pada
y
Gambar 2.7 Pergeseran
bad-character
, tidak ada kemunculan
a
pada
y
Pada tabel
bad-character
, setiap karakter pada
pattern
diberi nilai sesuai dengan ukuran jauhnya karakter tersebut dari karakter paling kanan dari
pattern
dan untuk karakter yang tidak terdapat pada
pattern
akan diberi nilai sejumlah karakter pada
pattern
. Adapun pseudocode untuk pergeseran
bad-character
ini adalah sebagai berikut :
Procedure preBmBc input y : array[0..n-1]of char,
input n : integer, inputoutput bmBc : array of integer
Deklarasi
i:integer
Algoritma
for i=0; iASIZE; ++i bmBc[i]
n for i=0; i n - 1; ++i
bmBc[y[i]] n – i – 1;
Universitas Sumatera Utara
2.4.2 Pergeseran Good-Suffix
Misal, terjadi ketidakcocokan antara karakter
y
[
i
] =
b
pada
pattern
dengan karakter
x
[
i
+
j
] =
a
pada
text
selama pencocokan terjadi pada posisi
j
. Lalu,
y
[
i
+ 1 ..
n
– 1] =
x
[
i
+
j
+ 1 ..
j
+
n
– 1] =
v
dan
y
[
i
] ≠
x
[
i
+
j
]. Pergeseran
good-suffix
terdiri dari menyejajarkan potongan
x[i
+
j
+ 1..
j
+
n
– 1] =
y
[
i
+ 1..
n
– 1] dengan kemunculan paling kanan potongan tersebut pada
y
yang didahului oleh karakter yang berbeda dari
y
[
i
], dapat dilihat pada gambar 2.8. Apabila tidak ada potongan seperti itu, pergeseran dilakukan dengan menyejajarkan akhiran terpanjang
u
pada
v
dengan awalan dari
y
yang sama dengan akhiran
u
tersebut, seperti pada gambar 2.9 Charras Lecroq, 2001.
Gambar 2.8 Pergeseran
good-suffix
,
v
muncul didahului oleh karakter
c
Gambar 2.9 Pergeseran
good-suffix
, hanya akhiran
dari v
yang muncul pada
y
Pada tabel pergeseran
good-suffix
, nilai pergeseran digunakan ketika ketidakcocokan ditemukan berdasarkan karakter pada posisi keberapa yang menyebabkan
ketidakcocokan. Nilai dari setiap karakter yang ada pada
pattern
bergantung terhadap ada atau tidaknya perulangan akhiran
suffix v
dari
text
pada
pattern
. Semakin banyak perulangan, maka akan semakin kecil nilai pergeseran. Untuk menentukan nilai-nilai
tersebut, lebih dahulu menghitung nilai tabel
suffix
yang bertujuan untuk memberi tanda adanya perulangan akhiran. Dari tabel
suffix
inilah tabel
good-suffix
akan didapat.
Universitas Sumatera Utara
Pada tabel
suffix
, berisi nilai dari tiap karakter yang ada pada
pattern
yang menunjukkan ada atau tidaknya perulangan akhiran
suffix
dan dimana posisi perulangan tersebut sehingga ketika proses perhitungan tabel
good-suffix
dapat diketahui seberapa banyak pergeseran yang akan dilakukan untuk pencocokan
selanjutnya. Adapaun pseudocode untuk pergeseran
good-suffix
adalah sebagai berikut :
Procedure suffixes input y: array[0..n-1] of char,
input n: integer, inputoutput suff: array of integer
Deklarasi
f, g, i : integer
Algoritma
suff[n-1] n;
g n-1
for i = n-2; i = 0; --i ifi g and suff[i + n
– 1 - f] i-gdo suff[i]
suff[i + n – 1 - f]; else
ifigdo g
i; f = i
whileg = 0 and y[g] == y[g + n – 1 - f]do
--g; suff[i]
f-g; endif
endfor procedure preBmGs
input y: array of char, input n:integer,
inputoutput bmGs: array of integer
Deklarasi
i, j : integer suff : array [0..YSIZE] of integer
Algoritma
suffixesy, n, suff
Universitas Sumatera Utara
for i=0; i n; ++ido bmGs [i]
n for i= n-1; i = -1; --1
ifi == -1 or suff[i] == i+1 forj=0; j n-1-i; ++j
ifbmGs[j] == n bmGs[j]
n-1-i for i=0; i = n-2; ++i
bmGs[n-1-suff[i]] n-1-i
Setelah diperoleh nilai-nilai pada tabel
bad-character
dan tabel
good-suffix
, selanjutnya algoritma Boyer-Moore akan menggunakan nilai maximum antara nilai
pergeseran
bad-character
dan nilai pergeseran
good-suffix
untuk melakukan pergeseran
window
pada saat pencocokan berlangsung. Proses pencocokan
string
dengan algoritma Boyer-Moore ini dapat dilihat dalam pseudocode berikut :
procedure BM input y: array[0..n-1] of char,
input n:integer, input x: array of[0..m-1] char,
input m:integer
Deklarasi
i, j : integer bmGs : array [0..YSIZE] of integer
bmBc : array [0..ASIZE] of integer
Algoritma
Preprocessing preBmGsy, n, bmGs
preBmBcy, n, bmBc searching
j = 0 whilej = m-n
fori= n-1; i = 0 and y[i] == x[i+j]; --i ifi 0
OUTPUTj j
j + bmGs[0] else
j j + MAXbmGs[i], bmBc[x[i+j]]- n + 1 + i
endif endwhile
Universitas Sumatera Utara
Perhitungan dengan algoritma Boyer-Moore dapat dilihat pada contoh berikut ini. Contoh :
Pattern y
= “comp”
n
= 4
Text x
= “host computer”
a.
Perhitungan pergeseran
bad-character
i
1 2
3
c
c o m p
BmBc
[
c
] 3
2 1
4
Nilai pergeseran pada tabel didapat dengan perhitungan sebagai berikut :
BmBc
[
y
[
i
]] =
n
– 1 –
i BmBc
[
y
[0]] = 4 – 1 – 0 = 3
BmBc
[
y
[1]] = 4 – 1 – 1 = 2
BmBc
[
y
[2]] = 4 – 1 – 2 = 1
BmBc
[
y
[3]] = 4 – 1 – 3 = 0
Dan untuk karakter selain yang terdapat pada
pattern
, karakter tersebut bernilai sejumlah karakter
pattern
yaitu 4.
b. Perhitungan pergeseran
good suffix
Berdasarkan perhitungan sesuai pseudocode pergeserannya, didapat nilai untuk tabel
good-suffix
sebagai berikut :
i
1 2
3
c
c o m p
suff
[
i
] 4
BmGs
[
i
] 4
4 4
1
c. Pencocokan
pattern
dengan
text
i
1 2
3
c
c o m p
BmBc
[
c
] 3
2 1
4
BmGs
[
i
] 4
4 4
1 -
Universitas Sumatera Utara
Pencocokan 1 :
c o
m p
BmBc
[t] = 4
BmGs
[3] = 1 Maka pergeserannya, max1, 4 = 4
Pencocokan 2 :
c o
m p
BmBc
[
m
] = 1
BmGs
[3] = 1 Maka pergeserannya, max1, 1 = 1
Pencocokan 3 :
c o
m p
Pada pencocokan ke-3,
pattern
ditemukan pada indeks ke-5 pada
text
.
2.5 Penelitian Terdahulu