Instrukcja IEF Algorytmy i struktury danych - prz
Transkrypt
Instrukcja IEF Algorytmy i struktury danych - prz
Instrukcja IEF Algorytmy i struktury danych Laboratorium 1: ”Przeszukiwanie tekstów”. 1. Wstęp. Algorytmy przeszukiwania wzorca w tekście służą do odnajdywania w zadanym tekście określonego ciągu znaków. Ciąg ten może oczywiście występować więcej, niż jeden raz. Możliwe jest również, że poszukiwany ciąg nie występuje w tekście. W opisie algorytmów zakłada się, że tekst i wzorzec są jednowymiarowymi tablicami znaków, indeksowanymi od zera. 2. Informacje wstępne z języka C: • • • • deklaracja łańcucha: char nazwa[rozmiar]; wczytanie łańcucha: gets(nazwa); fgets(nazwa,rozmiar,stdin); scanf(”%(rozmiar-1)[^\n]s”,nazwa); instrukcja warunkowa: if(warunek) instrukcja1; else instrukcja2; instrukcja pętli: while(warunek) instrukcja; for(wyrażenie1;wyrażenie2;wyrażenie3) instrukcja; przykład przeglądania łańcucha znaków: i=0; while(nazwa[i]!=’\0’) { instrukcja; i++; } for(i=0;nazwa[i]!=’\0’;i++) instrukcja; 3. Opis algorytmu naiwnego – brute force Algorytm ten jest najprostszą metodą na znalezienie wzorca w tekście. Zasada działania opiera się na porównywaniu odpowiednich liter tekstu i wzorca, zaczynając od pierwszej litery tekstu i wzorca. Jeśli fragmenty tekstu i wzorca są zgodne, porównywany jest następny znak tekstu z następnym znakiem wzorca itd. Jeśli wystąpiła niezgodność w dowolnym miejscu – algorytm rozpoczyna całą procedurę przeszukiwania od drugiego znaku tekstu i pierwszego znaku wzorca. Jeśli zostanie znaleziony cały szukany wzorzec, algorytm może zakończyć przeszukiwanie lub rozpocząć je od następnego znaku (tj. wzorzec jest „przesuwany” o jeden znak). Złożoność obliczeniowa w najgorszym przypadku wynosi O(N*M), gdzie N jest długością tekstu, M – długością wzorca. Przykład: tekst: ZZXZZY wzorzec: ZZY Iteracja 1 ↓ ↓ ↓ tekst Z Z X wzorzec Z Z Y ↑ ↑ ↑ ↓ ↓ Z Z Z Y X Z Z Y Z Z Y ↑ ↑ Y Iteracja 2 tekst Z wzorzec Iteracja 3 ↓ tekst Z Z wzorzec X Z Z Z Z Y ↓ ↓ ↓ Z Z Y Z Z Y ↑ ↑ ↑ ↑ Iteracja 4 tekst wzorzec Z Z X Znaleziono rozwiązanie: Wzorzec zaczyna się od indeksu 3. 4. Zadania do wykonania: Proszę napisać: • funkcję, która znajduje długość łańcucha: int długosc(char*lan); • funkcję, która sprawdza, czy dany wzorzec wystąpił w tekście. Jeśli tak, to zwraca indeks od którego zaczyna się wzorzec w tekście lub -1: int sprawdz(char*tekst, char*wzor); • 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* sprawdz_w(char* tekst, char * wzor, int* ilosc); • funkcję main, w której należy wczytać dwa dowolne łańcuchy, wywołać funkcję sprawdz i wypisać wynik (czy znaleziono wzorzec, jeśli tak, to od jakiego indeksu się zaczyna). Jeśli znaleziono wzorzec, należy wywołać funkcję sprawdz_w i również wypisać odpowiednie wyniki (ilość znalezionych wzorców i ich indeksy). Operacje: wczytania łańcuchów, wywołania funkcji i wypisywania wyników przeprowadzać dopóki wzorzec znajduje się w tekście.