Wyszukiwanie Fibonacciego pozwala na wyszukanie elementu na posortowanej liście. Podobnie jak w przypadku Wyszukiwania Binarnego wykorzystywana jest metoda "Dziel i Zwyciężaj" polegająca na zawężaniu przedziału w którym może znajdować się szukana wartość. Miejsce podziału listy na dwie części określają liczby Fibonacciego. Zaletą takiego rozwiązania jest fakt, że wystarczą operacje dodawania i odejmowania, a nie potrzeba mnożyć, ani dzielić. Niemniej wykonywane jest kilka operacji porównania więcej.
Oznaczmy k-tą liczbę Fibonacciego poprzez Fk. Ciąg liczb Fibonacciego definiujemy jako: Fk + 2 = Fk + 1 + Fk, gdzie dwa pierwsze wyraz to F1 = 1 oraz F0 = 0.
Początkowo szukamy takiego wyrazu Fm, aby Fm > n, gdzie n jest długością listy, która będzie przeszukiwana. Wyrazy na liście indeksujemy od 1. Następnie dopóki m nie wyniesie 0 wykonujemy:
Jeśli po zakończeniu pętli na wskazanej pozycji nie ma szukanego elementu to oznacza, że nie istnieje.
Weźmy posortowaną listę L = {1, 5, 8, 13, 15, 16, 20, 26, 30, 34}. Na początek ustalamy, że F7 > n = 10.
Spróbujmy wyszukać teraz wartość 13.
Lista | m | Fm - 1 | Porównanie | Komentarz |
---|---|---|---|---|
{1, 5, 8, 13, 15, 16, 20, 26, 30, 34} | 7 | 8 | 13 < 26 | Usuwamy pozycje od 9 do końca |
{1, 5, 8, 13, 15, 16, 20, 26} | 6 | 5 | 13 < 15 | Usuwamy pozycje od 6 do końca |
{1, 5, 8, 13, 15} | 5 | 3 | 13 > 8 | Usuwamy pozycje od 1 do 3 |
{13, 15} | 3 | 1 | 13 = 13 | Element został znaleziony |
Bardzo podobnie wygląda przeszukiwanie listy, gdy element nie istnieje. Przykładowo wyszukajmy nieistniejący element 2.
Lista | m | Fm - 1 | Porównanie | Komentarz |
---|---|---|---|---|
{1, 5, 8, 13, 15, 16, 20, 26, 30, 34} | 7 | 8 | 2 < 26 | Usuwamy pozycje od 9 do końca |
{1, 5, 8, 13, 15, 16, 20, 26} | 6 | 5 | 2 < 15 | Usuwamy pozycje od 6 do końca |
{1, 5, 8, 13, 15} | 5 | 3 | 2 < 8 | Usuwamy pozycje od 3 do końca |
{1, 5, 8} | 4 | 2 | 2 < 5 | Usuwamy pozycję od 2 do końca |
{1} | 3 | 1 | 2 > 1 | Usuwamy pozycję 1 |
{ } | 2 | 1 | - | Lista jest pusta, element nie istnieje |
Liczby Fibonacciego bardzo łatwo się wyprowadza z zależności rekurencyjnej. Nie jest to jednak efektywna metoda i zdecydowanie lepiej jest wyprowadzić w sposób iteracyjny. Zauważmy, że w tym przypadku zawsze chcemy dowiedzieć się jaka jest następna, albo poprzednia liczba Fibonacciego. Istnieje możliwosć, aby zawsze przechowywać dwie kolejne liczby Fibonacciego. Dzięki temu zawsze będzie można wyliczyć poprzedni, albo następny wyraz bez wyliczania do od początku.
W celu uproszczenia zapisu kodu utworzona została klasa Fibonacci, która pozwala na pobranie aktualnego wyrazu, albo przesunąć wyraz o 1 do przodu lub do tyłu. Poniżej znajduje się jej pełny kod:
W klasie zadeklarowane są (3.) dwie zmienne a i b, które oznaczają kolejne dwa wyrazy liczb Fibonacciego. Na podstawie nich będą wyliczany poprzedni lub następny. W celu wyliczenia następnego wyrazu należy wywołać funkcję Nastepna(), jeśli poprzednią to Poprzednia(), a jesli chcemy odczytać aktualną wartość to należy wywołać Aktualna().
Przejdźmy teraz do algorytmu wyszukiwania. Funkcja będzie przyjmować tablicę danych, więc usuwanie danych jest mało wygodne. Podczas obcinania danych z końca wystarczy zmienić długość tablicy, ale z początku nie można tak łatwo. Z tego powodu (3.) deklarowana jest zmienna pozp, która jest numerem indeksu pierwszego elementu w tablicy. Przykładowo jeśli będzie mieć wartość 2 to element o indeksach 0 i 1 są pomijane przez algorytm.
(2.) Zadeklaruj generator liczb Fibonacciego oraz (3.) ustal indeks początkowy na 0. Następnie (4. - 5.) znajdź najmniejszą liczbę Fibonacciego większą lub równą n. (6.) Zmniejsz indeks liczby Fibonacciego o 1. (7.) W pętli (8. - 9.) upewnij się, że aktualnie sprawdzana pozycja nie wykracza poza tablicę. Następnie (10.) sprawdź czy został znaleziony element. Jeśli tak to (11.) zwróć aktualną pozycję. W przypadku, gdy jednak (12.) szukana wartość jest mniejsza niż aktualna pozycja to (13.) tylko cofnij liczbę Fibonacciego. Usuwanie danych z końca nie ma większego znaczenia. Jednak dla przeciwnego przypadku: (15.) istnieje potrzeba zmiany indeksu początkowego i (16. - 17.) wyliczenia wyrazu Fibonacciego o dwa indeksy mniejszego.
W celu przetestowania działania kodu. Poniższa funkcja główna wczyta dane od użytkownika i wypisze wynik na ekran.
Napisz funkcję Wyszukiwania Fibonacciego, która pozwoli wyszukać element x w liście posortowanej malejąco. Program na wczytać dane od użytkownika, a następnie wypisać na ekran pozycję elementu na liście, albo komunikat, że element w tablicy nie występuje.