Wyszukiwanie interpolacyjne
1. Czym jest wyszukiwanie interpolacyjne?
Wyszukiwanie interpolacyjne (interpolation search) to ulepszona wersja wyszukiwania binarnego, która działa lepiej dla równomiernie rozłożonych danych.
Kluczowa różnica:
Wyszukiwanie binarne: - Zawsze sprawdza środek listy - Nie wykorzystuje wartości elementów
Wyszukiwanie interpolacyjne: - Sprawdza szacowaną pozycję na podstawie wartości - Wykorzystuje interpolację liniową
Analogia – książka telefoniczna:
Szukasz nazwiska "Kowalski" w książce telefonicznej:
❌ Binarne: Zawsze otwórz na środku
(nieefektywne – "K" jest bliżej środka niż "A")
✅ Interpolacyjne: Otwórz około 1/2 książki
(inteligentne – "K" jest w środku alfabetu)
2. Wizualizacja
Wyszukiwanie binarne vs interpolacyjne:
Lista: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Szukamy: 20
BINARNE:
Krok 1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
↑ środek = 50
20 < 50 → lewo
Krok 2: [10, 20, 30, 40, 50, ...]
↑ środek = 20
ZNALEZIONO!
INTERPOLACYJNE:
Krok 1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
↑ pozycja szacowana ≈ 1 (blisko początku)
arr[1] = 20
ZNALEZIONO w 1 kroku!
3. Wzór na pozycję
Intuicja wzoru:
Dla listy [10, 90] szukamy 50:
Proporcja: (50 - 10) / (90 - 10) = 40/80 = 0.5 (50%)
Pozycja: 0 + 0.5 * (7 - 0) ≈ 3.5 → 3
4. Implementacja iteracyjna
5. Wizualizacja z debugiem
Wynik:
Szukam: 50 w [10, 20, 30, 40, 50, 60, 70, 80, 90]
Iteracja 1:
Zakres: arr[0:9] = [10, 20, 30, 40, 50, 60, 70, 80, 90]
Wartości: [10, 90]
Interpolacja: pos = 0 + ((50-10) * 8) / (90-10) = 4
Sprawdzam: arr[4] = 50
✅ ZNALEZIONO!
6. Złożoność czasowa
Najlepszy przypadek: O(1)
Element na szacowanej pozycji:
Średni przypadek: O(log log n) ✅
Dla równomiernie rozłożonych danych:
Najgorszy przypadek: O(n) ❌
Dla nierównomiernie rozłożonych danych:
7. Porównanie: binarne vs interpolacyjne
8. Optymalizacja – unikanie dzielenia przez zero
9. Rekurencyjna implementacja
10. Kiedy używać interpolacji?
✅ Używaj gdy:
- Dane równomiernie rozłożone (równe odstępy wartości)
- Duże zbiory danych (n > 1000)
- Wyszukiwania częste (koszt sortowania już poniesiony)
- Znasz rozkład danych
❌ Unikaj gdy:
- Dane nierównomierne (duże różnice między sąsiadami)
- Małe zbiory (n < 100) – różnica nieznaczna
- Dane zawierają duplikaty (może być wolniejsze)
11. Przykłady danych
Dobre dla interpolacji:
Złe dla interpolacji:
12. Benchmark szczegółowy
13. Porównanie algorytmów wyszukiwania
| Algorytm | Najlepszy | Średni | Najgorszy | Wymaga sortowania | Rozkład danych |
|---|---|---|---|---|---|
| Liniowe | O(1) | O(n) | O(n) | ❌ NIE | Dowolny |
| Binarne | O(1) | O(log n) | O(log n) | ✅ TAK | Dowolny |
| Interpolacyjne | O(1) | O(log log n) | O(n) | ✅ TAK | Równomierny ✅ |
14. Zastosowania praktyczne
14.1. Książka telefoniczna
14.2. Wyszukiwanie dat
14.3. Dane sensorów (równomierne próbkowanie)
15. Podsumowanie
Wyszukiwanie interpolacyjne:
- Złożoność czasowa:
- Najlepszy: O(1)
- Średni: O(log log n) ← Szybsze niż binarne!
- Najgorszy: O(n) ← Wolniejsze niż binarne!
- Złożoność pamięciowa: O(1)
- WYMAGANE: Lista posortowana + równomierny rozkład
Zalety: - O(log log n) dla równomiernych danych – szybsze niż binarne - Inteligentnie wykorzystuje wartości elementów - Intuicyjne (jak szukanie w książce telefonicznej)
Wady: - O(n) w najgorszym przypadku dla nierównomiernych danych - Bardziej złożone niż binarne - Wymaga równomiernego rozkładu
vs Wyszukiwanie binarne:
| Aspekt | Interpolacyjne | Binarne |
|---|---|---|
| Średnia złożoność | O(log log n) ✅ | O(log n) |
| Najgorsza | O(n) ❌ | O(log n) ✅ |
| Rozkład danych | Wymagany ❌ | Dowolny ✅ |
| Prostota | Złożone | Prostsze ✅ |
Kiedy używać: - ✅ Równomierne dane (range, daty, równe odstępy) - ✅ Duże zbiory (n > 1000) - ✅ Znasz rozkład danych
Kiedy NIE używać: - ❌ Nierównomierne dane (użyj binarnego) - ❌ Małe zbiory (różnica nieznaczna) - ❌ Nieznany rozkład (bezpieczniejsze binarne)
Praktyczna rada: W większości przypadków używaj wyszukiwania binarnego (bezpieczniejsze, przewidywalne O(log n)). Interpolacyjne tylko gdy wiesz, że dane są równomierne.
Co dalej warto poznać:
- Jump search (O(√n))
- Exponential search
- Fibonacci search
- Ternary search (dla funkcji unimodalnych)