BAB 4 IMPLEMENTASI DAN PENGUJIAN
4.1. Pengujian Sistem
Pencarian istilah dalam kamus komputer dirancang akan menggunakan algoritma string matching sebagai solusi dalam pencarian istilah berdasarkan isi Kamus,
berhubung isi kamus komputer yang sangat banyak, maka sangat sulit untuk merealisasikan penyajian arti dari istilah berdasarkan isi Kamus komputer secara
keseluruhan karena terbatasnya ukuran layar handphone yang berbasis Android. Oleh karena itu pada implementasi algoritma string matching untuk pencarian istilah dalam
kamus komputer diharapkan dapat menyelesaikan masalah tersebut, dimana dalam algoritma string matching penyajian arti dari istilah lebih sedikit karena adanya proses
seleksi sampai ditemukan istilah berdasarkan isi kamus itu sendiri dengan menggunakan kata kunci. Dalam algoritma string matching, pencarian string
dirumuskan sebagai berikut: 1.
Sebuah teks text, yaitu sebuah long string yang panjang n karakter 2.
Pattern, yaitu sebuah string dengan panjang m karakter mn yang akan dicari dalam text.
Dalam algoritma pencocokan string, teks diasumsikan berada dalam memori, sehingga bila kita mencari string di dalam sebuah arsip, maka semua isi arsip perlu
dibaca terlebih dahulu kemudian disimpan didalam memory. Jika pattern muncul lebih dari sekali didalam teks, maka pencarian hanya akan memberikan keluaran
berupa lokasi pattern ditemukan pertama kali.
Algoritma Knuth , Morris dan Pratt memanfaatkan informasi yang diperoleh dengan perbandingan simbol sebelumnya. Ini tidak pernah kembali membandingkan
simbol teks yang telah cocok simbol pattern. Ada beberapa definisi yang perlu dipahami pada algoritma ini: Misalkan A adalah alfabet dan x = x1x2…xk adalah
string yang panjangnya k yang dibentuk dari karakter-karakter di dalam alfabet A.
•
Awalan prefix dari x adalah upa-string substring u dengan
u = x1x2…xj – 1 , j є{1, 2, …, k}
dengan kata lain, x diawali dengan u. •
Akhiran suffix dari x adalah upa-stringsubstring u dengan
u = xj – b xj – b + 1 …xk , j є {1, 2, …, k}
dengan kata lain, x di akhiri dengan v. •
Pinggiran border dari x adalah upa-string r sedemikian sehingga
r = x1x2…xj – 1 dan
u = xj – b xj – b + 1 …xj , j є {1, 2, …, k}
dengan kata lain, pinggiran dari x adalah upastring yang keduanya awalan dan juga akhiran sebenarnya dari x.
Misalkan A adalah alfabet dan x = x0 ..., bilangan elemen k - 1 xk serangkaian panjang k atas A. Sebuah awalan x adalah substring u dengan u = x0 ...
xb - 1 di mana b elemen {0 , ... , k} yaitu x dimulai dengan u. Sebuah akhiran x adalah substring u dengan u = xk - b ... xk - 1 di mana b elemen {0 , ... , k}
yaitu x berakhir dengan u.
Sebuah awalan u x atau akhiran u x disebut awalan yang tepat atau akhiran, masing-masing, jika equalx Unot, yaitu jika panjang b kurang dari k.
Sebuah perbatasan x adalah r substring dengan r = x0 ... xb - 1 dan r = xk - b ... xk - 1 di mana b elemen {0 , ... , k - 1}
Sebuah perbatasan x adalah substring yang baik awalan yang tepat dan akhiran yang tepat x. Kami menyebutnya panjangnya b lebar perbatasan.
Contoh: Misalkan x = Abacab. Awalan yang tepat x adalah ε, a, ab, aba, Primero, abaca
Akhiran yang tepat x adalah ε, b, ab, taksi, ACAB, bacab
Perbatasan x adalah ε, ab
Perbatasan ε memiliki lebar 0, perbatasan ab memiliki lebar 2. The string kosong ε selalu perbatasan x, untuk semua x elemen A +. String
kosong ε sendiri tidak memiliki perbatasan.
Contoh berikut menggambarkan bagaimana jarak pergeseran algoritma Knuth - Morris - Pratt ditentukan dengan menggunakan gagasan perbatasan string.
contoh : 0 1 2 3 4 5 6 7 8 9...
a b c a b c a b d a b c a b d
a b c a b d Simbol pada posisi 0,...,4 telah dicocokkan. Perbandingan c - d pada posisi 5
menghasilkan ketidakcocokan. Pattern bisa digeser oleh 3 posisi, dan perbandingan yang kembali pada posisi 5.
Jarak pergeseran ditentukan oleh perbatasan terluas dari awalan pencocokan p. Dalam contoh ini , awalan pencocokan abcab , panjangnya j = 5. Perbatasan terluas
adalah ab lebar b = 2. Jarak shift j - b = 5-2 = 3. Pada tahap preprocessing, lebar perbatasan terluas setiap awalan dari pattern
ditentukan. Kemudian pada tahap pencarian, jarak pergeseran dapat dihitung sesuai dengan awalan yang cocok .
Teorema : Biarkan r, s menjadi perbatasan string x, di mana | r | | s |. Maka r adalah perbatasan s.
Bukti : Gambar 1 menunjukkan string x dengan batas r dan s. Karena r adalah awalan dari x, juga merupakan awalan yang tepat s, karena lebih pendek dari s. Tetapi r juga
merupakan akhiran x dan, oleh karena itu, akhiran yang tepat s. Dengan demikian r adalah perbatasan s
Gambar 4.1: Perbatasan r, s of a string x
Definisi: Misalkan x berupa string dan elemen A simbol . Sebuah r perbatasan x dapat diperpanjang oleh , jika ra adalah perbatasan xa .
Gambar 4.2. Perpanjangan Perbatasan
Gambar 4.2 menunjukkan bahwa r perbatasan j lebar x dapat diperpanjang oleh , jika xj = a .
Pada tahap preprocessing array b panjang m + 1 dihitung . Setiap entri b [ i ] berisi lebar perbatasan terluas awalan panjang i dari pattern
i = 0 , ... , m . Karena ε awalan panjang i = 0 tidak memiliki perbatasan , dan menetapkan b [ 0 ] = -1 .
Gambar 4.3 : Awalan panjang i dari pattern dengan perbatasan lebar b [ i ]
Asalkan nilai b [ 0 ], ... , b [ i ] sudah diketahui, nilai b [ i + 1 ] dihitung dengan memeriksa jika perbatasan p0 awalan ... pi - 1 dapat diperpanjang oleh simbol pi. Hal
ini terjadi jika pb [ i ] = pi Gambar 4.3 . Perbatasan untuk diperiksa diperoleh dalam urutan menurun dari nilai b [ i ], b [ b [ i ] ] dll
Algoritma preprocessing terdiri dari lingkaran dengan j variabel mengambil nilai-nilai ini. Sebuah perbatasan lebar j dapat diperpanjang oleh pi, jika pj = pi. Jika tidak,
perbatasan berikutnya terluas diperiksa dengan menetapkan j = b [ j ]. Loop berakhir paling lambat jika tidak ada batas dapat diperpanjang j = -1 .
Setelah meningkatkan j oleh pernyataan j++ dalam setiap kasus j adalah lebar perbatasan terluas dari p0 ... pi. Nilai ini ditulis untuk b[ i + 1 ] b [ i ] setelah
meningkat i dengan pernyataan i ++.
Proses Algoritma
void kmpPreprocess
{
int i=0, j=-1;
b[i]=j;
while im
{
while j=0 p[i]=p[j] j=b[j];
karakter berikutnya yang tidak cocok
i++; j++;
karakter berikutnya yang tidak cocok
b[i]=j; }
}
Contoh : Untuk pattern p = ababaa lebar dari perbatasan dalam array b memiliki nilai
berikut . Misalnya kita telah b [ 5 ] = 3 , karena ababa awalan panjang 5 memiliki perbatasan lebar 3
. j:
0 1 2 3 4 5 6 p[j]: a b a b a a
b[j]: -1 0 0 1 2 3 1
Secara konseptual , algoritma preprocessing di atas dapat diterapkan pada string pt bukan p . Jika sampai batas lebar m dihitung saja, maka perbatasan m lebar beberapa
awalan x pt sesuai dengan perbandingan dari pattern di t asalkan perbatasan tidak self- overlapping Gambar 4.4 .
Gambar 4.4 : Perbatasan Panjang m Dari Awalan x pt
Hal ini menjelaskan kesamaan antara algoritma preprocessing dan algoritma pencarian berikut .
Pencar
ian Algoritma
void kmpSearch
{
int i=0, j=0; while in
memindai teks dari kiri ke kanan {
while j=0 t[i]=p[j] j=b[j]; karakter berikutnya yang tidak cocok
i++; j++; karakter berikutnya yang tidak cocok
if j==m Apakah semua Pattern cocok?
{ reporti-j;
j=b[j]; }
} }
Keterangan : Ketika di saat loop ketidakcocokan pada posisi j terjadi ,perbatasan terluas dari awalan
pencocokan panjang j dari parttern dianggap Gambar 4.5. Melanjutkan perbandingan pada posisi b [j], lebar perbatasan, menghasilkan pergeseran dari pattern sehingga
perbatasan cocok. Jika lagi ketidakcocokan terjadi, perbatasan berikutnya terluas dianggap, dan seterusnya, sampai tidak ada batas kiri j = -1 atau simbol berikutnya
perbandingan. Kemudian kita memiliki awalan pencocokan baru dari pattern dan lanjutkan dengan while loop luar.
Gambar 4.5 : Pergeseran Pattern Ketika Ketidakcocokan Pada Posisi j Terjadi
Jika semua simbol m dari pattern telah dicocokkan jendela teks yang sesuai j = m, laporan fungsi disebut untuk melaporkan perbandingan di posisi ij. Setelah itu, pattern
digeser sejauh perbatasan terluas memungkinkan.
Pada contoh berikut perbandingan yang dilakukan oleh algoritma pencarian yang ditampilkan, di mana perbandingan diambil dalam warna hijau dan
ketidaksesuaian merah.
Contoh :
0 1 2 3 4 5 6 7 8 9 ... a b a b b a b a a
a b
a b
a c
a b a
b a c a
b a b a c a
b a
b a c
a b
a b a c
Contoh pada aplikasi pada kamus Komputer : Teks : FAST ETHERNET
Pattern : THER
Teks :
F A
S T
E T
H E
R N
E T
Pattern :
T H
E R
Langkah 1: F
A S
T E
T H
E R
N E
T
Pattern[1] tidak cocok dengan Teks[1], maka digeser satu langkah ke kanan.
Langkah 2: F
A S
T E
T H
E R
N E
T
Pattern[1] tidak cocok dengan Teks[2], maka digeser 1 karakter ke kanan.
Langakah 3: F
A S
T E
T H
E R
N E
T
Pattern[1] tidak cocok dengan Teks[3], maka Pettern digeser satu karakter ke kanan. Langkah 4:
F A
S T
E T
H E
R N
E T
T H
E R
T H
E R
T H
E R
T H
E R
Pattern[1] cocok dengan Teks[4], maka dilanjutkan membandingkan Pattern[2] dengan Teks[5].
Langkah 5: F
A S
T E
T H
E R
N E
T
Pattern[2] ternyata tidak cocok dengan Teks[5]. Maka Pencocokan selanjutnya dimulai lagi dari Pattern[1] dengan membandingkan Pattern[1] dengan Teks[6].
Langkah 6: F
A S
T E
T H
E R
N E
T
Pattern[1] cocok dengan Teks[6], maka Pattern tidak melakukan pergeseran dan selanjutnya membandingkan Pattern[2] dengan Teks[7].
Langkah 7: F
A S
T E
T H
E R
N E
T
Pattern[2] cocok dengan Teks[7], maka dilanjutkan membandingkan Pattern[3] dengan Teks[8].
Langkah 8: F
A S
T E
T H
E R
N E
T
Pattern[3] cocok dengan Teks[8], maka dilanjutkan membandingkan Pattern[4] dengan Teks[9].
T H
E R
T H
E R
T H
E R
T H
E R
Langkah 9: F
A S
T E
T H
E R
N E
T
Pattern[4] cocok dengan Teks[9], maka pencocokan berhenti karena Pattern yang dicari telah cocok dengan Teks sehingga terbentuk pattern kata di Teks sesuai dengan
Pattern. Pencocokan berhenti meskipun karakter dalam Teks belum habis. Berdasarkan contoh di atas maka dapat disimpulkan bahwa informasi yang digunakan
untuk melakukan pergeseran adalah berdasarkan hitungan ketidak cocokan Pattern dari kiri pada Teks.
Adapun potongan script pada Eclipse yang digunakan untuk algoritma KMP string matching sebagai berikut:
KMP.java package com.indah.kmp;
public class KMP { public int[] prekmpString pattern {
int[] next = new int[pattern.length]; int i=0, j=-1;
next[0]=-1;
while ipattern.length-1 { while j=0 pattern.charAti=pattern.charAtj
j = next[j]; i++;
j++; next[i] = j;
}
return next;
T H
E R
}
public int kmpString text, String pattern { int[] next = prekmppattern;
int i=0, j=0; while itext.length {
while j=0
text.charAti=pattern.charAtj j = next[j];
i++; j++;
if j==pattern.length return i-
pattern.length; }
return -1;
} }
Gambar 4.6 : Hasil Pencarian Menggunakan Algoritma Knuth Morris Pratt
4.2. Implementasi Sistem