İkili arama algoritması - Binary search algorithm

İkili arama algoritması
İkili Arama Depiction.svg
7'nin hedef değer olduğu ikili arama algoritmasının görselleştirilmesi
SınıfArama algoritması
Veri yapısıDizi
En kötü durumda verimÖ(günlük n)
En iyi senaryo verimÖ(1)
Ortalama verimÖ(günlük n)
En kötü durumda uzay karmaşıklığıÖ(1)

İçinde bilgisayar Bilimi, Ikili arama, Ayrıca şöyle bilinir yarım aralıklı arama,[1] logaritmik arama,[2] veya ikili pirzola,[3] bir arama algoritması bir hedef değerin konumunu bir sıralanmış dizi.[4][5] İkili arama, hedef değeri dizinin orta elemanıyla karşılaştırır. Eşit değillerse, hedefin uzanamayacağı yarı ortadan kaldırılır ve kalan yarıda arama devam eder, yine orta elemanı hedef değer ile karşılaştırmak ve hedef değer bulunana kadar bunu tekrarlamak. Arama kalan yarısı boş olarak biterse, hedef dizide değildir.

İkili arama çalışır logaritmik zaman içinde En kötü durumda, yapımı karşılaştırmalar, nerede dizideki öğelerin sayısıdır.[a][6] İkili arama daha hızlıdır doğrusal arama küçük diziler hariç. Bununla birlikte, ikili aramayı uygulayabilmek için önce dizinin sıralanması gerekir. Uzman var veri yapıları hızlı arama için tasarlanmıştır, örneğin karma tablolar, ikili aramadan daha verimli bir şekilde aranabilir. Bununla birlikte, ikili arama, dizide bulunmasa bile hedefe göre dizideki bir sonraki en küçük veya sonraki en büyük öğeyi bulma gibi daha geniş bir sorun yelpazesini çözmek için kullanılabilir.

İkili aramanın çok sayıda varyasyonu vardır. Özellikle, kesirli basamaklama birden çok dizide aynı değer için ikili aramaları hızlandırır. Kesirli basamaklama, bir dizi arama problemini verimli bir şekilde çözer. hesaplamalı geometri ve diğer birçok alanda. Üstel arama ikili aramayı sınırsız listelere genişletir. ikili arama ağacı ve B ağacı veri yapıları ikili aramaya dayanır.

Algoritma

İkili arama, sıralı diziler üzerinde çalışır. İkili arama, dizinin ortasındaki bir öğeyi hedef değerle karşılaştırarak başlar. Hedef değer öğeyle eşleşirse, dizideki konumu döndürülür. Hedef değer öğeden küçükse, arama dizinin alt yarısında devam eder. Hedef değer öğeden büyükse, arama dizinin üst yarısında devam eder. Bunu yaparak, algoritma hedef değerin her yinelemede bulunamayacağı yarıyı ortadan kaldırır.[7]

Prosedür

Bir dizi verildiğinde nın-nin değerleri olan öğeler veya kayıtları öyle sıralandı ve hedef değer , aşağıdaki altyordam dizinini bulmak için ikili aramayı kullanır içinde .[7]

  1. Ayarlamak -e ve -e .
  2. Eğer arama başarısız olarak sona erer.
  3. Ayarlamak (orta elemanın konumu) zemin nın-nin , bu tamsayı küçüktür veya eşittir .
  4. Eğer , Ayarlamak -e ve 2. adıma gidin.
  5. Eğer , Ayarlamak -e ve 2. adıma gidin.
  6. Şimdi arama yapıldı; dönüş .

Bu yinelemeli prosedür, iki değişkenle arama sınırlarının kaydını tutar ve . Prosedür şu şekilde ifade edilebilir: sözde kod aşağıdaki gibi, değişken adları ve türleri yukarıdakiyle aynı kaldığında, zemin zemin işlevi ve başarısız aramanın başarısızlığını ifade eden belirli bir değeri ifade eder.[7]

işlevi binary_search (A, n, T) dır-dir    L: = 0 R: = n - 1 süre L ≤ R yapmak        m: = kat ((L + R) / 2) Eğer A [m] sonra            L: = m + 1 Aksi takdirde A [m]> T sonra            R: = m - 1 Başka:            dönüş m dönüş başarısız

Alternatif olarak, algoritma, tavan nın-nin . Hedef değer dizide birden fazla görünürse bu, sonucu değiştirebilir.

Alternatif prosedür

Yukarıdaki prosedürde, algoritma ortadaki elemanın () hedefe eşittir () her yinelemede. Bazı uygulamalar her yineleme sırasında bu denetimi dışarıda bırakır. Algoritma bu kontrolü yalnızca bir öğe kaldığında gerçekleştirir ( ). Bu, yineleme başına bir karşılaştırma ortadan kaldırıldığı için daha hızlı bir karşılaştırma döngüsü sağlar. Ancak, ortalama olarak bir tane daha yineleme gerektirir.[8]

Hermann Bottenbruch 1962'de bu çeki dışarıda bırakmak için ilk uygulamayı yayınladı.[8][9]

  1. Ayarlamak -e ve -e .
  2. Süre ,
    1. Ayarlamak (orta elemanın konumu) tavan nın-nin , bu büyük veya eşit olan en küçük tam sayıdır .
    2. Eğer , Ayarlamak -e .
    3. Başka, ; Ayarlamak -e .
  3. Şimdi , arama yapıldı. Eğer , dönüş . Aksi takdirde arama başarısız olarak sona erer.

Nerede tavan tavan işlevi, bu sürüm için sözde kod:

işlevi binary_search_alternative (A, n, T) dır-dir    L: = 0 R: = n - 1 süre L! = R yapmak        m: = tavan ((L + R) / 2) Eğer A [m]> T sonra            R: = m - 1 Başka: U: = m Eğer A [L] = T sonra        dönüş L dönüş başarısız

Yinelenen öğeler

Prosedür, dizide yinelenen öğeler olsa bile öğesi hedef değere eşit olan herhangi bir dizini döndürebilir. Örneğin, aranacak dizi ve hedef oldu , bu durumda algoritmanın 4. (dizin 3) veya 5. (dizin 4) öğeyi döndürmesi doğru olur. Normal prosedür, bu durumda 4. öğeyi (dizin 3) döndürür. Her zaman ilk kopyayı döndürmez (dikkate alın hala 4. öğeyi döndürür). Bununla birlikte, bazen dizide yinelenen bir hedef değer için en soldaki veya en sağdaki öğeyi bulmak gerekir. Yukarıdaki örnekte, 4. eleman 4 değerinin en soldaki elemanıdır, 5. eleman ise 4 değerinin en sağındaki elemanıdır. Yukarıdaki alternatif prosedür, eğer böyle bir eleman mevcutsa her zaman en sağdaki elemanın dizinini döndürecektir.[9]

En soldaki elemanı bulma prosedürü

En soldaki elemanı bulmak için aşağıdaki prosedür kullanılabilir:[10]

  1. Ayarlamak -e ve -e .
  2. Süre ,
    1. Ayarlamak (orta elemanın konumu) zemin nın-nin , bu tamsayı küçüktür veya eşittir .
    2. Eğer , Ayarlamak -e .
    3. Başka, ; Ayarlamak -e .
  3. Dönüş .

