Advertisement
gewur33

BoyerMoore

Oct 31st, 2014
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.17 KB | None | 0 0
  1. package patternMatching;
  2.  
  3.    
  4.      // Liest zwei String ein - den Pattern und den zu durchsucheden Text
  5.      //  sucht im Text nach dem Pattern indem es die
  6.      //  bad-character rule des BoyerMoore Algorithmus verwendet
  7.      //  (nicht bad-suffix-rule)
  8.  
  9.  
  10.     public class BoyerMoore {
  11.         private final int R;     // rechts
  12.         private int[] right;     // das bad-character skip array
  13.  
  14.         private char[] pattern;  // pattern to charArray
  15.         private String pat;      // or as a string
  16.  
  17.         // pattern als string
  18.         public BoyerMoore(String pat) {
  19.             this.R = 256;
  20.             this.pat = pat;
  21.  
  22.             // rechteste position von C im pattern
  23.             right = new int[R];
  24.             for (int c = 0; c < R; c++)
  25.                 right[c] = -1;
  26.             for (int j = 0; j < pat.length(); j++)
  27.                 right[pat.charAt(j)] = j;
  28.         }
  29.  
  30.         // pattern als charArray
  31.         public BoyerMoore(char[] pattern, int R) {
  32.             this.R = R;
  33.             this.pattern = new char[pattern.length];
  34.             for (int j = 0; j < pattern.length; j++)
  35.                 this.pattern[j] = pattern[j];
  36.  
  37.             // rechteste position von C im pattern
  38.             right = new int[R];
  39.             for (int c = 0; c < R; c++)
  40.                 right[c] = -1;
  41.             for (int j = 0; j < pattern.length; j++)
  42.                 right[pattern[j]] = j;
  43.         }
  44.  
  45.         // return offset des ersten treffers, N falls kein treffer
  46.         public int search(String txt) {
  47.             int M = pat.length();
  48.             int N = txt.length();
  49.             int skip;
  50.             for (int i = 0; i <= N - M; i += skip) {
  51.                 skip = 0;
  52.                 for (int j = M-1; j >= 0; j--) {
  53.                     if (pat.charAt(j) != txt.charAt(i+j)) {
  54.                         skip = Math.max(1, j - right[txt.charAt(i+j)]);
  55.                         break;
  56.                     }
  57.                 }
  58.                 if (skip == 0) return i;    // found
  59.             }
  60.             return N;                       // not found
  61.         }
  62.  
  63.  
  64.         // return offset des ersten treffers, N falls kein treffer
  65.         public int search(char[] text) {
  66.             int M = pattern.length;
  67.             int N = text.length;
  68.             int skip;
  69.             for (int i = 0; i <= N - M; i += skip) {
  70.                 skip = 0;
  71.                 for (int j = M-1; j >= 0; j--) {
  72.                     if (pattern[j] != text[i+j]) {
  73.                         skip = Math.max(1, j - right[text[i+j]]);
  74.                         break;
  75.                     }
  76.                 }
  77.                 if (skip == 0) return i;    // found
  78.             }
  79.             return N;                       // not found
  80.         }
  81.  
  82.  
  83.  
  84.         // test it!
  85.         public static void main(String[] args) {
  86.             String pat = args[0];
  87.             String txt = args[1];
  88.             char[] pattern = pat.toCharArray();
  89.             char[] text    = txt.toCharArray();
  90.  
  91.             BoyerMoore boyermoore1 = new BoyerMoore(pat);
  92.             BoyerMoore boyermoore2 = new BoyerMoore(pattern, 256);
  93.             int offset1 = boyermoore1.search(txt);
  94.             int offset2 = boyermoore2.search(text);
  95.  
  96.             // print results
  97.             System.out.println("text:    " + txt);
  98.  
  99.             System.out.print("pattern: ");
  100.             for (int i = 0; i < offset1; i++)
  101.                 System.out.print(" ");
  102.             System.out.println(pat);
  103.  
  104.             System.out.print("pattern: ");
  105.             for (int i = 0; i < offset2; i++)
  106.                 System.out.print(" ");
  107.             System.out.println(pat);
  108.         }
  109.     }
  110.  
  111.  
  112.  
  113.     /*
  114.     // je weiter hinten der mismatch, desto weite springt man
  115.     // 3 fälle
  116.     // wenn wir einen mismatch haben -> beweg dich i text soundso weiter
  117.     // worstcase: immer nur um 1 springen! z.b. pattern = 1,
  118.  
  119.    
  120.     public void runSearch(String text, String pattern) {
  121.         int i = pattern.length(); //?? TODO
  122.         int j = pattern.length();
  123.        
  124.         while (i <= text.length() && j > 0) {
  125.             if (text.charAt(i-1) == pattern.charAt(j-1)) { // pattern ganz vorne
  126.                 i--; j--;
  127.             } else { //TODO
  128.                 if ((s+1) > i + shifter.charAt(text.charAt(i))) {
  129.                     i = s + 1;
  130.                 } else {
  131.                     i = i + shifter();
  132.                 }
  133.                 if () {//TODO 3. schritt
  134.                     //je weiter der abstand vom hinteren ende, desto weiter können wir vor gehen
  135.                    
  136.                 }
  137.                 i+= pattern.length();
  138.                 i+=abstand;
  139.                 i+=1;
  140.             }
  141.         }
  142.     }
  143.     */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement