Τι Είναι ο Fibonacci Search;
Φαντάσου ότι έχεις μια σειρά από πολύχρωμα μπάλες που είναι τακτοποιημένες σε μια σειρά. Θέλεις να βρεις μια συγκεκριμένη μπάλα, αλλά δεν ξέρεις που βρίσκεται. Η σειρά των μπάλων είναι οργανωμένη, πράγμα που σημαίνει ότι είναι ταξινομημένη από την πιο μικρή μέχρι την πιο μεγάλη.
Ο Fibonacci Search είναι σαν ένα παιχνίδι που σε βοηθάει να βρεις τη μπάλα που ψάχνεις, αλλά χρησιμοποιεί έναν ειδικό τρόπο βασισμένο σε αριθμούς της Fibonacci. Αυτή η σειρά αριθμών είναι: 0, 1, 1, 2, 3, 5, 8, 13, 21, και ούτω καθεξής.
Πώς Λειτουργεί;
Ακολουθεί έναν έξυπνο τρόπο για να βρει τη μπάλα, χωρίς να κοιτάξει μία-μία όλες τις μπάλες:
- Βρίσκουμε Αριθμούς της Fibonacci: Δημιουργούμε μια σειρά αριθμών Fibonacci μέχρι να βρούμε τον μεγαλύτερο αριθμό που είναι μικρότερος ή ίσος με το μήκος της σειράς μπάλων.
- Χρησιμοποιούμε τους Αριθμούς για Αναζήτηση: Χρησιμοποιούμε αυτούς τους αριθμούς για να “πηδήξουμε” σε συγκεκριμένες θέσεις στη σειρά των μπάλων, αντί να κοιτάξουμε όλες τις θέσεις.
- Επαναλαμβάνουμε: Αν δεν βρούμε τη μπάλα στην αρχική μας πηγή, μειώνουμε τον αριθμό των “πηδημάτων” μας με βάση τους αριθμούς της Fibonacci και συνεχίζουμε μέχρι να βρούμε τη μπάλα ή να καταλάβουμε ότι δεν υπάρχει στη σειρά.
Παράδειγμα με Κώδικα
Ας δούμε πώς μπορούμε να το κάνουμε στην C#:
using System;
class FibonacciSearchExample
{
static void Main()
{
int[] array = { 10, 22, 35, 40, 45, 50, 60, 70, 80, 82, 85, 90, 100 };
int target = 85;
int result = FibonacciSearch(array, target);
if (result != -1)
{
Console.WriteLine($"Η μπάλα με τιμή {target} βρέθηκε στη θέση {result}.");
}
else
{
Console.WriteLine($"Η μπάλα με τιμή {target} δεν βρέθηκε.");
}
}
static int FibonacciSearch(int[] array, int target)
{
int n = array.Length;
int fibM_minus_2 = 0; // (m-2)th Fibonacci Number
int fibM_minus_1 = 1; // (m-1)th Fibonacci Number
int fibM = fibM_minus_1 + fibM_minus_2; // mth Fibonacci Number
// Find the smallest Fibonacci number greater than or equal to the length of the array
while (fibM < n)
{
fibM_minus_2 = fibM_minus_1;
fibM_minus_1 = fibM;
fibM = fibM_minus_1 + fibM_minus_2;
}
int offset = -1;
// While there are elements to compare
while (fibM > 1)
{
// Check if fibM_minus_2 is a valid index
int i = Math.Min(offset + fibM_minus_2, n - 1);
// If target is greater than the value at index i, move the search range
if (array[i] < target)
{
fibM = fibM_minus_1;
fibM_minus_1 = fibM_minus_2;
fibM_minus_2 = fibM - fibM_minus_1;
offset = i;
}
// If target is smaller than the value at index i, adjust the range
else if (array[i] > target)
{
fibM = fibM_minus_2;
fibM_minus_1 = fibM_minus_1 - fibM_minus_2;
fibM_minus_2 = fibM - fibM_minus_1;
}
// Element found
else
return i;
}
// The last comparison
if (fibM_minus_1 == 1 && array[offset + 1] == target)
return offset + 1;
return -1;
}
}
Σημαντικά Σημεία
- Αριθμοί της Fibonacci: Χρησιμοποιούμε τη σειρά των αριθμών Fibonacci για να αποφασίσουμε σε ποιες θέσεις να κοιτάξουμε.
- Πηδήματα: Αντί να κοιτάμε όλες τις θέσεις, πηδάμε σε συγκεκριμένες θέσεις με βάση τους αριθμούς της Fibonacci.
- Ανατροφοδότηση: Αν δεν βρούμε αυτό που ψάχνουμε, προσαρμόζουμε τους αριθμούς Fibonacci και συνεχίζουμε την αναζήτηση.
Ελπίζω αυτό να σου δίνει μια καλή ιδέα για το πώς λειτουργεί ο Fibonacci Search! Αν έχεις άλλες ερωτήσεις, μη διστάσεις να ρωτήσεις.