Eğer ve , sonra eşit olan en soldaki öğedir . Bile dizide değil, ... sıra nın-nin dizide veya dizideki öğelerin sayısı şundan küçüktür: .

Nerede zemin floor işlevidir, bu sürüm için sözde kod:

işlevi binary_search_leftmost (A, n, T): L: = 0 R: = n süre L Eğer A [m] Başka: R: = m dönüş L

En sağdaki elemanı bulma prosedürü

En sağdaki elemanı bulmak için aşağıdaki prosedür kullanılabilir:[10]

  1. Ayarlamak -e ve -e .
  2. Süre ,
    1. Ayarlamak (orta elemanın konumu) zemin nın-nin , bu tamsayı küçüktür veya eşittir .
    2. Eğer , Ayarlamak -e .
    3. Başka, ; Ayarlamak -e .
  3. Dönüş .

Eğer ve , sonra eşit olan en sağdaki öğedir . Bile dizide değil, dizide şundan büyük öğelerin sayısıdır .

Nerede zemin floor işlevidir, bu sürüm için sözde kod:

işlevi binary_search_rightmost (A, n, T): L: = 0 R: = n süre L Eğer Bir [m]> T: R: = m Başka: L: = m + 1 dönüş R - 1

Yaklaşık eşleşmeler

İkili arama, yaklaşık eşleşmeleri hesaplamak için uyarlanabilir. Yukarıdaki örnekte, hedef değer için sıra, öncül, halef ve en yakın komşu gösterilmektedir. dizide olmayan.

Yukarıdaki prosedür yalnızca gerçekleştirir tam eşleşir, bir hedef değerin konumunu bulur. Bununla birlikte, ikili arama sıralı diziler üzerinde çalıştığından, yaklaşık eşleşmeleri gerçekleştirmek için ikili aramayı genişletmek önemsizdir. Örneğin, belirli bir değer için, sırasını (daha küçük öğelerin sayısı), öncülünü (sonraki en küçük öğe), halefini (sonraki en büyük öğe) ve hesaplamak için ikili arama kullanılabilir. en yakın komşu. Aralık sorguları iki değer arasındaki eleman sayısının araştırılması, iki sıra sorgusu ile gerçekleştirilebilir.[11]

  • Sıra sorguları, en soldaki elemanı bulma prosedürü. Elementlerin sayısı daha az hedef değer prosedür tarafından döndürülür.[11]
  • Sıra sorguları ile önceki sorgular gerçekleştirilebilir. Hedef değerin sıralaması selefi.[12]
  • Ardıl sorgular için, en sağdaki elemanı bulma prosedürü kullanılabilir. Hedef değer için prosedürü çalıştırmanın sonucu şu ise , hedef değerin halefi ise.[12]
  • Hedef değerin en yakın komşusu, hangisi daha yakınsa, ya selefi ya da halefidir.
  • Aralık sorguları da basittir.[12] İki değerin sıralaması bilindiğinde, ilk değere eşit veya ondan büyük ve ikinciden küçük öğelerin sayısı, iki sıranın farkıdır. Bu sayı, aralığın uç noktalarının aralığın parçası olarak kabul edilmesi gerekip gerekmediğine ve dizinin bu uç noktalarla eşleşen girişler içerip içermediğine göre bir artırılabilir veya azaltılabilir.[13]

Verim

Bir ağaç ikili aramayı temsil eder. Burada aranan dizi ve hedef değer .
En kötü duruma, arama ağacın en derin seviyesine ulaştığında ulaşılırken, en iyi duruma, hedef değer orta eleman olduğunda ulaşılır.

Karşılaştırma sayısı açısından, ikili aramanın performansı, prosedürün çalışmasını ikili ağaçta görüntüleyerek analiz edilebilir. Ağacın kök düğümü, dizinin orta öğesidir. Alt yarının orta elemanı, kökün sol alt düğümüdür ve üst yarının orta elemanı, kökün sağ alt düğümüdür. Ağacın geri kalanı da benzer şekilde inşa edilmiştir. Kök düğümden başlayarak, sol veya sağ alt ağaçlar, hedef değerin söz konusu düğümden daha az veya daha fazla olmasına bağlı olarak geçilir.[6][14]

En kötü durumda, ikili arama, karşılaştırma döngüsünün yinelemeleri, burada gösterim, zemin işlevi argümandan küçük veya ona eşit olan en büyük tamsayıyı verir ve ... ikili logaritma. Bunun nedeni, arama ağacın en derin seviyesine ulaştığında en kötü duruma ulaşılmasıdır ve her zaman herhangi bir ikili arama için ağaçtaki düzeyler.

En kötü duruma, hedef öğe dizide olmadığında da ulaşılabilir. Eğer ikinin kuvvetinden bir eksikse bu her zaman böyledir. Aksi takdirde arama gerçekleştirilebilir arama ağacın en derin seviyesine ulaşırsa yinelemeler. Ancak yapabilir Arama ağacın ikinci en derin seviyesinde biterse, en kötü durumdan bir eksik olan yinelemeler.[15]

Ortalama olarak, her bir öğenin aranma olasılığının eşit olduğunu varsayarsak, ikili arama hedef öğe dizide olduğunda yinelemeler. Bu yaklaşık olarak eşittir yinelemeler. Hedef öğe dizide olmadığında, ikili arama Öğeler arasındaki ve dışındaki aralığın eşit derecede aranma olasılığının eşit olduğu varsayılarak, ortalama yinelemeler.[14]

Hedef değerin dizinin orta öğesi olduğu en iyi durumda, konumu bir yinelemeden sonra döndürülür.[16]

Yinelemeler açısından, yalnızca öğeleri karşılaştırarak çalışan hiçbir arama algoritması, ikili aramadan daha iyi ortalama ve en kötü durum performansı gösteremez. İkili aramayı temsil eden karşılaştırma ağacı, ağacın en düşük seviyesinin üzerindeki her seviye tamamen doldurulduğu için mümkün olan en az seviyeye sahiptir.[b] Aksi takdirde, arama algoritması bir yinelemedeki birkaç öğeyi ortadan kaldırarak ortalama ve en kötü durumda gereken yineleme sayısını artırabilir. Karşılaştırmalara dayalı diğer arama algoritmaları için durum budur, çünkü bazı hedef değerler üzerinde daha hızlı çalışabilirken, ortalama performans herşey elemanlar ikili aramadan daha kötüdür. Diziyi ikiye bölerek, ikili arama her iki alt dizinin boyutunun olabildiğince benzer olmasını sağlar.[14]

Uzay karmaşıklığı

İkili arama, dizinin boyutuna bakılmaksızın, dizi indeksleri veya bellek konumlarına işaretçiler olabilen öğelere üç işaretçi gerektirir. Bu nedenle, ikili aramanın uzay karmaşıklığı içinde Kelime RAM hesaplama modeli.

Ortalama vakanın türetilmesi

