SORU
16 Mart 2010, Salı


Sağa ve yukarıdan aşağıya, soldan 2 boyutlu bir dizi sipariş artan şekilde sıralanmış, belirli bir hedef numarası için arama için en iyi yolu nedir?

Son zamanlarda bu soru verildi ve bunun için iyi bir çözüm olacağını merak ediyorum.

Her yerde 2d bir dizi belirli olduğumu söylüyor dizideki sayıları artıyor sağa ve yukarıdan soldan sipariş alt.

Arama için en iyi yoldur ve ne eğer hedef bir sayı olup olmadığını belirlemek dizi?

Şimdi, ilk hevesim, benim veriler sıralanır beri ikili bir arama kullanmaktır. Eğer bir sayı(log N) zaman içinde tek bir satır olup olmadığını belirlemek olabilir. Ancak, bana atmak için 2 yol tarifi.

İşe yarayabilir diye düşündüm başka bir çözüm ortada bir yerde başlamak için. Eğer orta değer hedefim daha az ise, o zaman orta matrisin sol square bölümünde olduğundan emin olabilirim. Ben o zaman diagnally hareket ve yine hedef hedef sayısı artmaya devam benim kadar olabilecek Kare boyutunu küçültme kontrol edin.

Herkes bu sorunun çözümü için herhangi bir iyi fikirler var mı?

Örnek dizi:

Sıralanmış sağa, yukardan aşağıya.

1 2 4 5 6  
2 3 5 7 8  
4 6 8 9 10  
5 8 9 10 11  

CEVAP
16 Mart 2010, Salı


Burada basit bir yaklaşım

  1. ALT-sol köşesinde başlayın.
  2. Eğer hedef bu değerden daha az ise, bizden üstün olmalıbir yukarı hareket ettirin.
  3. Aksi takdirde, hedef sütunda olamaz kidoğru bir hareket.
  4. Git 2.

NxM bir dizi için, bu O(N M) çalışır. Daha iyi yapmak için zor olacağını düşünüyorum. :)


Düzenleme:İyi bir tartışma var. Genel durum yukarıda bahsettiğim; eğer N M küçük açıkçası, ikili arama bir yaklaşım bir şey logaritmik zaman yaklaşıyor bunun için kullanabilirsiniz.

Burada bazı ayrıntıları merak edenler için:

Tarih

Bu basit algoritma Saddleback Search denir. Bir süre geçti, ve N == M zaman en uygunu olacaktır. Bazı referanslar:

Ancak, zaman N < M, sezgi önerdiği ikili arama gerekir daha iyisini yapmak O(N M): örneğin, ne zaman N == 1, saf bir ikili arama yapar vadede logaritmik yerine lineer zaman.

En kötü durum bağlı

Richard Bird ikili Ara 2006 bir kağıt Saddleback algoritması artırabilir, bu sezgi inceledi:

Oldukça sıradışı bir konuşma tekniği, Kuş N <= M, Bu sorun bir alt Ω(N * log(M/N)) bağlı olduğunu bize gösterir. Bu N == M bize ne zaman doğrusal performans verir gibi bir anlam bağlı, N == 1 performans logaritmik.

Dikdörtgen diziler için algoritmalar

-Satır satır ikili bir arama kullanan bir yaklaşım bu gibi görünüyor:

  1. N < M nereye dikdörtgen bir dizi ile başlar. Hadi N satır M sütun olduğunu söylüyorlar.
  2. value orta sıradaki ikili bir arama yapın. Eğer onu bulursak, işimiz bitti.
  3. Aksi halde sayılar s s < value < g * * * * g, bitişik bir çift bulduk.
  4. Rakamların üstünde ve s solunda ve dikdörtgen eleyebiliriz yani value daha az.
  5. g sağ altındaki dikdörtgen eleyebiliriz yani value, daha büyüktür.
  6. Geri kalan iki dikdörtgenler her adım (2).

En kötü durum açısından karmaşıklık, bu algoritma log(M) yarım iş, olası çözümleri ortadan kaldırmak için yapar, ve sonra yinelemeli olarak iki defa kendisini iki küçük sorunlar çağırır. Bu log(M) her satır için çalışması, daha küçük bir versiyonu tekrar etmek zorundayızama eğer satır sayısı sütun sayısı ile karşılaştırıldığında küçük ise, logaritmik zaman bu sütunlar tüm ortadan kaldırmak için güçlü olmak değerli olmaya başlar.

Bu algoritma O(N * log(M/N)) gösteren T(N,M) = log(M) 2 * T(M/2, N/2) bir karmaşıklık verir.

Another approach posted by Craig Gidney bir algoritma yaklaşımı yukarıda benzer: bir zaman bir adım M/N boyut kullanarak bir satır inceler. Onun analizi bu O(N * log(M/N)) performans olarak iyi sonuçlar gösteriyor.

Performans Karşılaştırması

Büyük-O analizi iyi hoş, ama ne kadar iyi bu yaklaşımlar pratikte işe yarıyor mu? Aşağıdaki grafik, giderek dört algoritmaları "" diziler: . Kare inceliyor

algorithm performance vs squareness

("Saf" algoritma sadece dizinin her eleman arar. "Özyinelemeli" algoritma yukarıda açıklanmıştır. "Melez" algoritması Gidney's algorithm bir uygulamasıdır. Her dizi boyutu için performans 1.000.000 sabit bir grup olarak rastgele oluşturulmuş diziler algoritma üzerinde her zamanlama ile ölçüldü.)

Bazı önemli noktalar:

  • , "İkili arama" algoritmalarını dikdörtgen dizilerinde en iyi performansı sunmak ve Saddleback algoritma Kare dizilerinde en iyi çalışır. beklendiği gibi
  • Saddleback algoritma kötü "" algoritma 1-d muhtemelen her öğe üzerinde birden fazla karşılaştırma yapar çünkü diziler. saf daha gerçekleştirir
  • Performans "ikili arama" algoritmalarını Kare diziler üzerinde tekrarlanan ikili arama çalıştırma yükü için muhtemelen nedeniyle. bu hit

Özet

İkili arama akıllıca kullanımı hem dikdörtgen hem de kare diziler için O(N * log(M/N) performans sağlayabilir. O(N M) "algoritma çok daha kolaydır, ama dizi giderek daha fazla dikdörtgen olmak gibi bir performans düşüşü var." saddleback

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Incredible Tutorials

    Incredible T

    27 EKİM 2006
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007