Menghitung nilai bad-character Pergeseran good-suffix

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