algorytm KMP

0

Witam wszystkim.
Mam problem z napisaniem takiej funkcji:
"napisz funkcję, która znajduje wszystkie wzorce występujące w tekście, zwraca wskaźnik do tablicy indeksów (wewnątrz funkcji dynamiczna rezerwacja pamięci dla tablicy indeksów) oraz udostępnia ich ilość przez wskaźnik:
int *KMP_w(char *tekst, char *wzor, int *next, int *ilosc);

z funkcją wyszukującą wzorzec w tekście sobie poradziłem ale mam problem ze zliczeniem ilości wzorów i przekazania tego do tablicy itd.
Oto co mam

 
int *KMP_w (char *tekst, char *wzor, int *next, int *ilosc)
{
	int k=0;      //zmienna rozmiaru tablicy
	int *tab = NULL;    //tablica przechowujaca indeksy
	int n,m;    //zmienna dlugosci tekstu i wzorca
        int i,j;      // i -indeks tekstu,  j-indeks wzorca

	n=dlugosc (tekst);     //funkcja zliczajaca dlugosc (wiem że można użyć strlen, ale takie miałem zadanie)
	m=dlugosc (wzor);
	for (i=0,j=0;i<n && j<m;i++,j++)  
	{
		while ((j>0) && (tekst[i] != wzor [j]))
			j=next[j];

		if (j==m-1)
		{
			tab=(int*)realloc(tab,(k+1)*sizeof(int));
			tab[k]=i-m+1;
			k++;
			i=i-m+1;
			j=-1;
		}
	}                                             

	return tab;
}

wydaje mi się że brakuje mi czegoś na końcu żeby w tej tablicy się zgadzało wszystko, ale nie wiem jak to ugryźć.
Z góry dzięki za wskazówki. :)

0

Po kiego masz: , int *ilosc) ?

0

Szczerze? Sam nie mam pojęcia po co.. podałem treść zadania jakie dostałem i nie wiem jak to rozgryść.. ale możemy założyć że tego ilość nam nie trzeba, wywalamy to z funkcji i co dalej?

0

Tak pisalem ten kod na,zajęciach i kozystalem z materiałów udostępnionych przez prowadzącego i on tez sprawdzał to, ale braklo czasu pod koniec i nie dokończyłem i dlatego nie wiem co jest źle.
ps. Do zaliczenia mam jeszcze parę miesięcy i chce sie czegoś nauczyć, dlatego pytam.

0

Dobra inaczej. Myśle, że do tej zmiennej ilosc powinienem przekazać ilość tych wystąpień wzorca, ale skoro moja funkcja ma to policzyć dopiero więc nie rozumiem po co mam ją mieć w nagłówku.

0

Jeśli używam z tym parametrem ilość to mi nie działa w ogóle, jak go pominę to mi wyświetla bzdury.

Robie wiele innych zadań łatwiejszych i idzie jakoś, a to zadanie jest dla mnie cięzkie i to się zgadza, ale prowadzący narzuca duży poziom i mało kto sobie poradził z tym jak na razie.

0

Po paru dniach odkopuje temat ;) troche nad tym posiedziałem i teoretycznie doszedłem do rozwiązania, a przynajmniej do tego czego chciałem.

 
int *KMP_w (char *tekst, char *wzor, int *next, int *ilosc)
{
	int k=0;      //zmienna rozmiaru tablicy
	int *tab = NULL;    //tablica przechowujaca indeksy
	int n,m,j,i;    //zmienna dlugosci tekstu i wzorca

	n=dlugosc (tekst);
	m=dlugosc (wzor);
	for (i=0,j=0;i<n && j<m;i++,j++)  
	{

		while ((j>0) && (tekst[i] != wzor [j]))
			j=next[j];

		if (j==m-1)
		{
			tab=(int*)realloc(tab,(k+1)*sizeof(int));
			tab[k]=i-m+1;
			k++;
			i=i-m+1;
			j=-1;
		}
	}
		*ilosc=k;
	return tab;
}

i w mainie wywołanie np:

int *tab;
int *ilosc;
//reszta kodu
tab = KMP_w(tekst, wzor, next,&ilosc);
	printf ("Ilosc wystapien wzorca w tekscie: %d \n",ilosc);
	for (j=0;j<ilosc;++j)
		printf ("Indeks tablicy %d \n",tab[j]);
 

Z wyznacznikami sobie poradziłem niejako, ale sam algorytm ma gdzieś błąd w implementacji bo czasami mi wyświetla dobre wyniki, ale gdy dostanie bardziej złożone zadanie np: "ala ma kota i kot ma ale" i jako wzorzec "ma" to potrafi wziąc pod uwage samo "a" w tekście.

0

Pewnie niepoprawnie wypełniasz tablicę next

1 użytkowników online, w tym zalogowanych: 0, gości: 1