InsertionSort( A )
Gambar 2. Setelah penyisipan Dimana A adalah sebuah array A[1...n]
Berikut ini adalah langkah – langkah yang Sebagai contoh, dilakukan pencarian pola P =
dilakukan algoritma KMP dalam proses “abcaby” pada teks T = “abxabcabcaby”. Namun
pencocokkan string yaitu : sebelumnya dilakukan pengisian array prefix yang
1. Masukkan Query kata yang akan dicari. Dengan berfungsi untuk mempermudah proses
permisalan P = Pattern atau pola susunan kata pencocokkan. Pengisian array prefix ini dilakukan
yang dijadikan sebagai contoh atau pola teks pada fungsi Prefix.
yang akan dicari T = Teks atau judul dokumen Fungsi prefix
2. Algoritma KMP mulai mencocokkan pattern
atau pola susunan kata yang dijadikan sebagai i 0 1 2 3 4 5
contoh pada awal teks. Pola (i) a b c a b y
3. Dari kiri ke kanan, algoritma ini akan Prefix(i) 0 0 0 1 2 0
mencocokkan karakter per karakter pattern atau
pola yang dijadikan sebagai contoh dengan Gambar 4. Iterasi pada Fungsi Prefix
karakter di teks yang bersesuaian, sampai salah
satu kondisi berikut dipenuhi : Fungsi prefix bekerja mengisi informasi
- Karakter di pattern atau pola susunan kata panjang karakter terpanjang yang menjadi awalan
yang dijadikan sebagai contoh dan di teks dan akhiran pada pola P. Anggap bahwa array
yang dibandingkan tidak cocok (mismatch). prefix adalah π. Nilai π[0] akan bernilai 0 karena
- Semua karakter di pattern atau pola susunan pada karakter pertama tidak ada yang menjadi
kata yang dijadikan sebagai contoh cocok. awalan dan akhiran. Pertama, untuk mengisi π[1]
Kemudian algoritma akan memberitahukan dilakukan pencocokkan karakter pada j=0 dan i=1.
penemuan di posisi ini Karena karakter ‘a’ dan ‘b’ mismatch, nilai dari
4. Algoritma kemudian menggeser pattern atau π[1] = 0. Kedua, dilakukan k inkremen pada i
pola susunan kata yang dijadikan sebagai sehingga i=2. Dilakukan pencocokkan pada
contoh berdasarkan tabel next, lalu mengulangi karakter ke j=0 dan i=2, sehingga nilai π[2] = 0.
langkah no. 2 sampai pattern atau pola susunan Inkremen pada i sehingga i=3. Karakter j=0 dan i=3
kata yang dijadikan sebagai contoh berada di match, sehingga nilai π[3] adalah j+1 yaitu π[3] =
ujung teks 1. Selanjutnya karakter j=1 dan i=4 match, nilai
π[4] = 2. Terakhir karakter j=2 dan i=5 mismatch,
Seperti yang telah disebutkan sebelumnya, dilakukan pengurangan nilai j sebesar 1 sehingga
algoritma ini memiliki dua komponen penting yaitu j=1. Tukar nilai j dengan nilai π[j], menjadi j=0,
fungsi prefix dan fungsi KMP. Kedua fungsi ini lakukan pengecekan apakah karakter j=0 dan i=5
memiliki banyak kesamaan, karena keduanya match, karena mismatch maka π[5] = 0.
mencocokkan string dengan pola P. Fungsi prefix
mencocokkan P dengan P sendiri, sedangkan fungsi Fungsi KMP
KMP mencocokkan P dengan T, dimana T
merupakan sebuah teks. i 0 1 2 3 4 5 6 7 8 9 10 11
Teks a b x a b c a b c a b y
Prefix Function(P)
Fase 1 a b c a b y
1. m = P.length
2. let π [1…m] be a new array Fase 2 a b c a b y
3. π [1] = 0 Fase 3 a b c a b y
4. k = 0
5. for q = 2 to m Gambar 5. Iterasi pada Fungsi KMP
6. while k > 0 and P[k+1] ≠ P[q]
7. k = π[k] Fungsi KMP akan melakukan pencocokan
8. if P[k + 1] == P[q] terhadap teks T dengan pola P. Pada fase pertama
9. k = k + 1
10. π [q] = k terjadi mismatch pada P[i] dimana i=2 dan T[2],
11. Return π dapatkan informasi dari π[i-1] = 0. Cek kecocokan
antara P[0] dan T[i] jika mismatch lakukan
inkremen pada i. Fase kedua mismatch terjadi pada III. Implementasi
P[5] dan T[8], shift ke kiri sebanyak satu sehinga
P[4] dapatkan nilai π[4]=2, ubah indeks P[2], Pada paper ini, pengujian algoritma insertion
lakukan pengecekan antara T[8] dan P[2] dan sort dan KMP diimplementasikan menggunakan
seterusnya sampai batas pola P. Dari Gambar 4 bahasa pemrograman C++. Di dalam pengujian
dapat diketahui bahwa jika terjadi mismatch, penulis menggunakan hardware dengan spesifikasi
pergeseran dilakukan ke karakter atau kumpulan sebagai berikut:
karakter selanjutnya. Processor Intel(R) Celeron(R) CPU
Fungsi prefix akan membutuhkan waktu sebesar B820 @ 1.70GHz
O(m), sedangkan pencarian pola pada teks atau RAM 4096MB
string membutuhkan waktu O(n), sehingga Sistem Operasi Windows 7 Professional 32-
kompleksitas waktu algoritma KMP adalah bit
O(m+n) dan membutuhkan space sebesar O(m). Tabel 1. Spesifikai Hardware untuk Pengujian
Dalam penyelesaian string matching
menggunakan algoritma KMP akan menghasilkan Source Code Algoritma Insertion Sort
best case, worst case dan average case sebagai
1. void insertion_sort (int A[]) {
berikut: 2. int length = sizeof(A)/sizeof(int);
3. for (int j = 2; j < length; j++) {
Best Case
4. int key = A[j];
Kompleksitas terbaik dari algoritma ini 5. int i = j - 1;
6. while (i > 0 && A[i] > key) {
dinotasikan dengan O(m+n). Hal ini akan terjadi 7. A[i+1] = A[i];
ketika pattern sama dengan karakter teks yang 8. i--;
dicocokkan. 9. }
10. A[i+1] = key;
Worst Case 11. }
12. }
Kompleksitas terburuk dari algoritma ini
dinotasikan dengan O(m*n). kasus terburuk terjadi Source Code Algoritma KMP
apabila terdapat pattern tidak pernah sama dengan
teks yang dicocokkan. 1. void prefix (string p) {
2. int m = p.length();
Misal dengan menggunakan pola “aaaa” 3. pi[0] = 0;
diterapkan pada "aaabcaaabce". Untuk pola ini 4. pi[1] = 0;
array π adalah: | 0 | 1 | 2 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 0 | 5. int k = 0;
Perhatikan bahwa pada indeks 3, ketika 6. for (int q = 2; q < m; q++) {
7. while (k != 0 && p[k] != p[q-1])
ketidakcocokan terjadi, dan pada indeks tersebut 8. k = pi[k];
bernilai 0 yang artinya ketidaksesuaian terjadi. 9. if (p[k] == p[q-1])
Berdasarkan hasil diatas, ketidaksesuaian dapat 10. k = k + 1;
11. pi[q] = k;
dilakukan paling banyak 2 kali, atau dengan kata 12. }
lain, kita hanya dapat melakukan banyak 13. }
ketidaksesuaian sebagai jumlah karakter cocok 14.
15. bool kmp (string p, string t) {
sejauh ini. 16. int n = t.length();
Jadi setiap kali ketidakcocokan terjadi pada 17. int m = p.length();
indeks i, jumlah maksimum ketidaksesuaian pada 18. prefix(p);
19. int q = 0;
indeks i dapat terjadi paling banyak sama dengn
20. for (int i = 1; i < n; i++) {
jumlah karakter yang cocok sejauh ini. (pada 21. while (q > 0 && p[q] != t[i])
indeks i-1). 22. q = pi[q];
23. if (p[q] == t[i])
24. if (++q == m)
Average Case 25. return true;
Kompleksitas rata-rata dari algoritma ini 26. }
27. return false;
dinotasikan dengan O(n). Kasus rata - rata terjadi 28. }
apabila jumlah iterasi = jumlah perbandingan yang
sukses + jumlah perbandingan yang gagal.
t (Waktu)
0.015
pengujian kedua algoritma dapat dilihat pada tabel 0.01
0.005
berikut ini: 0
10 100 1000 10000 10000
t
No n T (Teks)
Best Case Worst Case
1. 10 0.0000 ms 0.0000 ms
2. 100 0.0000 ms 0.0000 ms Best Case Worst Case
3. 1000 0.0000 ms 0.0000 ms
4. 10000 0.0000 ms 0.0003 ms Grafik 2. Kompleksitas KMP (Pengujian Pertama)
5. 100000 0.0000 ms 0.0011 ms
6. 200000 0.0000 ms 0.0030 ms
7. 300000 0.0000 ms 0.0050 ms Grafik KMP
Tabel 2. Hasil Pengujian Algoritma Insertion Sort
0.02
t (Waktu)
0.015
t
No T P 0.01
Best Case Worst Case 0.005
1. 10 10 0.0000 ms 0.0000 ms 0
2. 100 10 0.0000 ms 0.0000 ms 10 100 1000 10000
V. Referensi
[1] Cormen, Thomas H, dkk. 2009. Introduction
to Algorithms Third Edition. London: MIT
Press.
[2] Lamhot Sitorus. Algoritma dan
Pemrograman. : Penerbit Andi
[3] Fanani, Ikhsan. 2007. Penggunaan “Big O
Notation” untuk Menganalisa Efisiensi
Algoritma. Bandung : ITB.
[4] Erzandi, Muhammad O. 2007. Algoritma
Pengurutan dalam pemrograman.Bandung :
ITB.
[5] Saptadi, Hendra dan Sari, Desi W. 2012.
Analisi Algoritma Insertion Sort, Merge Sort
dan Implementasinya dalam Bahasa
Pemrograman C++. Palembang : Universitas
Sriwijaya.
[6] Harry Octavianus Purba.2016.Algortima
String Matching Pada Mesin Pencarian.
Bandung: Sekolah Teknik Elektro dan
Informatika.
[7] Budiarsyah, Dibi K. 2013. “Analisis
Kompleksitas Waktu Untuk Beberapa
Algoritma Pengurutan”. Bandung : Institut
Teknologi Bandung.
[8] Y. A. S. Gahayu Handari Ekaputri, Aplikasi
Algoritma Pencarian String Knuth-Morris-
Pratt, pp. 2-3, July 2006.
[9] B. Tjaru, Setia N. 2010. Kompleksitas
Algoritma Pengurutan Selection Sort dan
Insertion Sort. Bandung : Institut Teknologi
Bandung.