İkili arama tarafından gerçekleştirilen ortalama yineleme sayısı, aranan her bir öğenin olasılığına bağlıdır. Başarılı aramalar ve başarısız aramalar için ortalama durum farklıdır. Her bir elemanın başarılı aramalar için eşit derecede aranma olasılığının olduğu varsayılacaktır. Başarısız aramalar için, aralıklar Aradaki ve dışındaki elemanların aranması eşit derecede olasıdır. Başarılı aramalar için ortalama durum, her öğeyi tam olarak bir kez aramak için gereken yineleme sayısının şuna bölümüdür: , elemanların sayısı. Başarısız aramalar için ortalama durum, bir öğeyi her aralıkta tam olarak bir kez aramak için gereken yineleme sayısının, aralıklar.[14]

Başarılı aramalar

İkili ağaç gösteriminde, başarılı bir arama, kökten hedef düğüme giden bir yolla temsil edilebilir; iç yol. Bir yolun uzunluğu, yolun içinden geçtiği kenarların (düğümler arasındaki bağlantıların) sayısıdır. Karşılık gelen yolun uzunluğu olduğu göz önüne alındığında, bir arama tarafından gerçekleştirilen yineleme sayısı , dır-dir ilk yinelemeyi saymak. iç yol uzunluğu tüm benzersiz dahili yolların uzunluklarının toplamıdır. Kökten herhangi bir tek düğüme giden yalnızca bir yol olduğundan, her dahili yol belirli bir öğe için bir aramayı temsil eder. Eğer varsa pozitif bir tam sayı olan elemanlar ve dahili yol uzunluğu , ardından başarılı bir arama için ortalama yineleme sayısı , ilk yinelemeyi saymak için eklenen bir yineleme ile.[14]

İkili arama, karşılaştırmalarla arama yapmak için en uygun algoritma olduğundan, bu problem tüm ikili ağaçların minimum dahili yol uzunluğunun hesaplanmasına indirgenmiştir. şuna eşit düğümler:[17]

Örneğin, 7 öğeli bir dizide, kök bir yineleme gerektirir, kökün altındaki iki öğe iki yineleme gerektirir ve aşağıdaki dört öğe üç yineleme gerektirir. Bu durumda, dahili yol uzunluğu:[17]

Ortalama yineleme sayısı, ortalama durum için denkleme dayalı. Toplamı basitleştirilebilir:[14]

Denklemi yerine koyma denklemin içine :[14]

Tamsayı için , bu yukarıda belirtilen başarılı bir aramadaki ortalama durum denklemine eşdeğerdir.

Başarısız aramalar

Başarısız aramalar, ağacın büyütülmesiyle temsil edilebilir. harici düğümlerhangi oluşturur genişletilmiş ikili ağaç. Bir iç düğüm veya ağaçta bulunan bir düğüm ikiden az çocuk düğüme sahipse, her bir iç düğümün iki çocuğu olması için harici düğümler olarak adlandırılan ek çocuk düğümler eklenir. Bunu yaparak, başarısız bir arama, ebeveyni son yineleme sırasında kalan tek öğe olan harici bir düğüme giden bir yol olarak temsil edilebilir. Bir dış yol kökten harici bir düğüme giden bir yoldur. dış yol uzunluğu tüm benzersiz harici yolların uzunluklarının toplamıdır. Eğer varsa pozitif bir tam sayı olan elemanlar ve harici yol uzunluğu , ardından başarısız bir arama için ortalama yineleme sayısı , ilk yinelemeyi saymak için eklenen bir yineleme ile. Dış yol uzunluğu şuna bölünür: onun yerine Çünkü var dizinin öğeleri arasındaki ve dışındaki aralıkları temsil eden harici yollar.[14]

Bu problem benzer şekilde tüm ikili ağaçların minimum dış yol uzunluğunu belirlemeye indirgenebilir. düğümler. Tüm ikili ağaçlar için, dış yol uzunluğu, iç yol uzunluğu artı .[17] Denklemi yerine koyma :[14]

Denklemi yerine koyma denklemin içine başarısız aramalar için ortalama durum belirlenebilir:[14]

Alternatif prosedürün uygulanması

Yukarıda tanımlanan ikili arama prosedürünün her bir yinelemesi, her yinelemede ortadaki öğenin hedefe eşit olup olmadığını kontrol ederek bir veya iki karşılaştırma yapar. Her bir öğenin aranma olasılığının eşit olduğunu varsayarsak, her yineleme ortalama olarak 1,5 karşılaştırma yapar. Algoritmanın bir varyasyonu, aramanın sonunda ortadaki elemanın hedefe eşit olup olmadığını kontrol eder. Ortalama olarak bu, her yinelemeden yarım karşılaştırmayı ortadan kaldırır. Bu, çoğu bilgisayarda yineleme başına harcanan süreyi biraz azaltır. Bununla birlikte, aramaya ortalama bir yineleme ekleyerek, aramanın maksimum sayıda yineleme alacağını garanti eder. Çünkü karşılaştırma döngüsü yalnızca en kötü durumda, yineleme başına verimlilikteki küçük artış, çok büyük hariç tümü için fazladan yinelemeyi telafi etmez .[c][18][19]

Çalışma süresi ve önbellek kullanımı

İkili aramanın performansını analiz ederken, iki öğeyi karşılaştırmak için gereken zamandır. Tamsayılar ve dizeler için gereken süre, kodlama uzunluğu kadar doğrusal olarak artar (genellikle sayısı bitler ) elemanların sayısı artar. Örneğin, 64 bitlik işaretsiz tamsayı çiftini karşılaştırmak, 32 bitlik işaretsiz tamsayı çiftini karşılaştırırken bitleri ikiye katlamayı gerektirir. En kötü durum, tam sayılar eşit olduğunda elde edilir. Bu, öğelerin kodlama uzunlukları büyük olduğunda önemli olabilir, örneğin büyük tam sayı türleri veya uzun diziler gibi, bu da öğeleri karşılaştırmayı pahalı hale getirir. Ayrıca, karşılaştırma kayan nokta değerler (en yaygın dijital temsili gerçek sayılar ), tam sayıları veya kısa dizeleri karşılaştırmaktan genellikle daha pahalıdır.

Çoğu bilgisayar mimarisinde, işlemci donanımı var önbellek den ayrı Veri deposu. İşlemcinin içinde bulundukları için, önbelleklere erişim çok daha hızlıdır ancak genellikle RAM'den çok daha az veri depolar. Bu nedenle, çoğu işlemci, yakın zamanda erişilen bellek konumlarını, ona yakın bellek konumlarıyla birlikte depolar. Örneğin, bir dizi öğesine erişildiğinde, öğenin kendisi RAM'de kendisine yakın depolanan öğelerle birlikte depolanabilir ve bu da, dizin olarak birbirine yakın olan dizi öğelerine sıralı olarak erişmeyi hızlandırır (referans yeri ). Sıralanmış bir dizide ikili arama, dizi büyükse, algoritmalardan farklı olarak uzak bellek konumlarına atlayabilir (örneğin doğrusal arama ve doğrusal inceleme içinde karma tablolar ) öğelere sırayla erişen. Bu, çoğu sistemde büyük diziler için ikili aramanın çalışma süresine biraz ekler.[20]

Diğer şemalara karşı ikili arama

