Sesuai postingan tentang algoritma Turbo Boyer-Moore sebelumnya, kali ini kita akan membahas bagian koding dari algoritma ini. Nah berikut ini adalah koding dari algoritma Turbo Boyer-Moore dalam JAVA :
import java.util.ArrayList; import java.util.List; public class TBM { private int m; private int[] bmGs; private int[] bmBc; private char[] x; private static void preBmBc(char[] x, int[] bmBc) { int m = x.length; for (int i = 0; i < bmBc.length; i++) bmBc[i] = m; for (i = 0; i < m - 1; i++) bmBc[x[i]] = (m - i - 1); } private static void suffixes(char[] x, int[] suff) { int f = 0; int m = x.length; suff[(m - 1)] = m; int g = m - 1; for (int i = m - 2; i >= 0; i--) if ((i > g) && (suff[(i + m - 1 - f)] < i - g)) { suff[i] = suff[(i + m - 1 - f)]; } else { if (i < g) g = i; f = i; while ((g >= 0) && (x[g] == x[(g + m - 1 - f)])) g--; suff[i] = (f - g); } } private static void preBmGs(char[] x, int[] bmGs) { int m = x.length; int[] suff = new int[m]; suffixes(x, suff); for (int i = 0; i < m; i++) bmGs[i] = m; int j = 0; for (i = m - 1; i >= 0; i--) if (suff[i] == i + 1) for (; j < m - 1 - i; j++) if (bmGs[j] == m) bmGs[j] = (m - 1 - i); for (i = 0; i <= m - 2; i++) bmGs[(m - 1 - suff[i])] = (m - 1 - i); } public static ListfindAll(String pattern, String source) { char[] x = pattern.toCharArray(); char[] y = source.toCharArray(); int m = x.length; int n = y.length; List result = new ArrayList(); int[] bmGs = new int[m]; int[] bmBc = new int[65536]; preBmGs(x, bmGs); preBmBc(x, bmBc); int u; int j = u = 0; int shift = m; while (j <= n - m) { int i = m - 1; while ((i >= 0) && (x[i] == y[(i + j)])) { i--; if ((u != 0) && (i == m - 1 - shift)) i -= u; } if (i < 0) { result.add(Integer.valueOf(j)); shift = bmGs[0]; u = m - shift; } else { int v = m - 1 - i; int turboShift = u - v; int bcShift = bmBc[y[(i + j)]] - m + 1 + i; shift = Math.max(turboShift, bcShift); shift = Math.max(shift, bmGs[i]); if (shift == bmGs[i]) { u = Math.min(m - shift, v); } else { if (turboShift < bcShift) shift = Math.max(shift, u + 1); u = 0; } } j += shift; } return result; } public static TBM compile(String pattern) { char[] x = pattern.toCharArray(); int m = x.length; int[] bmGs = new int[m]; int[] bmBc = new int[65536]; preBmGs(x, bmGs); preBmBc(x, bmBc); TBM tbm = new TBM(); tbm.m = m; tbm.bmBc = bmBc; tbm.bmGs = bmGs; tbm.x = x; return tbm; } public List findAll(String source) { char[] y = source.toCharArray(); int n = y.length; List result = new ArrayList(); int u; int j = u = 0; int shift = this.m; while (j <= n - this.m) { int i = this.m - 1; while ((i >= 0) && (this.x[i] == y[(i + j)])) { i--; if ((u != 0) && (i == this.m - 1 - shift)) i -= u; } if (i < 0) { result.add(Integer.valueOf(j)); shift = this.bmGs[0]; u = this.m - shift; } else { int v = this.m - 1 - i; int turboShift = u - v; int bcShift = this.bmBc[y[(i + j)]] - this.m + 1 + i; shift = Math.max(turboShift, bcShift); shift = Math.max(shift, this.bmGs[i]); if (shift == this.bmGs[i]) { u = Math.min(this.m - shift, v); } else { if (turboShift < bcShift) shift = Math.max(shift, u + 1); u = 0; } } j += shift; } return result; } }
Untuk implementasinya dalam program, silahkan dicoba sendiri dirumah masing-masing.
Enjoy.. (^_^)v
4 Komentar
MAKASIH UDA, la ngomen ambo kan..
ReplySip, terima kasih banyak uni...
ReplyKapan-kapan boleh kembali lagi...
Makasih banyak gan (y)
Replyane jadi punya referensi yang jelas ni :*
ane pelajari dulu ni source codenya (y)
sekali lagi, makasi banyak ya (y)
tolong dong kasih ref hitungan manualnya atu contoh kasus penyelesaian TBM
ReplyPost a Comment