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 KR (Karpa-Rabina) - Implementacja w Java
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 16 listopada 2006 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.

KR.java:
//www.algorytm.org
//Algorytm KR (Karpa-Rabina) - wyszukiwanie wzorca
//(c)2006 Tomasz Lubiński

public class KR {
	
	private static final int r=256;   //liczba symboli alfabetu (char 0-255)
	private static final int q=9551;  //możliwie duża liczba pierwsza	

	public static int power_modulo_fast(int a, int b, int m) {
		   int i;
		   int result = 1;
		   long x = a%m;

		   for (i=1; i<=b; i<<=1) {
		      x %= m;
		      if ((b&i) != 0) {
		         result *= x;
		         result %= m;
		      }
		      x *= x;
		   }

		   return result%m;
		}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int m,n,i,j,h1,h2,rm;
		String tekst;
		String wzorzec;

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

		n=tekst.length();
		m=wzorzec.length();
		h2=0; 
		h1=0;
		System.out.println("Indeksy poczatkow wzorca w tekscie");

//		algorytm Hornera do obliczenia funkcji haszujacej h(tekst[1..m])
		for (i=0; i<m; i++)
		{
		   h2=((h2*r) + tekst.charAt(i));
		   h2%=q;
		}
//		algorytm Hornera do obliczenia funkcji haszujacej h(wzorzec)
		for (i=0; i<m; i++)
		{
		   h1=((h1*r) + wzorzec.charAt(i));
		   h1%=q;
		}

//		Algorytm KR (Karpa-Rabina) 
		rm=power_modulo_fast(r, m-1, q);
		i=0;
		while (i<n-m)
		{
			j=0;
			if (h1==h2) while ((j<m)&&(wzorzec.charAt(j)==tekst.charAt(i+j))) j++;
			if (j==m) System.out.println(i+1);
			h2=((h2-tekst.charAt(i)*rm)*r+tekst.charAt(i+m));
		        h2%=q;
		        if (h2<0) h2+=q;
			i++;
		}
		j=0;
		if (h1==h2) while ((j<m)&&(wzorzec.charAt(j)==tekst.charAt(i+j))) j++;
		if (j==m) System.out.println(i+1);
	}

}
Dodaj komentarz