16
2.5.1
Pergeseran bad-character
Pergeseran bad-character adalah p
ergeseran yang dilakukan berdasarkan karakter apa yang menyebabkan tidak cocok dan seberapa jauh karakter tersebut
dari karakter paling akhir Argakusumah dkk, 2014. S
etiap 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 diberi nilai sejumlah karakter pada pattern Tania, 2015.
Pseudocode untuk pergeseran bad-character Argakusumah dkk, 2014 :
Procedure prebadChars Input P : array[0..n-1] of char
Input n : integer Inputoutput badChars : array[0..n-1] of integer
Deklarasi : i : integer Algoritma :
for i := 0 to Asize-1 badChars[i] := m;
endfor fori := 0 to m
– 2 badChars[P[i]] := m
– i – 1; endfor
2.5.2 Menghitung nilai bad-character
Pada subbab ini, digunakan pattern “senang” sebagai contoh perhitungan
bad-character. Tahapan menghitung nilai bad-character dari pattern tersebut yaitu: 1.
Lakukan pencacahan dari posisi terakhir pattern sampai ke posisi awal, dimulai dengan nilai pergeseran 0 dalam pattern ini karakter “g”.
2. Mundur ke posisi sebelumnya, nilai pergeseran sebelumnya ditambah 1,
karena karakter ”n” belum pernah ditemukan, maka nilai pergeserannya 1.
3. Mundur ke posisi sebelumnya, nilai pergeseran sebelumnya ditambah 1,
karena karakter ”a” belum pernah ditemukan, maka nilai pergeserannya 2.
4. Mundur ke posisi sebelumnya, karena karakter “n” sudah pernah ditemukan
maka nilai pergeseran sama dengan karakter “n” yang sebelumnya yaitu 1. 5.
Mundur ke posisi sebelumnya, karena karakter “e” belum pernah ditemukan maka nilai pergeserannya adalah 4 nilai pencacah pada karakter “e” ditambah 2
karena ni lai pergeseran “n” pernah ditemukan.
17
6. Mundur ke posisi sebelumnya, nilai pergeseran sebelumnya ditambah 1,
karena karakter ”s” belum pernah ditemukan, maka nilai pergeserannya 5.
Catatan : untuk karakter selain “s, e, n, a, g” nilai pergeserannya sebesar panjang pattern, yaitu 6 karakter sepanjang pattern.
Nilai pergeseran dari bad-character yang sudah didapatkan : Posisi
1 2
3 4
5 6
Pattern s
e n
a n
g Nilai pergeseran bad-character
5 4
1 2
1 6
2.5.3 Pergeseran good-suffix
Pergeseran good-suffix adalah pergeseran yang dilakukan berdasarkan posisi ketidakcocokan karakter yang terjadi Argakusumah dkk, 2014. Nilai
pergeseran good-suffix 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 dari teks pada pattern. Semakin banyak perulangan, maka akan semakin
kecil nilai pergeseran Tania, 2015. Untuk menentukan nilai tersebut, hitung lebih dahulu nilai tabel suffix yang
bertujuan untuk memberi tanda adanya perulangan akhiran. Dari tabel suffix inilah tabel good-suffix akan didapat. Nilai pada tabel suffix akan memberitahu posisi
perulangan sehingga saat proses perhitungan tabel good-suffix dapat diketahui seberapa banyak pergeseran yang akan dilakukan untuk pencocokkan selanjutnya
Tania, 2015. Pseudocode mencari nilai suffix Argakusumah dkk, 2014 :
Procedure suffixes Input P : array[0..n-1] of char
Input n : integer Inputoutput suff : array[0..n-1] of integer
Deklarasi : f, g, i : integer Algoritma :
suff [n - 1] := n; g := n
– 1; for i := n
– 2 downto 0 { if i g and suff [i + n
– 1 - f] i – g suff[i] := suff[i + n
– 1 – f ]; else
if i g
18
g := i; endif
f := i; while g = 0 and P[g] = P[g + n
– 1 – f] --g;
endwhile suff [i] = f
– g; endif
endfor
Pseudocode pergeseran good-suffix Argakusumah dkk, 2014 :
Procedure goodsuffix Input P : array[0..n-1] of char
Input n : integer Inputoutput goodsuffixes : array[0..n-1] of integer
Deklarasi : i, j : integer suff : array [0..RuangAlpabet] of integer
Algoritma : suffixesx,n,suff;
for i := 0 to m-1 goodsuffixes[i] := n
endfor j := 0
for i := n
– 1 downto 0 if suff[i] = i + 1
for j := j to n – 2 – i
if goodsuffixes[j] = n goodsuffixes[j] := n
– 1 – i endif
endfor endif
endfor fori = 0 to n
– 2 goodsuffixes[n
– 1 suff[i]] := n – 1 – i; endfor
Setelah diperoleh nilai bad-character dan good-suffix, algoritma boyer moore akan menggunakan nilai maksimum antara kedua nilai tersebut untuk
melakukan pergeseran saat pencocokkan Tania, 2015. Pseudocode algoritma boyer moore Argakusumah dkk, 2014 :
Procedure BoyerMooreSearch Input m, n : integer
Input P : array[0..n-1] of char Input T : array[0..m-1] of char
output ketemu : array[0..m-1] of boolean Deklarasi : i, j, shift, goodsuffixesshift, badcharactershift : integer
goodsuffixes : array[0..255] of integer badChars : array[0..n-1] of integer
19
Algoritma : goodsuffixn, P, goodsuffixes
prebadCharsn, P, badChars i := 0
while i = m
– n do j := n
– 1 while j = 0 n and T[i + j] = P[j] do
j := j – 1
endwhile if j 0 then
ketemu[i] := true; shift := goodsuffixes[0]
else badcharactershift := badChars[chartointT[i + j]]
– n + j + 1 goodsuffixesshift := goodsuffixes[j]
shift := maxbadcharactershift, goodsuffixesshift endif
i := i + shift endwhile
2.5.4 Menghitung nilai good-suffix