algorytm.org

Implementacja w Java



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm BM (Boyer-Moore'a) - Implementacja w Java
Ocena użytkownikóww: *****  / 3
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 23 marca 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

BM.java:
// Algorytm Boyer-Moore
// Tomasz Lubinski (c) 2007
// www.algorytm.org

public class BM {

	private final static int ASIZE = 255;
	private static int bad_character_shift[] = new int[ASIZE];
	private static int good_suffix_shift[];
	private static int suff[];

	//prepare bad character shift table
	private static void pre_bad_character_shift(String pattern)
	{
	   int m = pattern.length();

	   for (int i = 0; i < ASIZE; i++)
	   {
	      bad_character_shift[i] = m;
	   }

	   for (int i = 0; i < m - 1; ++i)
	   {
	      bad_character_shift[pattern.charAt(i)] = m - i - 1;
	   }
	}

	//prepare suff table
	private static void pre_suff(String pattern)
	{
	   int j;
	   int m = pattern.length();
	   suff = new int[m];

	   suff[m - 1] = m;
	   for (int i = m - 2; i >= 0; --i) {
	      for (j = 0; j <= i && pattern.charAt(i-j) == pattern.charAt(m-j-1); j++);
	      suff[i] = j;
	   }

	}

	//prepare good_suffix_shift table
	private static void pre_good_suffix_shift(String pattern)
	{
	   int j = 0;
	   int m = pattern.length();
	   good_suffix_shift = new int[m];

	   pre_suff(pattern);

	   for (int i = 0; i < m; i++)
	   {
	      good_suffix_shift[i] = m;
	   }

	   j = 0;
	   for (int i = m - 1; i >= 0; --i)
	   {
	      if (suff[i] == i + 1)
	      {
	         for (; j < m - 1 - i; ++j)
	         {
	            good_suffix_shift[j] = m - 1 - i;
	         }
	      }
	   }

	   for (int i = 0; i <= m - 2; ++i)
	   {
	      good_suffix_shift[m - 1 - suff[i]] = m - 1 - i;
	   }
	}

	//Boyer-Moore algorithm
	private static void BM_alg(String text, String pattern)
	{
	   int i, j;
	   int m = pattern.length();
	   int n = text.length();

	   pre_bad_character_shift(pattern);
	   pre_good_suffix_shift(pattern);

	   j = 0;
	   while (j <= n - m) {
	      for (i = m - 1; i >= 0 && pattern.charAt(i) == text.charAt(i + j); --i);
	      if (i < 0) {
	         System.out.print(j + " ");
	         j += good_suffix_shift[0];
	      }
	      else
	         j += Math.max(good_suffix_shift[i], bad_character_shift[text.charAt(i + j)] - m + 1 + i);
	   }
	}

	//Get data
	public static void main(String[] args) {
		   String pattern;
		   String text;

		   System.out.println("Podaj tekst");
		   text = Console.readString();

		   System.out.println("Podaj wzorzec");
		   pattern = Console.readString();

		   BM_alg(text, pattern);	
	}

}
Dodaj komentarz