Fibonacci Arama: Sıralı Dizilerde Etkili Bir Arama Yöntemi
14 Haziran 2019 • ☕️ 4 dk okuma • 🏷 bilgisayar, yazılım, algoritma, arama
Yazar tarafından şu dillere çevrildi: English
Arama algoritmaları, bilgisayar bilimlerinin temel taşlarından birini oluşturur ve geniş bir uygulama yelpazesi bulunmaktadır. Veri işleme, veri tabanları, bilgisayar grafikleri ve daha birçok alanda, verileri düzenlemek ve hedeflenen bilgilere erişmek için arama algoritmalarına ihtiyaç duyulur. Bu makalede, geleneksel arama algoritmalarından farklı bir yaklaşım olan Fibonacci Search tekniği üzerinde bir inceleme yapacağız.
Fibonacci Search Nedir?
Fibonacci Search, sıralanmış bir dizi içinde bir öğenin konumunu belirlemek için Fibonacci sayılarını kullanır. Bu algoritma, veri koleksiyonunun belirli bir bölümünü ele alır ve bu bölümü alt dizilere bölerken Fibonacci sayılarına dayalı bir indeks hesaplaması yapar. Bu yaklaşım, veri koleksiyonu içindeki hedef öğeyi hızlı bir şekilde bulmak için kararlı ve etkili bir yol sunar.
Fibonacci Sayıları Nedir?
Fibonacci sayıları, her sayının kendisinden önceki iki sayının toplamı olduğu bir sayı dizisidir. Bu sayı dizisi şu şekildedir: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … Fibonacci sayılarının özelliği, sayılar büyüdükçe birbirleriyle oranlarının yaklaşık olarak 1.61803 (altın oran) olduğudur.
Fibonacci Search Algoritması
Fibonacci Search algoritması aşağıdaki adımları izler:
- Başlangıçta iki Fibonacci sayısı olan
F(k-2)veF(k-1)seçilir, böyleceF(k-1)koleksiyonun boyutundan küçük veF(k-2)koleksiyonun boyutundan büyük olur. - Şu andaki aralık
arr[0..F(k)]içinde bir öğeyi aramak içinkdeğeri hesaplanır. -
arr[F(k-2)]vearr[F(k-1)]arasında bir karşılaştırma yapılır.- Eğer aranan öğe,
arr[F(k-2)]‘den küçükse, arama aralığıarr[0..F(k-2)]olarak güncellenir ve işlem tekrarlanır. - Eğer aranan öğe,
arr[F(k-2)]‘den büyükse, arama aralığıarr[F(k-2)..F(k-1)]olarak güncellenir ve işlem tekrarlanır. - Eğer aranan öğe,
arr[F(k-2)]ilearr[F(k-1)]arasındaki öğeye eşitse, öğe bulunmuş olur.
- Eğer aranan öğe,
- Aranan öğe bulunana kadar veya arama aralığı boşalana kadar bu adımlar tekrarlanır.
Aşağıda, Fibonacci Search algoritmasının basit bir pseudocode örneği verilmiştir:
function FibonacciSearch(arr, x):
n = length(arr)
fibM = 0 // Fib(k-2)
fibN = 1 // Fib(k-1)
fibK = fibM + fibN
while (fibK < n):
fibM = fibN
fibN = fibK
fibK = fibM + fibN
offset = -1
while (fibK > 1):
i = min(offset + fibM, n - 1)
if (arr[i] < x):
fibK = fibN
fibN = fibM
fibM = fibK - fibN
offset = i
else if (arr[i] > x):
fibK = fibM
fibN = fibN - fibM
fibM = fibK - fibN
else:
return i // Element found at index i
if (fibN == 1 && arr[offset + 1] == x):
return offset + 1 // Element found at index offset + 1
return -1 // Element not foundZaman ve Alan Karmaşıklığı
Fibonacci Search, ortalama durumda O(log n) zaman karmaşıklığına sahiptir. En kötü durumda da O(n) kadar iyi performans gösterir. Alan karmaşıklığı ise O(1) olarak kabul edilir.
Kullanım Alanları
Fibonacci Search, özellikle büyük sıralanmış koleksiyonlarda ve özellikle altın oranın belirli bir rol oynadığı alanlarda kullanılır. İdeal olarak, aranacak öğenin yerini yaklaşık olarak tahmin etmek ve bu nedenle aramayı optimize etmek istediğiniz durumlar için uygundur.
Fibonacci Search, geleneksel arama algoritmalarından farklı bir yaklaşım sunar ve sıralanmış veri koleksiyonlarında hızlı arama yapmak için kullanışlıdır. Fibonacci sayılarının özelliği, bu algoritmanın verimliliğini artırır. Ancak, veri koleksiyonlarının boyutu ve yapısı gibi faktörler algoritmanın performansını etkileyebilir, bu nedenle kullanmadan önce dikkatlice düşünülmesi gereken bir yöntemdir.
GoLang’de Fibonacci Search uygulaması:
package main
import (
"fmt"
)
func FibonacciSearch(arr []int, x int) int {
n := len(arr)
fibM, fibN, fibK := 0, 1, 0
for fibK < n {
fibM, fibN = fibN, fibK
fibK = fibM + fibN
}
offset := -1
for fibK > 1 {
i := min(offset+fibM, n-1)
if arr[i] < x {
fibK = fibN
fibN = fibM
fibM = fibK - fibN
offset = i
} else if arr[i] > x {
fibK = fibM
fibN = fibN - fibM
fibM = fibK - fibN
} else {
return i
}
}
if fibN == 1 && arr[offset+1] == x {
return offset + 1
}
return -1
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
func main() {
arr := []int{10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100}
x := 85
index := FibonacciSearch(arr, x)
if index != -1 {
fmt.Printf("%d found at index %d.\n", x, index)
} else {
fmt.Printf("%d not found.\n", x)
}
}Program çalıştırıldığında çıktısı aşağıdaki gibi olacaktır.
85 found at index 8.Programın çalışır haline şuradan erişilebilir.