İkili aramaya sahip sıralı diziler, ekleme ve silme işlemleri geri alma ile araya eklendiğinde çok verimsiz bir çözümdür. bu tür her işlem için zaman. Ek olarak, sıralı diziler, özellikle diziye elemanlar sıklıkla eklendiğinde bellek kullanımını karmaşıklaştırabilir.[21] Çok daha verimli ekleme ve silme işlemini destekleyen başka veri yapıları da vardır. İkili arama, tam eşleme yapmak için kullanılabilir ve üyelik ayarla (bir hedef değerin bir değerler koleksiyonunda olup olmadığını belirleme). Daha hızlı tam eşleştirmeyi ve set üyeliğini destekleyen veri yapıları vardır. Bununla birlikte, diğer birçok arama şemasından farklı olarak, ikili arama, verimli yaklaşık eşleştirme için kullanılabilir, genellikle bu tür eşleşmeleri değerlerin türü veya yapısından bağımsız olarak zaman.[22] Ek olarak, en küçük ve en büyük elemanı bulmak gibi, sıralanmış bir dizide verimli bir şekilde gerçekleştirilebilecek bazı işlemler vardır.[11]

Doğrusal arama

Doğrusal arama hedef değeri bulana kadar her kaydı kontrol eden basit bir arama algoritmasıdır. Doğrusal arama, bir diziden daha hızlı ekleme ve silme olanağı sağlayan bağlantılı bir listede yapılabilir. Dizinin önceden sıralanması gerekmesine rağmen, dizinin kısa olması dışında ikili arama, sıralı diziler için doğrusal aramadan daha hızlıdır.[d][24] Herşey sıralama algoritmaları gibi öğeleri karşılaştırmaya dayalı olarak hızlı sıralama ve sıralamayı birleştir, en azından gerekli en kötü durumda karşılaştırmalar.[25] Doğrusal aramanın aksine, ikili arama verimli yaklaşık eşleştirme için kullanılabilir. Sıralanmış bir dizide verimli bir şekilde yapılabilen, ancak sıralanmamış bir dizide yapılamayan en küçük ve en büyük elemanı bulma gibi işlemler vardır.[26]

Ağaçlar

İkili arama ağaçları ikili aramaya benzer bir algoritma kullanılarak aranır.

Bir ikili arama ağacı bir ikili ağaç ikili arama ilkesine göre çalışan veri yapısı. Ağacın kayıtları sıralı bir şekilde düzenlenir ve ağaçtaki her kayıt, ortalama logaritmik süre alınarak ikili aramaya benzer bir algoritma kullanılarak aranabilir. Ekleme ve silme işlemi ayrıca ikili arama ağaçlarında ortalama logaritmik süre gerektirir. Bu, sıralı dizilerin doğrusal zaman eklenmesinden ve silinmesinden daha hızlı olabilir ve ikili ağaçlar, aralık ve yaklaşık sorgular dahil olmak üzere sıralanmış bir dizide olası tüm işlemleri gerçekleştirme yeteneğini korur.[22][27]

Bununla birlikte, ikili arama genellikle arama için daha etkilidir, çünkü ikili arama ağaçları büyük olasılıkla kusurlu bir şekilde dengelenir ve ikili aramadan biraz daha kötü performansla sonuçlanır. Bu bile geçerlidir dengeli ikili arama ağaçları, mümkün olan en az seviyeyle ağacı nadiren ürettikleri için kendi düğümlerini dengeleyen ikili arama ağaçları. Dengeli ikili arama ağaçları dışında, ağaç, iki çocuklu birkaç dahili düğümle ciddi şekilde dengesiz olabilir ve bu da ortalama ve en kötü durum arama süresinin yaklaşmasına neden olabilir. karşılaştırmalar.[e] İkili arama ağaçları, sıralanmış dizilerden daha fazla yer kaplar.[29]

İkili arama ağaçları, dosya sistemlerinde verimli bir şekilde yapılandırılabildiğinden, ikili arama ağaçları sabit disklerde depolanan harici bellekte hızlı aramaya olanak tanır. B ağacı Bu ağaç düzenleme yöntemini genelleştirir. B-ağaçları genellikle uzun vadeli depolamayı düzenlemek için kullanılır. veritabanları ve dosya sistemleri.[30][31]

Hashing

Uygulamak için ilişkilendirilebilir diziler, karma tablolar, anahtarları eşleyen bir veri yapısı kayıtları kullanarak Özet fonksiyonu, genellikle sıralanmış bir kayıt dizisinde ikili aramadan daha hızlıdır.[32] Çoğu karma tablo uygulaması yalnızca itfa edilmiş ortalama sabit süre.[f][34] Ancak, bir sonraki en küçük, sonraki en büyük ve en yakın anahtarı hesaplamak gibi yaklaşık eşleşmeler için hashing yararlı değildir, çünkü başarısız bir aramada verilen tek bilgi hedefin herhangi bir kayıtta mevcut olmamasıdır.[35] İkili arama, bu tür eşleşmeler için idealdir ve bunları logaritmik zamanda gerçekleştirir. İkili arama aynı zamanda yaklaşık eşleşmeleri de destekler. En küçük ve en büyük elemanı bulmak gibi bazı işlemler sıralı dizilerde verimli bir şekilde yapılabilir, ancak karma tablolarda yapılamaz.[22]

Üyelik algoritmalarını ayarlayın

Aramayla ilgili bir sorun şudur: üyelik ayarla. İkili arama gibi arama yapan herhangi bir algoritma set üyeliği için de kullanılabilir. Set üyeliğine daha özel olarak uygun olan başka algoritmalar da vardır. Bir bit dizisi en basit olanıdır, tuş aralığı sınırlı olduğunda kullanışlıdır. Kompakt bir şekilde bir koleksiyon saklar bitler, her bit anahtar aralığı içinde tek bir anahtarı temsil eder. Bit dizileri çok hızlıdır, yalnızca zaman.[36] Judy1 türü Judy dizisi 64 bit anahtarları verimli bir şekilde kullanır.[37]

Yaklaşık sonuçlar için, Bloom filtreleri, hash oluşturmaya dayalı başka bir olasılıklı veri yapısı, Ayarlamak anahtarları bir kullanarak kodlayarak bit dizisi ve çoklu hash fonksiyonları. Bloom filtreleri, çoğu durumda bit dizilerinden çok daha fazla alan verimlidir ve çok daha yavaş değildir: karma işlevleri, üyelik sorguları yalnızca zaman. Ancak Bloom filtreleri şunlardan muzdariptir: yanlış pozitifler.[g][h][39]

Diğer veri yapıları

Sıralanmış diziler için hem arama hem de diğer işlemler için bazı durumlarda ikili aramada gelişebilecek veri yapıları vardır. Örneğin, aramalar, yaklaşık eşleşmeler ve sıralı dizilerde mevcut olan işlemler, özel veri yapıları üzerinde ikili aramadan daha verimli bir şekilde gerçekleştirilebilir. van Emde Boas ağaçları, füzyon ağaçları, dener, ve bit dizileri. Bu özelleştirilmiş veri yapıları genellikle yalnızca daha hızlıdır çünkü belirli bir özniteliğe sahip anahtarların özelliklerinden (genellikle küçük tamsayı olan anahtarlar) yararlanırlar ve bu nedenle bu özniteliğe sahip olmayan anahtarlar için zaman veya alan tüketir.[22] Anahtarlar sipariş edilebildiği sürece, bu işlemler her zaman en azından verimli bir şekilde, anahtarlardan bağımsız olarak sıralanmış bir dizide yapılabilir. Judy dizileri gibi bazı yapılar, verimliliği ve yaklaşık eşleştirme gerçekleştirme becerisini korurken, bunu azaltmak için bir yaklaşım kombinasyonu kullanır.[37]

