Menu
Coddy logo textTech

İkili Arama

Son güncelleme

İkili arama, **sıralı** bir dizide hedef değeri arama penceresini tekrar tekrar yarıya indirerek bulur. Ortadaki elemanı hedefle karşılaştırır: eşleşme aramayı bitirir; aksi halde hedefi içeremeyecek yarı atılır ve pencere diğer yarıya küçülür. Her karşılaştırma kalan elemanların yarısını eler; bu yüzden O(log n) sürede çalışır — bir milyon sıralı değer arasında arama en fazla yaklaşık 20 karşılaştırma gerektirir.

Yukarıdaki animasyon lo, mid ve hi işaretçilerini gösterir ve her karşılaştırmadan sonra elenen yarıyı soluklaştırır. Tek tartışılmaz ön koşul: dizi zaten sıralı olmalıdır — sırasız veride önce doğrusal arama veya bir sıralama gerekir (merge sort sayfasına bakın). Aynı yarıya indirme fikri ikili arama ağacının da temelidir.

Zaman ve alan karmaşıklığı

DurumKarmaşıklıkNotlar
En iyi durumO(1)İlk karşılaştırmada ortadaki eleman hedeftir.
Ortalama durumO(log n)Her karşılaştırma kalan pencereyi yarıya indirir.
En kötü durumO(log n)Pencere, eşleşme veya başarısızlıktan önce tek bir elemana kadar küçülür.
AlanO(1)Yinelemeli sürüm yalnızca lo, hi ve mid indekslerini tutar.

Adım adım

AdımNe olur
1lo değerini sıralı dizinin ilk indeksine, hi değerini son indeksine ayarlayın.
2Orta indeksi hesaplayın: mid = (lo + hi) // 2.
3a[mid] hedefe eşitse mid değerini döndürün — bulundu.
4a[mid] hedeften **küçükse**, hedef yalnızca sağ yarıda olabilir: lo = mid + 1 yapın.
5a[mid] hedeften **büyükse**, sol yarıyı arayın: hi = mid - 1 yapın.
6lo <= hi olduğu sürece 2. adımdan itibaren tekrarlayın; pencere boşalırsa hedef dizide yoktur.

Çözümlü örnek

[1, 2, 3, 5, 7, 8, 9] dizisinde 5 aranıyor:

GeçişPencere (lo..hi)mida[mid]İşlem
1[1, 2, 3, 5, 7, 8, 9] (0..6)35a[3] = 5 — hedef 3. indekste bulundu.

Bulunamayan bir arama, adım adım

Aynı dizide 4 aramak pencerenin nasıl boşaldığını gösterir:

GeçişPencere (lo..hi)mida[mid]İşlem
10..6355 > 4 — sol yarıyı ara, hi = 2.
20..2122 < 4 — sağ yarıyı ara, lo = 2.
32..2233 < 4lo 3 olur, pencere boşalır: bulunamadı.

İkili arama ne zaman kullanılmalı

Şu durumlarda kullanınŞu durumlarda kaçının
Veri zaten sıralıysa (veya üzerinde birçok kez arama yapıyorsanız)Veri sırasızsa ve yalnızca bir kez aranıyorsa — önce sıralamak O(n log n) tutar
Koleksiyon hızlı rastgele erişimi destekliyorsa (diziler)Yalnızca sıralı erişiminiz varsa (bağlı listeler)
Veri kümesi büyükse — O(log n) büyük ölçekte parlarVeri kümesi çok küçükse — basit bir tarama aynı hızda ve daha basittir

Binary Search kodu

Python, JavaScript, Java, C++, C, Pseudocode dillerinde temiz ve çalıştırılabilir bir Binary Search uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Binary Search kodu

Python
1def binary_search(a, target):2    lo, hi = 0, len(a) - 13    while lo <= hi:4        mid = (lo + hi) // 25        if a[mid] == target:6            return mid7        if a[mid] < target:8            lo = mid + 1  # search the right half9        else:10            hi = mid - 1  # search the left half11    return -112
13
14nums = [1, 2, 3, 5, 7, 8, 9]  # must be sorted15print("Index of 5:", binary_search(nums, 5))16print("Index of 4:", binary_search(nums, 4))
Bu kodu Python Playground'da çalıştır

İkili Arama SSS

İkili aramanın zaman karmaşıklığı nedir?
Ortalama ve en kötü durumda O(log n), çünkü her karşılaştırma kalan arama penceresini yarıya indirir; ilk ortadaki eleman hedef olduğunda en iyi durumda O(1). Yinelemeli sürüm O(1) ek alan kullanır.
İkili arama neden sıralı bir dizi gerektirir?
Yarıya indirme adımı sıraya dayanır: hedefi ortadaki elemanla karşılaştırmak, ancak ortanın solundaki her şey daha küçük ve sağındaki her şey daha büyükse hangi yarının atılacağını söyler. Sırasız veride bu çıkarım geçersizdir — bunun yerine doğrusal arama kullanın veya önce sıralayın.
İkili arama ile doğrusal arama arasındaki fark nedir?
Doğrusal arama elemanları tek tek tarar (O(n)) ve her dizide çalışır; ikili arama sıralı bir dizinin arama penceresini yarıya indirir (O(log n)) ama sıralı girdi gerektirir. Bir avuç eleman için fark önemsizdir — büyük ölçekte ikili arama açık ara kazanır.
İkili arama kaç karşılaştırmaya ihtiyaç duyar?
En fazla yaklaşık log2(n) + 1: 10 karşılaştırma 1.000 elemanı, 20 karşılaştırma 1.000.000 elemanı kapsar. Bu logaritmik büyüme, onu sıralı veride varsayılan arama yöntemi yapar.
İkili aramadaki klasik taşma (overflow) hatası nedir?
Ortayı (lo + hi) / 2 olarak hesaplamak, lo + hi türün üst sınırını aştığında sabit boyutlu tamsayılarda taşmaya yol açabilir. Güvenli biçim mid = lo + (hi - lo) / 2 şeklindedir. Python'da bu önemli değildir (keyfi hassasiyetli tamsayılar), ama Java/C/C++ dillerinde gerçek ve ünlü bir hatadır.
İkili arama ile ikili arama ağacı aynı şey midir?
Yarıya indirme fikrini paylaşırlar ama yapıları farklıdır: ikili arama, sıralı bir dizi üzerinde çalışan bir algoritmadır; ikili arama ağacı ise anahtarlarını sıralı tutan, aramaların her düğümde sola veya sağa indiği bağlı bir veri yapısıdır.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA