Bu algoritma hala bir İkili Arama algoritması olarak kabul edilebilir mi?


14

İkinci kodu kata yaparken (her seferinde farklı bir yöntemle beş kez bir ikili arama algoritması uygulamanızı ister), aşağıdaki gibi çalışan biraz farklı bir çözüm buldum:

Eğer uzunluk 100 sıralı bir dizi varsa ve onun başlangıç ​​alanı 200 sayısını içerir ve onun bitiş alanı 400 sayısını içerir, ben, bir insan okuyan bir matematik olarak, ben eğer ben aradım 35 alan etrafında arama başlatmak için büyük olasılıkla normal bir ikili arama algoritmasında olduğu gibi 50 alanını değil.

Daha sonra, dizinin 35. alanındaki sayı 270 ise, aradığım dizin 35'tir.

Eğer durum böyle değilse, aldığım sayıyı karşılaştırabilirim (diyelim ki 280) ve dizinin alt kısmını alarak işlemi tekrarlayabilirim (böylece 35 alan içeren başlangıç ​​alanı 200 ve bitiş alanı 280 içeren) Bulduğum sayı, aradığımdan veya dizinin üst kısmından daha büyüktür (diyelim ki 260'um var: şimdi 65 dizinim var, ilki 260 içeren ve sonuncusu 400 içeren. tüm alt dizinin dizin 39'u olan bu alt dizinin dizin 4'ü), aldığım sayı aradığım sayıdan küçükse.

Soru şudur: Bu algoritma ikili bir arama algoritması olarak düşünülebilir mi? Değilse, kendi adı var mı?


2
İkili arama olup olmadığı sadece bir fikir meselesi gibi görünüyor. Temel olarak, verebileceğiniz tek cevap ya "Evet, ikili aramaya ikili arama adını verebilecek kadar yakın" ya da "Hayır, öyle değil" dir. Tartışma başlar.
David Richerby

Yanıtlar:


23

Buna ikili arama demezdim.

İkili aramaya açıkça benziyor ve bunu ikili aramanın iyileştirilmesi olarak görmek doğal. Bununla birlikte, önemli ölçüde farklı algoritma karmaşıklığı özelliklerine sahiptir, İnterpolasyon Arama, verilerin eşit olarak dağıtıldığı varsayılarak O (log (log (n)) çalışma süresini beklemektedir, ancak bunun O (n) en kötü vaka çalışma süresine sahip olmasıyla ödeme yapar.

"İkili aramanın en kötü çalışma zamanı O" (log (n)) "yerine" Sınırlayıcı elemanların seçimine bağlı olarak en kötü çalışma ikili çalışma zamanı O (log (n)) "demeyi tercih ederim. Bu, Enterpolasyon aramasını ikili bir arama algoritması olarak sınıflandıramayacağım anlamına gelir.


Muhtemelen enterpolasyon aramasını kötü giderken keserseniz, O (log n) en kötü durumunu ve O (log log n) değerini yeterince doğrusal verilerde tutabilirsiniz. Benim tahminime göre "Eğer giriş n denedikten sonra hedef bulamadıysanız ikili aramaya geçmek" gibi bir şey işe yarayacak, ama bunu kanıtlamak için çok tembelim. Tabii ki bunun temelde ikili aramadan iki kat daha uzun sürdüğü bir katil girdi sınıfı olacaktır.
Steve Jessop

Katil-girdi fikri ilginç. Katil girişlerin aramayı olumsuz etkilemesine izin vermek yerine (yani, bir dizinin sonuna yaklaşarak bölünerek) "bölünebilir aralığı" dizinin 2. üçte biri veya benzeri ile sınırlar / keseriz. Bu en kötü durum log3 (n) olurdu ama yine de bir günlük (log) en iyi durum tadını çıkarın.
Andrew Gallasch

1
@SteveJessop Asimotik karmaşıklığın tam bir resim olmadığını unutmayın. O (log n) çok hızlı. Ayrıca, ikili arama her döngüde çok az iş yapar. İnterpolasyon araması için problem zaten her döngüde daha fazla iş yaptığınızı telafi etmek için çok uzun bir girdiye ihtiyacınız olmasıdır. Siz buna daha fazla iş eklersiniz. Tekdüze olmayan veriler için O (n) kabul edemezsem, en iyi çözümün bazı hibrit yaklaşımlardan ziyade saf bir İkili arama yapmak olduğundan şüpheleniyorum.
Taemyr

@SteveJessop: Algoritmaları değiştirmeye gerek yok; bu paralel olarak yapılabilir. R aralığı verildiğinde, P1 noktasını ikili arama için normal orta nokta olarak ve enterpolasyon kullanarak P2'yi belirleyebilirsiniz. Artık üç alt ayarınız var, bunların hiçbiri orijinal aralığın yarısından daha büyük olamaz. Hem P1 hem de P2'ye karşı hedef değeri kontrol edin ve bu üç alt düzenlemeden
hangisinin geri çekileceğini biliyorsunuz

17

Ö(günlükgünlükn)


Güzel. Şimdi soru eğer kod kata için kullanabilirsiniz, ama bu benim sorun lol. Ben ikili arama daha karmaşık buluyorum ama neden olmasın.
user6245072

Birkaç yıl önce bir günlük dosyasını dizine eklemek için kod yazarken bunu bir kez keşfettim. Ayrıca verilerim için enterpolasyon ve ikili dilim arasındaki alternatif adımların kendi başına her iki seçenekten daha iyi olduğunu keşfettim. Bunun bir adı olup olmadığı veya bilinen bir etkisi olup olmadığından emin değilim.
Neil Slater

@NeilSlater enterpolasyon arama belki korunmuş?
Steve Cox

@SteveCox: O terimi aradım ve hiçbir şey bulamadım. Bunu yeni bir soru olarak sormaya karar verdim
Neil Slater

-1

Bence doğru terminoloji, aradokalı düşünülmüş arama olacaktır.

Düz bir dizi içinde, sonraki sayıların içinde sayıların varsayılan düz dağılımına dayanarak arama yapıyorsunuz.

Bu, bir kişinin sözlükteki bir kelimeyi nasıl arayacağına karşılık gelir. Ancak verilerin dağılımının düzensiz olması çok verimsiz olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.