Varyasyonlar

Tek tip ikili arama

Tek tip ikili arama belirli sınırlar yerine mevcut ve sonraki iki olası orta eleman arasındaki farkı depolar.

Tek tip ikili arama, alt ve üst sınırlar yerine, orta elemanın indeksindeki mevcut yinelemeden sonraki yinelemeye kadar olan farkı depolar. Bir arama tablosu farklılıkları içeren önceden hesaplanır. Örneğin, aranacak dizi ise [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]orta eleman () olabilir 6. Bu durumda, sol alt dizinin orta elemanı ([1, 2, 3, 4, 5]) dır-dir 3 ve sağ alt dizinin orta elemanı ([7, 8, 9, 10, 11]) dır-dir 9. Tek tip ikili arama, 3 her iki endeks de farklı olduğundan 6 aynı miktarda.[40] Arama alanını azaltmak için, algoritma bu değişikliği orta elemanın indeksine ekler veya çıkarır. Tek tip ikili arama, orta noktayı hesaplamanın verimsiz olduğu sistemlerde daha hızlı olabilir. ondalık bilgisayarlar.[41]

Üstel arama

Görselleştirme üstel arama sonraki ikili arama için üst sınırı bulma

Üstel arama, ikili aramayı sınırsız listelere genişletir. Hem ikinin üssü olan hem de hedef değerden daha büyük olan bir dizine sahip ilk öğeyi bularak başlar. Daha sonra bu indeksi üst sınır olarak ayarlar ve ikili aramaya geçer. Bir arama ikili arama başlatılmadan önceki yinelemeler ve en fazla ikili aramanın yinelemeleri, burada hedef değerin konumudur. Üstel arama, sınırlı listelerde çalışır, ancak yalnızca hedef değer dizinin başlangıcına yakınsa ikili aramaya göre bir gelişme olur.[42]

İnterpolasyon araması

Görselleştirme enterpolasyon araması doğrusal enterpolasyon kullanarak. Bu durumda, hedefin dizi içindeki konumunun tahmini doğru olduğundan arama yapmaya gerek yoktur. Diğer uygulamalar, hedefin konumunu tahmin etmek için başka bir işlevi belirtebilir.

Orta noktayı hesaplamak yerine, enterpolasyon araması, dizideki en düşük ve en yüksek öğeleri ve ayrıca dizinin uzunluğunu dikkate alarak hedef değerin konumunu tahmin eder. Çoğu durumda orta noktanın en iyi tahmin olmadığı temelinde çalışır. Örneğin, hedef değer dizideki en yüksek öğeye yakınsa, büyük olasılıkla dizinin sonuna yakın bir yerde bulunur.[43]

Ortak bir enterpolasyon işlevi, doğrusal enterpolasyon. Eğer dizi sırasıyla alt ve üst sınırlardır ve hedef ise, hedefin yaklaşık yolun ve . Doğrusal enterpolasyon kullanıldığında ve dizi elemanlarının dağılımı tekdüze veya tek tipe yakın olduğunda, enterpolasyon araması yapar karşılaştırmalar.[43][44][45]

Pratikte, interpolasyon araması ekstra hesaplama gerektirdiğinden, küçük diziler için ikili aramadan daha yavaştır. Zaman karmaşıklığı ikili aramadan daha yavaş büyür, ancak bu yalnızca büyük diziler için ekstra hesaplamayı telafi eder.[43]

Kesirli basamaklama

İçinde kesirli basamaklama, her dizinin başka bir dizinin her ikinci elemanına işaretçileri vardır, bu nedenle tüm dizileri aramak için yalnızca bir ikili arama yapılması gerekir.

Kesirli basamaklama, birden çok sıralı dizide aynı öğe için ikili aramaları hızlandıran bir tekniktir. Her diziyi ayrı ayrı aramak için zaman, nerede dizi sayısıdır. Kesirli basamaklama bunu azaltır her dizide her öğe ve diğer dizilerdeki konumu hakkında belirli bilgileri depolayarak.[46][47]

Kesirli basamaklama başlangıçta çeşitli sorunları verimli bir şekilde çözmek için geliştirilmiştir. hesaplamalı geometri sorunlar. Kesirli basamaklama, başka yerlerde uygulandı, örneğin veri madenciliği ve internet protokolü yönlendirme.[46]

Grafiklere genelleme

İkili arama, hedef değerin bir dizi öğesi yerine bir tepe noktasında depolandığı belirli grafik türleri üzerinde çalışmak üzere genelleştirilmiştir. İkili arama ağaçları böyle bir genellemedir - ağaçtaki bir tepe noktası (düğüm) sorgulandığında, algoritma ya tepe noktasının hedef olduğunu ya da hedefin hangi alt ağacın içinde yer alacağını öğrenir. Bununla birlikte, bu daha fazla genelleştirilebilir. aşağıdaki: Yönlendirilmemiş, pozitif ağırlıklı bir grafik ve bir hedef tepe noktası verildiğinde, algoritma bir tepe noktasını sorguladığında hedefe eşit olduğunu öğrenir veya sorgulanan tepe noktasından hedefe en kısa yolda olan bir olay kenarı verilir. Standart ikili arama algoritması, basitçe grafiğin bir yol olduğu durumdur. Benzer şekilde, ikili arama ağaçları, sorgulanan tepe noktası hedefe eşit olmadığında sol veya sağ alt ağaçların kenarlarının verildiği durumdur. Yönlendirilmemiş, pozitif ağırlıklı tüm grafikler için, hedef tepe noktasını bulan bir algoritma vardır. en kötü durumda sorgular.[48]

Gürültülü ikili arama

Gürültülü ikili aramada, bir karşılaştırmanın yanlış olma olasılığı vardır.

Gürültülü ikili arama algoritmaları, algoritmanın dizinin öğelerini güvenilir bir şekilde karşılaştıramadığı durumu çözer. Her bir öğe çifti için, algoritmanın yanlış karşılaştırma yapması için belirli bir olasılık vardır. Gürültülü ikili arama, verilen konumun güvenilirliğini kontrol eden belirli bir olasılıkla hedefin doğru konumunu bulabilir. Her gürültülü ikili arama prosedürü en azından ortalama karşılaştırmalar, nerede ... ikili entropi işlevi ve prosedürün yanlış pozisyon vermesi olasılığıdır.[49][50][51] Gürültülü ikili arama problemi, bir durum olarak düşünülebilir. Rényi-Ulam oyunu,[52] bir varyantı Yirmi Soru cevaplar yanlış olabilir.[53]

Kuantum ikili arama

