İnterpolasyon arama vs İkili Arama


13

İkili arama yerine enterpolasyon aramasını ne zaman kullanmalıyım?

Örneğin, sıralı bir veri kümem var, bu veri kümesindeki bir öğeyi bulmak için hangi durumlarda ikili aramayı kullanabilirim veya hangi durumda enterpolasyon araması kullanmalıyım?

Veri kümesinin hangi özellikleri belirleyici faktör olur?

Yanıtlar:


12

Açıkçası, bir enterpolasyon araması yapmak için, siparişten daha fazla bilinen bir anahtar türüne ihtiyacınız vardır - hangisinin daha büyük veya daha az.

Veri kümesinin özellikleri gittikçe, çoğunlukla bir mülke gelir: anahtarların olasılıklar arasında makul olarak eşit derecede (veya en azından tahmin edilebilir şekilde) dağılma olasılığı. Bu olmadan, bir enterpolasyon araması aslında bir ikili aramadan daha yavaş olabilir .

Örneğin, küçük harfli dizelerden oluşan bir veri kümesini anahtar olarak düşünün. Diyelim ki "x" ile başlayan bir anahtarınız var. Bir enterpolasyon araması, kümenin sonuna çok yakın aramaya başlamanız gerektiğini açıkça gösterecektir. Bununla birlikte, anahtarlarınızın çoğu aslında 'z' ile başlıyorsa ve 'a' olsa 'y'den herhangi bir şeyle başlamazsa, aradığınız anahtar aslında kümenin başlangıcına çok yakın olabilir. Arama, 'w' ile başlayan dizenin bulunduğu başlangıca yaklaşmadan önce önemli sayıda yineleme yapabilir / alabilir. Her yineleme, veri kümesinin yalnızca% ~ 10'unu dikkate alır, bu nedenle 'w' ile başlayan anahtarların başlangıcına yaklaşmadan önce birkaç yineleme gerekir.

Buna karşılık, ikili bir arama ortada başlar , ikinci yinelemede bir çeyrek işarete, üçüncüde bir sekizinci işarete vb. Performansı, anahtarlardaki eğriden neredeyse etkilenmeyecekti. Her yineleme, sanki anahtarlar eşit dağıtılmış gibi, veri kümesinin yarısını dikkate alacaktır.

Ben gerçekten sürer Ancak, eklemek için acele oldukça bir interpolasyon bir ikili arama daha hissedilir derecede kötü aramak yapmak için bir çarpık dağılımı. Örneğin, makul miktarda yerelleştirilmiş kümelenme varlığında bile oldukça iyi performans gösterebilir.

Bir enterpolasyon aramasının mutlaka lineer enterpolasyon kullanması gerekmediğinden de bahsetmeliyim. Örneğin, anahtarlarınızın doğrusal olmayan bir dağılımı (ör. Çan eğrisi) izlediği biliniyorsa, sonuçları eşit bir dağılımdan biraz farklı hale getirmek için enterpolasyon fonksiyonunda bunu dikkate almak oldukça kolay hale gelir.


1
Açıkladığınız sorun, aralığı belirlemek için ilk ve son öğeleri kullanarak kolayca ayarlanabiliyor.
Malfist

2
@Malfist: Bu yardımcı olabilir, ancak sorunu düzeltmek zorunda değildir. Örnekte, 'a' ile 'q' arasındaki herhangi bir şeyle başlayan sıfır anahtarınız varsa , enterpolasyon oldukça sorunsuz olur. aBununla birlikte, başlayan tek bir aykırı değer, performansı önemli ölçüde incitecektir.
Jerry Coffin

1

Muhtemelen soru, aslında ikili aramadan daha iyi olan bir enterpolasyon fonksiyonu ile ne kadar kolay bir şekilde ortaya çıkabileceğinizi düşünürüm.

Enterpolasyon Arama'da Wikipedia'dan:

Big-O gösterimini kullanarak, enterpolasyon algoritmasının N boyutundaki bir veri setindeki performansı O (N) 'dir; ancak enterpolasyon için kullanılan doğrusal ölçekte verilerin tekdüze bir dağılımı varsayımı altında, performans O (log log N) olarak gösterilebilir.

İnterpolasyon aramasının pratik performansı, azaltılmış prob sayısının, her prob için gerekli olan daha karmaşık hesaplamalarla daha ağır basıp aşılmadığına bağlıdır. Her sondanın bir disk araması içerdiği ve enterpolasyon aritmetiğinden çok daha yavaş olduğu disk üzerindeki büyük bir sıralanmış dosyada bir kayıt bulmak için yararlı olabilir.

B ağaçları gibi dizin yapıları da disk erişim sayısını azaltır ve birçok veri türünü endeksleyebildikleri ve çevrimiçi olarak güncellenebildikleri için diskteki verileri kısmen endekslemek için daha sık kullanılır. Yine de, enterpolasyon araması, sıralı ancak dizine eklenmemiş belirli disk veri kümelerini aramak zorunda kaldığında faydalı olabilir.


0

İkili arama ve enterpolasyon araması, doğrusal arama yöntemleri olarak kabul edilir.

Her ikisi de, aranan listenin anahtar olarak adlandırılan sütunda sıralanmasını bekler . Bu çok önemli.

İkili arama, diziler veya sayılar için, sıralı olarak saklandıkları sürece çalışır. İkili aramanın arkasındaki ana fikir, orta öğenin incelenmesine dayanmasıdır. İnterpolasyon araması bir varyanttır. Tam orta elemanı kullanmak yerine, geçilen değerle karşılaştırılacak bir sonraki elemanın nerede olduğunu tahmin eder. İnterpolasyon arama algoritmasının bir sonraki anahtar değerini nasıl hesapladığıyla ilgili ayrıntılar için JB King yanıtı veya aşağıdaki yanıtta verilen referansa bakın .

"İnterpolasyon araması, sadece düzgün dağılımlı sıralı diziler düzeninde düzenlenmiş sayısal elemanlar üzerinde çalışır (yani, ardışık elemanlar arasındaki aralık kabaca sabittir" (P 737'nin altındaki referanstan alıntı, ayrıca farklı doğrusal arama yöntemleri arasındaki performans karşılaştırması dahil edilmiştir) ).

Google Kitaplar - Klasik Veri Yapıları 2Nd Ed.

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.