SORU
19 EKİM 2009, PAZARTESİ


En Küçük bir Listesi Tamsayı Değil

İlginç bir röportaj meslektaşım kullandığı soru:

64-bit işaretsiz tamsayı çok uzun, sıralı olmayan bir liste verildiğini varsayalım. Nasıl en küçük negatif olmayan bir tamsayı bulacaksındeğilliste ortaya çıkar?

TAKİP: sıralayarak bariz çözüm önerilmiştir Artık daha hızlı, daha O(n log n) yapabilir mi?

TAKİP: algoritma bellek . ki 1GB ile bir bilgisayar üzerinde çalışmak zorundadır

AÇIKLAMA: büyük miktarda tüketebilir ama liste RAM. Liste boyutunu verilir, mesela N, önceden.

CEVAP
19 EKİM 2009, PAZARTESİ


İşte O(N) Alanı kullanan O(N) basit bir çözüm. Negatif olmayan sayılar için giriş listesinde kısıtlama olduğumuzu ve listede olmayan, negatif olmayan ilk sayıyı bulmak istiyoruz herhalde.

  1. Listenin uzunluğu bulmak; N * * * diyelim.
  2. N Boolean değerleri, false için başlatılan bir dizi ayrılamadı.
  3. X N daha az ise, listedeki her numara X true dizi X'th öğe ayarlayın.
  4. Dizinden dizi başlıyor 0, false ilk eleman arayan tarayın. Eğer ilk dizin 12 ** bulursanız I I cevap. Aksi halde (tüm elementler true zaman yani) cevap N.

Uygulamada," muhtemelen "" veya "bitset" temsil byte int bir dizi olarak. bitmap olarak kodlanmış olacaktır "N mantıksal dizi Bu genellikle daha az yer (programlama diline bağlı olarak) kullanır ve 20 ** ilk tarama daha hızlı bir şekilde yapılmasını mümkün kılar.


Bu algoritma nasıl işliyor.

Listede N numaraları farklı olan, ya da bir veya daha fazlası N daha büyük olduğunu varsayalım. Bu olması gerektiğini anlamına geliren azındanlistede olmayan bir 23* *aralığında numarası. En küçük eksik numarasını bulun sorunu bu nedenle en küçük eksik numarayı bulma sorunu azaltmak gerekiraz daha N. Bu daha büyük ya da cevap vermiyorlar çünkü 25 * ... * eşit numaraları izlemenize gerek yok anlamına gelir.

Bir önceki paragraf için alternatif listesi 0 .. N - 1 bu sayılar permütasyon. Bu durumda, true ve adım 4'e dizinin tüm öğeleri ayarlar adım 3 birincisi "" sayı N. eksik söyler


Algoritmanın hesaplama karmaşıklığı O(N) orantılılık nispeten küçük bir sabit ile. Liste üzerinde iki lineer geçirir, ya da sadece eğer listenin uzunluğu ile başlamak için bilinen bir pas. Bellek, algoritmanın asimptotik bellek kullanımı yani tüm liste; yani O(N) bit mantıksal bir dizi temsil etmek için gerekli olan sadece ne olduğunu tutun temsil etmek gerek yoktur.

(Buna karşılık, bellek kullanan algoritmalar sıralama ve bölümleme bellekteki tüm listeyi temsil varsayalım. Soru soruldu şeklinde, buO(N) 64-bit kelime gerektirir.)


@1 ile 3 adımlar Jorn yorum sıralama sayma bir varyasyon vardır. Bir bakıma haklı, ama önemli farklılıklar vardır:

  • Sayım sıralama (en az) Xmax listedeki en büyük sayıyı ve Xmin listedeki en küçük sayı olduğu Xmax - Xmin sayaçları bir dizi gerektirir. Her sayaç N ülkeleri temsil edebilmek için vardır; yani bir tamsayı türü vardır ikili gösterimi (en az) ceiling(log2(N)) bit farz edersek.
  • Dizi boyutunu belirlemek için sayma bir tür Xmax Xmin belirlemek için liste üzerinde ilk geçiş yapması gerekiyor.
  • En kötü ihtimalle az yer gereksinimi bu nedenle ceiling(log2(N)) * (Xmax - Xmin) bittir.

Buna karşılık, algoritma yukarıda sunulan sadece en kötü ve en iyi durumlarda N bit gerektirir.

Ancak, bu analiz açar sezgi eğer algoritma bir başlangıç geçmesine listesi arıyorum sıfır (ve sayma liste öğeleri gerekiyorsa), bu bir hızlı cevap kullanarak hiç yer varsa buldum sıfır. Kesinlikle değer eğer listesinde en az bir sıfır bulma yüksek bir olasılık varsa bunu yapıyor. Ve bu ekstra pas genel karmaşıklığı değiştirmez.


EDİT: algoritma açıklama "insanları görünüşe göre benim özgün açıklaması bulunan beri bit ve bit eşlem kafa karıştırıcı. be" mantıksal dizi kullanmak için değiştirdim

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FlippinWindows | #1 Windows Tutorial Channel!

    FlippinWindo

    23 Mayıs 2010
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009