Klasik bilgisayarlar, tam olarak en kötü durumla sınırlıdır. ikili arama yaparken yinelemeler. Kuantum algoritmaları ikili arama için hala bir oranla sınırlıdır sorgular (klasik prosedürün yinelemelerini temsil eder), ancak sabit faktör birden küçüktür ve daha düşük bir zaman karmaşıklığı sağlar. kuantum bilgisayarlar. Hiç tam kuantum ikili arama prosedürü - yani her zaman doğru sonucu veren bir prosedür - en azından en kötü durumda sorgular, nerede ... doğal logaritma.[54] There is an exact quantum binary search procedure that runs in queries in the worst case.[55] Karşılaştırıldığında, Grover algoritması is the optimal quantum algorithm for searching an unordered list of elements, and it requires sorguları.[56]

Tarih

The idea of sorting a list of items to allow for faster searching dates back to antiquity. The earliest known example was the Inakibit-Anu tablet from Babylon dating back to c. MÖ 200. The tablet contained about 500 Altmışlık numbers and their karşılıklılar sorted in Sözlük düzeni, which made searching for a specific entry easier. In addition, several lists of names that were sorted by their first letter were discovered on the Ege adaları. Katolikon, a Latin dictionary finished in 1286 CE, was the first work to describe rules for sorting words into alphabetical order, as opposed to just the first few letters.[9]

1946'da, John Mauchly made the first mention of binary search as part of the Moore Okul Dersleri, a seminal and foundational college course in computing.[9] 1957'de William Wesley Peterson published the first method for interpolation search.[9][57] Every published binary search algorithm worked only for arrays whose length is one less than a power of two[ben] until 1960, when Derrick Henry Lehmer published a binary search algorithm that worked on all arrays.[59] In 1962, Hermann Bottenbruch presented an ALGOL 60 implementation of binary search that placed the comparison for equality at the end, increasing the average number of iterations by one, but reducing to one the number of comparisons per iteration.[8] uniform binary search was developed by A. K. Chandra of Stanford Üniversitesi 1971'de.[9] 1986'da Bernard Chazelle ve Leonidas J. Guibas tanıtıldı fractional cascading as a method to solve numerous search problems in hesaplamalı geometri.[46][60][61]

Uygulama sorunları

Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky

Ne zaman Jon Bentley assigned binary search as a problem in a course for professional programmers, he found that ninety percent failed to provide a correct solution after several hours of working on it, mainly because the incorrect implementations failed to run or returned a wrong answer in rare uç durumlarda.[62] A study published in 1988 shows that accurate code for it is only found in five out of twenty textbooks.[63] Furthermore, Bentley's own implementation of binary search, published in his 1986 book İncileri Programlama, contained an overflow error that remained undetected for over twenty years. Java programlama dili library implementation of binary search had the same overflow bug for more than nine years.[64]

In a practical implementation, the variables used to represent the indices will often be of fixed size, and this can result in an aritmetik taşma for very large arrays. If the midpoint of the span is calculated as , then the value of may exceed the range of integers of the data type used to store the midpoint, even if ve are within the range. Eğer ve are nonnegative, this can be avoided by calculating the midpoint as .[65]

An infinite loop may occur if the exit conditions for the loop are not defined correctly. bir Zamanlar aşıyor , the search has failed and must convey the failure of the search. In addition, the loop must be exited when the target element is found, or in the case of an implementation where this check is moved to the end, checks for whether the search was successful or failed at the end must be in place. Bentley found that most of the programmers who incorrectly implemented binary search made an error in defining the exit conditions.[8][66]

Library support

Many languages' standart kitaplıklar include binary search routines:

  • C sağlar işlevi bsearch() onun içinde standart kitaplık, which is typically implemented via binary search, although the official standard does not require it so.[67]
  • C ++ 's Standart Şablon Kitaplığı provides the functions binary_search(), lower_bound(), upper_bound() ve equal_range().[68]
  • D 's standard library Phobos, in std.range module provides a type SortedRange (returned by sort() ve assumeSorted() functions) with methods içerir (), equaleRange(), lowerBound() ve trisect(), that use binary search techniques by default for ranges that offer random access.[69]
  • COBOL sağlar SEARCH ALL verb for performing binary searches on COBOL ordered tables.[70]
  • Git 's çeşit standard library package contains the functions Arama, SearchInts, SearchFloat64s, ve SearchStrings, which implement general binary search, as well as specific implementations for searching slices of integers, floating-point numbers, and strings, respectively.[71]
  • Java offers a set of aşırı yüklenmiş binarySearch() static methods in the classes Diziler ve Koleksiyonlar standartta java.util package for performing binary searches on Java arrays and on Listes, respectively.[72][73]
  • Microsoft 's .NET Framework 2.0 offers static genel versions of the binary search algorithm in its collection base classes. Bir örnek olabilir System.Array's method BinarySearch(T[] array, T value).[74]
  • İçin Amaç-C, Kakao framework provides the NSArray -indexOfObject:inSortedRange:options:usingComparator: method in Mac OS X 10.6+.[75] Elmalar Çekirdek Vakfı C framework also contains a CFArrayBSearchValues() işlevi.[76]
  • Python sağlar bisect modül.[77]
  • Yakut 's Array class includes a bsearch method with built-in approximate matching.[78]

Ayrıca bakınız

Notlar ve referanslar

Bu makale şu adrese gönderildi WikiJournal of Science harici için akademik akran değerlendirmesi in 2018 (gözden geçiren raporları ). Güncellenen içerik, Wikipedia sayfasına bir CC-BY-SA-3.0 lisans (2019 ). Kaydın incelenen versiyonu: Anthony Lin; et al. (2 July 2019), "Binary search algorithm" (PDF), WikiJournal of Science, 2 (1): 5, doi:10.15347/WJS/2019.005, ISSN  2470-6345, Vikiveri  Q81434400

Notlar

  1. ^ dır-dir Büyük O gösterimi, ve ... logaritma. In Big O notation, the base of the logarithm does not matter since every logarithm of a given base is a constant factor of another logarithm of another base. Yani, .
  2. ^ Any search algorithm based solely on comparisons can be represented using a binary comparison tree. Bir internal path is any path from the root to an existing node. İzin Vermek ol internal path length, the sum of the lengths of all internal paths. If each element is equally likely to be searched, the average case is or simply one plus the average of all the internal path lengths of the tree. This is because internal paths represent the elements that the search algorithm compares to the target. The lengths of these internal paths represent the number of iterations sonra the root node. Adding the average of these lengths to the one iteration at the root yields the average case. Therefore, to minimize the average number of comparisons, the internal path length must be minimized. It turns out that the tree for binary search minimizes the internal path length. Knuth 1998 proved that the external path length (the path length over all nodes where both children are present for each already-existing node) is minimized when the external nodes (the nodes with no children) lie within two consecutive levels of the tree. This also applies to internal paths as internal path length is linearly related to external path length . For any tree of nodes, . When each subtree has a similar number of nodes, or equivalently the array is divided into halves in each iteration, the external nodes as well as their interior parent nodes lie within two levels. It follows that binary search minimizes the number of average comparisons as its comparison tree has the lowest possible internal path length.[14]
  3. ^ Knuth 1998 showed on his MIX computer model, which Knuth designed as a representation of an ordinary computer, that the average running time of this variation for a successful search is units of time compared to units for regular binary search. The time complexity for this variation grows slightly more slowly, but at the cost of higher initial complexity. [18]
  4. ^ Knuth 1998 performed a formal time performance analysis of both of these search algorithms. On Knuth's MIX computer, which Knuth designed as a representation of an ordinary computer, binary search takes on average units of time for a successful search, while linear search with a sentinel düğüm at the end of the list takes birimleri. Linear search has lower initial complexity because it requires minimal computation, but it quickly outgrows binary search in complexity. On the MIX computer, binary search only outperforms linear search with a sentinel if .[14][23]
  5. ^ Inserting the values in sorted order or in an alternating lowest-highest key pattern will result in a binary search tree that maximizes the average and worst-case search time.[28]
  6. ^ It is possible to search some hash table implementations in guaranteed constant time.[33]
  7. ^ This is because simply setting all of the bits which the hash functions point to for a specific key can affect queries for other keys which have a common hash location for one or more of the functions.[38]
  8. ^ There exist improvements of the Bloom filter which improve on its complexity or support deletion; for example, the cuckoo filter exploits cuckoo hashing to gain these advantages.[38]
  9. ^ That is, arrays of length 1, 3, 7, 15, 31 ...[58]

