algorytm KMP

S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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

Kopiuj
 
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. :)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Po kiego masz: , int *ilosc) ?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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?

n0name_l
Ty pisales ten kod powyzej?
_13th_Dragon
Ten post dobitnie świadczy o tym że nie powinieneś zaliczyć przedmiotu.
S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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.

_13th_Dragon
Więc tobie odpowiedziałem, zauważ że @n0name_l nie zareagował na mój most, zaś zareagował na twoją odpowiedź, więc zastanów się po kiego ta *ilosc
S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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.

_13th_Dragon
Zacznij uczyć się od jakichś prostszych rzeczy, to zadanie ciebie przerasta, nie rozumiesz podstaw. Aczkolwiek ... weź odpal tą funkcje a potem wyświetl na ekranie to co ona zwróciła, może zrozumiesz.
S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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.

_13th_Dragon
To podaj tu obie wersje kiedy "z tym parametrem ilość" oraz "jak go pominę"
S2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
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.

Kopiuj
 
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:

Kopiuj
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.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Pewnie niepoprawnie wypełniasz tablicę next


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.