Sıralı verilere ihtiyaç duyan ikili arama neden doğrusal aramadan daha iyi kabul edilir?


20

Doğrusal aramanın saf bir yaklaşım olduğunu ve ikili aramanın daha iyi asimptotik karmaşıklık nedeniyle performanstan daha iyi olduğunu her zaman duydum. Ama ikili arama önce sıralama gerektiğinde neden doğrusal arama daha iyi olduğunu anlamadım?

Doğrusal arama O(n)ve ikili arama O(log n). Bu ikili aramanın daha iyi olduğunu söylemenin temeli gibi görünüyor. Ancak ikili arama,O(n log n) , en iyi algoritmalar için . Yani ikili arama daha hızlı aslında olmamalı olarak o sıralama gerektirir.

Yazarın naif doğrusal arama yaklaşımını kullanmak yerine ekleme sıralamasında öğenin eklenmesi gereken yeri bulmak için ikili arama kullanmak daha iyi ima CLRS okuyorum. Bu durumda, her döngü yinelemesinde ikili aramanın uygulanabileceği sıralı bir liste olduğu için bu haklı görünmektedir. Ancak, arama yapmamız gereken veri kümesi hakkında hiçbir garanti olmadığı genel durumda, ikili aramayı sıralama gereksinimleri nedeniyle doğrusal aramadan daha kötü kullanmıyor musunuz?

İkili aramayı doğrusal aramadan daha iyi yapan, göz ardı ettiğim pratik hususlar var mı? Veya ikili arama, sıralama için gerekli hesaplama süresini dikkate almadan doğrusal aramadan daha iyi olarak mı değerlendirilir?


6
Diğer pek çok şeyde olduğu gibi, hepsi
Jeff B

Liste zaten sıralandıysa, doğrusal aramanın hala daha iyi olduğunu mu düşünüyorsunuz? Burada dikkate alınması gereken bir şey olabilir.
JB King

3
Başlığı değiştirmeyi düşünen herkes için lütfen sıralı verilerle ilgili bölümü çıkarmayın, çünkü bunu kaldırmak tamamen farklı bir soru gibi görünür.
Aseem Bansal

Yanıtlar:


53

İkili aramayı doğrusal aramadan daha iyi yapan hangi göz ardı ettiğim herhangi bir pratik husus var mı?

Evet - O (n log n) sıralamasını yalnızca bir kez yapmanız gerekir ve sonra O (log n) ikili aramasını istediğiniz sıklıkta yapabilirsiniz, oysa doğrusal arama her seferinde O (n) olur.

Tabii ki, bu sadece aynı veriler üzerinde birden fazla arama yaparsanız bir avantajdır. Ancak "bir kez yaz, sık oku" senaryoları oldukça yaygındır.


Sadece bir kez bir şey yapıyorsanız, onu optimize etmenin pek bir anlamı yoktur.

14

Temel varsayım, bir arama yapmamanızdır.

Aynı verileri birden çok kez aramanız gerekiyorsa, yalnızca bir kez sıralamanız gerekir ve ikili aramadan kâr elde edebilirsiniz.

Sık sık arama yapıyorsanız ve verileri değiştiriyorsanız, yeni girişlerin listeye sıralandığı sıralanmış bir liste kullanmaya değer.

Dolayısıyla, aynı listeye başvurmaya gerek kalmadan birden çok kez arama yaptığınızda temel olarak ikili arama daha iyidir.

Arama yapmadan önce her seferinde sıralamanız gerektiğinde avantajı yoktur.

Liste zaten sıralandığında (veya neredeyse sıralandığında) çok hızlı sıralama algoritmalarının bulunduğunu lütfen unutmayın. Çoğu performans belirlemesi sıralanmamış bir liste bekler.


2
Sık arama yapar ve sık sık eklerseniz, daha karmaşık veri yapılarına (örn. İkili ağaçlar) bakabilirsiniz.
MarkJ

@MarkJ orijinal posterin temel sorusu bir listede arama yapmaktı. Yoksa sana tamamen katılıyorum.
Uwe Plonus

7

çünkü sıralı bir listeye sahip olduğunuzda, her seferinde yeniden sıralamanız gerekmez, yani O (giriş n) 'den fazla aramalarınız varsa, önceden sıralama yapmak kazanç kazancınızı ( O(n log n + k log n)vsO(k*n)


5

İki telefon defteri düşünün.

Bir telefon rehberinin adları alfabetik sıradadır. İstediğiniz girişi bulmak için, ortada açılır, girişi kontrol edersiniz, ardından abartmanıza veya altını çizmenize bağlı olarak ileri veya geri hareket edersiniz.

Diğer telefon rehberinin adları rastgele sıradadır. İstediğiniz girişi bulmak için, başlangıçtan başlayıp istediğinizi bulana kadar devam edersiniz.

İkinci kitap herhangi bir büyüklükteki şehirde çalışacak mı?


3

İkili aramanın doğrusal arama üzerindeki değerinin bağlamsal olduğunu düşünüyorum. Çok büyük bir sıralanmamış veri kümesiyle başlıyorsanız ve ondan sadece az sayıda öğe koparmayı planlıyorsanız, ikili bir aramayı sıralamak ve gerçekleştirmek yavaş olacaktır. Bununla birlikte, uygulamanızın ömrü boyunca sıralı bir liste tutar ve düzenli olarak erişirseniz, ikili arama gitmek için çok daha iyi bir yoldur.


3

Diğerlerinin yanıtladığı gibi, ikili arama gerçekten tercih edilir, çünkü sıralama adımı sadece bir kez yapılabilir ve gerçek arama daha sonra istediğiniz kadar yapılabilir. Bununla birlikte, belirli n değerleri (yani belirli giriş boyutları) için ikili arama her zaman doğrusal aramadan daha fazla performans gösterir (tek bir çalışma için bile).

"Devrilme noktası", asimptotik karmaşıklık denkleminin çözülmesiyle hesaplanır:

n log n + log n = n

Eğer gibi Wolfram Alpha görmek için sayısal bir değer yoktur n bu ikili arama ve sıralama her zaman daha hızlı yalnız doğrusal arama daha olmasını sağlar söyledi. Elbette sizin durumunuzda çalışan n'nin gerçek değeri, tahmin edilmesi zor olabilecek birçok faktöre bağlıdır.

Göre bu ilginç makalesinde güncel işlemcilerde derinlik performans ölçümlerinde bazı güzel içerir Mark Probst tarafından:

Sıralı bir tamsayı dizisi aramanız gerekiyorsa ve performans gerçekten, gerçekten önemliyse, diziniz yaklaşık 64 öğenin altındaysa doğrusal aramayı, yukarıdaki ise ikili aramayı kullanın.


2

Layman'ın sözleriyle:

On milyar öğeyle sıralanmamış bir listeniz varsa ve aradığınız öğe sonuncusuysa, on milyar öğeyi okuyacaksınız.

İkili arama durumunda, indeksleme sadece bir kez yapılabilir. Düzeni korumak için daha sonraki yerleştirmeler daha sonra yapılabilir.


2

"İkili arama daha iyidir" için birçok iyi neden zaten listelenmiş olsa da, avantajlara kullanıcı açısından da bakabiliriz:

Sıralı bir ekleme yaptığınızda veri giriş işlemleri arasındaki küçük bekleme süresi bölünmesiyle normal olarak çok iyi yaşayabilirsiniz, ancak "aramanın" mümkün olduğunca hızlı olmasını istersiniz. Bir kullanıcının bakış açısından, ikili aramayla birlikte sıralanmış kesici uç, mümkün olan en iyi kullanıcı deneyimini sunar.

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.