Alıntılar

  1. ^ Williams, Jr., Louis F. (22 April 1976). A modification to the half-interval search (binary search) method. Proceedings of the 14th ACM Southeast Conference. ACM. s. 95–101. doi:10.1145/503561.503582. Arşivlendi 12 Mart 2017'deki orjinalinden. Alındı 29 Haziran 2018.
  2. ^ a b Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Binary search".
  3. ^ Butterfield & Ngondi 2016, s. 46.
  4. ^ Cormen et al. 2009, s. 39.
  5. ^ Weisstein, Eric W. "Binary search". MathWorld.
  6. ^ a b Flores, Ivan; Madpis, George (1 September 1971). "Average binary search length for dense ordered lists". ACM'nin iletişimi. 14 (9): 602–603. doi:10.1145/362663.362752. ISSN  0001-0782. S2CID  43325465.
  7. ^ a b c Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Algorithm B".
  8. ^ a b c d Bottenbruch, Hermann (1 April 1962). "Structure and use of ALGOL 60". ACM Dergisi. 9 (2): 161–221. doi:10.1145/321119.321120. ISSN  0004-5411. S2CID  13406983.CS1 bakimi: ref = harv (bağlantı) Procedure is described at p. 214 (§43), titled "Program for Binary Search".
  9. ^ a b c d e f Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "History and bibliography".
  10. ^ a b Kasahara & Morishita 2006, s. 8–9.
  11. ^ a b c Sedgewick & Wayne 2011, §3.1, subsection "Rank and selection".
  12. ^ a b c Goldman & Goldman 2008, pp. 461–463.
  13. ^ Sedgewick & Wayne 2011, §3.1, subsection "Range queries".
  14. ^ a b c d e f g h ben j k l Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Further analysis of binary search".
  15. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), "Theorem B".
  16. ^ Chang 2003, s. 169.
  17. ^ a b c Knuth 1997, §2.3.4.5 ("Path length").
  18. ^ a b Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Exercise 23".
  19. ^ Rolfe, Timothy J. (1997). "Analytic derivation of comparisons in binary search". ACM SIGNUM Haber Bülteni. 32 (4): 15–19. doi:10.1145/289251.289255. S2CID  23752485.
  20. ^ Khuong, Paul-Virak; Morin, Pat (2017). "Array Layouts for Comparison-Based Searching". Deneysel Algoritmalar Dergisi. 22. Madde 1.3. arXiv:1509.05053. doi:10.1145/3053370. S2CID  23752485.
  21. ^ Knuth 1997, §2.2.2 ("Sequential Allocation").
  22. ^ a b c d Beame, Paul; Fich, Faith E. (2001). "Optimal bounds for the predecessor problem and related problems". Bilgisayar ve Sistem Bilimleri Dergisi. 65 (1): 38–72. doi:10.1006/jcss.2002.1822.
  23. ^ Knuth 1998, Answers to Exercises (§6.2.1) for "Exercise 5".
  24. ^ Knuth 1998, §6.2.1 ("Searching an ordered table").
  25. ^ Knuth 1998, §5.3.1 ("Minimum-Comparison sorting").
  26. ^ Sedgewick & Wayne 2011, §3.2 ("Ordered symbol tables").
  27. ^ Sedgewick & Wayne 2011, §3.2 ("Binary Search Trees"), subsection "Order-based methods and deletion".
  28. ^ Knuth 1998, §6.2.2 ("Binary tree searching"), subsection "But what about the worst case?".
  29. ^ Sedgewick & Wayne 2011, §3.5 ("Applications"), "Which symbol-table implementation should I use?".
  30. ^ Knuth 1998, §5.4.9 ("Disks and Drums").
  31. ^ Knuth 1998, §6.2.4 ("Multiway trees").
  32. ^ Knuth 1998, §6.4 ("Hashing").
  33. ^ Knuth 1998, §6.4 ("Hashing"), subsection "History".
  34. ^ Dietzfelbinger, Martin; Karlin, Anna; Mehlhorn, Kurt; Meyer auf der Heide, Friedhelm; Rohnert, Hans; Tarjan, Robert E. (Ağustos 1994). "Dynamic perfect hashing: upper and lower bounds". Bilgi İşlem Üzerine SIAM Dergisi. 23 (4): 738–761. doi:10.1137 / S0097539791194094.
  35. ^ Morin, Pat. "Hash tables" (PDF). s. 1. Alındı 28 Mart 2016.
  36. ^ Knuth 2011, §7.1.3 ("Bitwise Tricks and Techniques").
  37. ^ a b Silverstein, Alan, Judy IV shop manual (PDF), Hewlett Packard, s. 80–81
  38. ^ a b Fan, Bin; Andersen, Dave G.; Kaminsky, Michael; Mitzenmacher, Michael D. (2014). Cuckoo filter: practically better than Bloom. Proceedings of the 10th ACM International on Conference on Emerging Networking Experiments and Technologies. s. 75–88. doi:10.1145/2674005.2674994.
  39. ^ Bloom, Burton H. (1970). "Space/time trade-offs in hash coding with allowable errors". ACM'nin iletişimi. 13 (7): 422–426. CiteSeerX  10.1.1.641.9096. doi:10.1145/362686.362692. S2CID  7931252.
  40. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "An important variation".
  41. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Algorithm U".
  42. ^ Moffat & Turpin 2002, s. 33.
  43. ^ a b c Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Interpolation search".
  44. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Exercise 22".
  45. ^ Perl, Yehoshua; Itai, Alon; Avni, Haim (1978). "Interpolation search—a log log n search". ACM'nin iletişimi. 21 (7): 550–553. doi:10.1145/359545.359557. S2CID  11089655.
  46. ^ a b c Chazelle, Bernard; Liu, Ding (6 July 2001). Lower bounds for intersection searching and fractional cascading in higher dimension. 33. Bilgisayar Kuramı Üzerine ACM Sempozyumu. ACM. s. 322–329. doi:10.1145/380752.380818. ISBN  978-1-58113-349-3. Alındı 30 Haziran 2018.
  47. ^ Chazelle, Bernard; Liu, Ding (1 March 2004). "Lower bounds for intersection searching and fractional cascading in higher dimension" (PDF). Bilgisayar ve Sistem Bilimleri Dergisi. 68 (2): 269–284. CiteSeerX  10.1.1.298.7772. doi:10.1016/j.jcss.2003.07.003. ISSN  0022-0000. Alındı 30 Haziran 2018.
  48. ^ Emamjomeh-Zadeh, Ehsan; Kempe, David; Singhal, Vikrant (2016). Deterministic and probabilistic binary search in graphs. 48. Bilgisayar Kuramı Üzerine ACM Sempozyumu. pp. 519–532. arXiv:1503.00805. doi:10.1145/2897518.2897656.
  49. ^ Ben-Or, Michael; Hassidim, Avinatan (2008). "The Bayesian learner is optimal for noisy binary search (and pretty good for quantum as well)" (PDF). 49 Bilgisayar Biliminin Temelleri Sempozyumu. s. 221–230. doi:10.1109/FOCS.2008.58. ISBN  978-0-7695-3436-7.CS1 bakimi: ref = harv (bağlantı)
  50. ^ Pelc, Andrzej (1989). "Searching with known error probability". Teorik Bilgisayar Bilimleri. 63 (2): 185–202. doi:10.1016/0304-3975(89)90077-7.
  51. ^ Rivest, Ronald L.; Meyer, Albert R.; Kleitman, Daniel J.; Winklmann, K. Coping with errors in binary search procedures. 10 Bilgisayar Kuramı Üzerine ACM Sempozyumu. doi:10.1145/800133.804351.
  52. ^ Pelc, Andrzej (2002). "Searching games with errors—fifty years of coping with liars". Teorik Bilgisayar Bilimleri. 270 (1–2): 71–109. doi:10.1016/S0304-3975(01)00303-6.
  53. ^ Rényi, Alfréd (1961). "On a problem in information theory". Magyar Tudományos Akadémia Matematikai Kutató Intézetének Közleményei (Macarca). 6: 505–516. BAY  0143666.
  54. ^ Høyer, Peter; Neerbek, Jan; Shi, Yaoyun (2002). "Quantum complexities of ordered searching, sorting, and element distinctness". Algoritma. 34 (4): 429–448. arXiv:quant-ph/0102078. doi:10.1007/s00453-002-0976-3. S2CID  13717616.CS1 bakimi: ref = harv (bağlantı)
  55. ^ Childs, Andrew M .; Landahl, Andrew J.; Parrilo, Pablo A. (2007). "Quantum algorithms for the ordered search problem via semidefinite programming". Fiziksel İnceleme A. 75 (3). 032335. arXiv:quant-ph/0608161. Bibcode:2007PhRvA..75c2335C. doi:10.1103/PhysRevA.75.032335. S2CID  41539957.CS1 bakimi: ref = harv (bağlantı)
  56. ^ Grover, Lov K. (1996). A fast quantum mechanical algorithm for database search. 28'i Bilgisayar Kuramı Üzerine ACM Sempozyumu. Philadelphia, PA. pp. 212–219. arXiv:quant-ph/9605043. doi:10.1145/237814.237866.
  57. ^ Peterson, William Wesley (1957). "Addressing for random-access storage". IBM Araştırma ve Geliştirme Dergisi. 1 (2): 130–146. doi:10.1147/rd.12.0130.
  58. ^ "2n−1". OEIS A000225 Arşivlendi 8 Haziran 2016 Wayback Makinesi. Erişim tarihi: 7 Mayıs 2016.
  59. ^ Lehmer, Derrick (1960). Teaching combinatorial tricks to a computer. Uygulamalı Matematikte Sempozyum Bildirileri. 10. s. 180–181. doi:10.1090/psapm/010.
  60. ^ Chazelle, Bernard; Guibas, Leonidas J. (1986). "Fractional cascading: I. A data structuring technique" (PDF). Algoritma. 1 (1–4): 133–162. CiteSeerX  10.1.1.117.8349. doi:10.1007/BF01840440. S2CID  12745042.
  61. ^ Chazelle, Bernard; Guibas, Leonidas J. (1986), "Fractional cascading: II. Applications" (PDF), Algoritma, 1 (1–4): 163–191, doi:10.1007/BF01840441, S2CID  11232235
  62. ^ Bentley 2000, §4.1 ("The Challenge of Binary Search").
  63. ^ Pattis, Richard E. (1988). "Textbook errors in binary searching". SIGCSE Bülteni. 20: 190–194. doi:10.1145/52965.53012.
  64. ^ Bloch, Joshua (2 June 2006). "Extra, extra – read all about it: nearly all binary searches and mergesorts are broken". Google Research Blog. Arşivlendi 1 Nisan 2016'daki orjinalinden. Alındı 21 Nisan 2016.
  65. ^ Ruggieri, Salvatore (2003). "On computing the semi-sum of two integers" (PDF). Bilgi İşlem Mektupları. 87 (2): 67–71. CiteSeerX  10.1.1.13.5631. doi:10.1016/S0020-0190(03)00263-1. Arşivlendi (PDF) 3 Temmuz 2006'daki orjinalinden. Alındı 19 Mart 2016.
  66. ^ Bentley 2000, §4.4 ("Principles").
  67. ^ "bsearch – binary search a sorted table". The Open Group Base Specifications (7. baskı). Açık Grup. 2013. Arşivlendi 21 Mart 2016'daki orjinalinden. Alındı 28 Mart 2016.
  68. ^ Stroustrup 2013, s. 945.
  69. ^ "std.range - D Programming Language". dlang.org. Alındı 29 Nisan 2020.
  70. ^ Unisys (2012), COBOL ANSI-85 programming reference manual, 1, pp. 598–601
  71. ^ "Package sort". Go Programlama Dili. Arşivlendi 25 Nisan 2016'daki orjinalinden. Alındı 28 Nisan 2016.
  72. ^ "java.util.Arrays". Java Platform Standard Edition 8 Documentation. Oracle Corporation. Arşivlendi 29 Nisan 2016 tarihinde orjinalinden. Alındı 1 Mayıs 2016.
  73. ^ "java.util.Collections". Java Platform Standard Edition 8 Documentation. Oracle Corporation. Arşivlendi 23 Nisan 2016'daki orjinalinden. Alındı 1 Mayıs 2016.
  74. ^ "List.BinarySearch method (T)". Microsoft Geliştirici Ağı. Arşivlendi 7 Mayıs 2016 tarihinde orjinalinden. Alındı 10 Nisan 2016.
  75. ^ "NSArray". Mac Geliştirici Kitaplığı. Apple Inc. Arşivlendi 17 Nisan 2016'daki orjinalinden. Alındı 1 Mayıs 2016.
  76. ^ "CFArray". Mac Geliştirici Kitaplığı. Apple Inc. Arşivlendi 20 Nisan 2016'daki orjinalinden. Alındı 1 Mayıs 2016.
  77. ^ "8.6. bisect — Array bisection algorithm". The Python Standard Library. Python Yazılım Vakfı. Arşivlendi 25 Mart 2018 tarihli orjinalinden. Alındı 26 Mart 2018.
  78. ^ Fitzgerald 2015, s. 152.

Kaynaklar

Dış bağlantılar