c.
Kategori  ketiga  yaitu  pencocokan  dari  dua  arah  yang  telah  ditentukan  oleh  tiap algoritma  tertentu.  Salah  satunya  seperti  yang  diterapkan  oleh  Galil-Seiferas  dan
Crochemore-Perrin  dalam  algoritma  Two  Way,  mereka  membagi  pattern  y  menjadi dua bagian yaitu
y = y
1
y
2
. Seperti yang dapat kita lihat pada Gambar 2.4, pertama kali, pencarian  terjadi  pada  y
2
yang  dilakukan  dari  karakter  paling  kiri  ke  kanan,  apabila selama pencarian pertama tidak terjadi
ketidakcocokan atau pattern y
2
cocok dengan
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 Pattern y
2
Dimulai dari Karakter Paling Kiri
Gambar 2.5 Pencocokan Pattern y
1
Dimulai dari Karakter Paling Kanan
2.3. Algoritma Galil-Seiferas
Algoritma  Galil-Seiferas  merupakan  algoritma  yang  menggunakan  konstanta  k  oleh Galil  dan  Seiferas  dinyatakan  bernilai  4.  Fungsi  reach  jangkauan  untuk  0
≤ i m sebagai berikut:
i = i + max {i ≤ m - i: x [0 .. i ] = x [i +1 .. i + i +1]}.
Sebuah  awalan x [0  .. p]  dengan  x   adalah  periode  awalan  jika  dasar  dan  mencapai p
≥ kp.  Tahap  preprocessing  pada  algoritma  ini  berguna  untuk  mendapatkan dekomposisi uv  dari P yang mana v memiliki paling banyak satu periode awalan dan
| u |  = Ο per v,  proses  dekomposisi  dinamakan  perfect  factorization.  Pada  tahap
Universitas Sumatera Utara
searching  dilakukan  pencarian  pada  teks  T  untuk  menemukan  setiap  v  dan    ketika ditemukan  akan  dilanjutkan  dengan  pencarian  terhadap u tepat disebelahnya pada
T. Charras. 1997. Implementasi
dalam fase
preprocessing fungsi newP1, newP2 dan mengurai adalah
untuk menemukan
uv faktorisasi sempurna  x  dimana  u  =  x[0....s-1]  dan  v  =  x[s....m-1]. Fungsi newP1 menemukan
periode  awalan  terpendek  x[s...m-1].  Fungsi  newP2  menemukan  periode  awalan terpendek  kedua  dari  x[s...m-1]  dan  fungsi  parse  terhadap  s.    Sebelum  memanggil
fungsi  pencarian kita memiliki: a.
x[s...m-1] memiliki paling banyak satu periode awalan; b.
Jika x[s...m-1] tidak memiliki masa awalan, maka panjangnya adalah p
1
; c.
x[s...s+p
1
+q
1
-1] memiliki periode terpendek panjang p
1
; d.
x[s...s+p
1
+q
1
] tidak memiliki periode panjang p
1
;
Gambar 2.6 Faktorisasi Sempurna x
Pola  x  adalah  dari  bentuk  x[0...s-1]  x[s...m-1]  dimana  x[s...m-1]  adalah  dari bentuk  z
z’ z” dengan z dasar, |z|=p
1
.z’ awalan z, z’ tidak awalan z dan  | z   z | = p
1
+q
1
. Pada  Gambar  2.4  terlihat  bahwa  ketika  mencari  x[s...m-1]  di  y,  jika
x[s...s+p
1
+q
1
-1]  telah  dicocokkan  pergeseran  panjang  p
1
dapat  dilakukan  dan perbandingan  yang  dilanjutkan  dengan  x[s+q
1
].  Sebaliknya  jika  terjadi ketidakcocokan  dengan  x[s+q]  dengan  q
≠  p
1
+  q
1
maka  pergeseran  panjang  qk
1
dapat dilakukan dan perbandingan yang dilanjutkan dengan x[0]. Hal ini memberikan jumlah linier keseluruhan perbandingan karakter teks.
Tahap  preprocessing  dari  algoritma  Galil-Seiferas  di Οm  waktu  dan
kompleksitas  ruang  konstan.  Fase  pencarian  di Οn  kompleksitas  waktu.  Paling
banyak 5n perbandingan karakter teks dapat dilakukan selama fase ini. Charras. 1997.
Universitas Sumatera Utara
Program dalam Bahasa C
char x, y; int k, m, n, p, p1, p2, q, q1, q2, s;
void search {
while p = n - m { while p + s + q  n  x[s + q] == y[p + s + q]
++q; if q == m - s  memcmpx, y + p, s + 1 == 0
OUTPUTp; if q == p1 + q1 {
p += p1; q -= p1;
} else {
p += qk + 1; q = 0;
} }
} void parse {
while 1 { while x[s + q1] == x[s + p1 + q1]
++q1; while p1 + q1 = kp1 {
s += p1; q1 -= p1;
} p1 += q1k + 1;
q1 = 0; if p1 = p2
break; }
newP1; }
void newP2 { while x[s + q2] == x[s + p2 + q2]  p2 + q2  kp2
++q2; if p2 + q2 == kp2
parse; else
if s + p2 + q2 == m search;
else { if q2 == p1 + q1 {
p2 += p1; q2 -= p1;
} else {
p2 += q2k + 1; q2 = 0;
} newP2;
} }
Universitas Sumatera Utara
void newP1 { while x[s + q1] == x[s + p1 + q1]
++q1; if p1 + q1 = kp1 {
p2 = q1; q2 = 0;
newP2; }
else { if s + p1 + q1 == m
search; else {
p1 += q1k + 1; q1 = 0;
newP1; }
} }
void GSchar argX, int argM, char argY, int argN { x = argX;
m = argM; y = argY;
n = argN; k = 4;
p = q = s = q1 = p2 = q2 = 0; p1 = 1;
newP1;
}
Contoh :
Fase Pre-Processing P= 0, q = 0, s = 0, p 1 = 7, q 1 = 1
Fase Searching Algoritma Galil - Seiferas melakukan 24 perbandingan karakter
Universitas Sumatera Utara
Universitas Sumatera Utara
Gambar 2.7  Fase Pencarian dengan Algoritma Galil-Seiferas.
2.4. Algoritma Not So Naϊve