Sabit bir yığın var mı?


32

Aşağıdaki işlemleri destekleyen bir öncelik sırası veri yapısı var mı?

  • Insert (x, p) : p önceliği olan yeni bir x kaydı ekleyin
  • StableExtractMin () : Kaydı asgari önceliğe döndürerek ekleme sırasına göre bağları koparın .

Böylece, Eklemek (a, 1), Eklemek (b, 2), Eklemek (c, 1), Eklemek (d, 2), bir StableExtractMin's dizisi a, sonra c, sonra b, d olur.

Belli bir kullanabilir bir çift depolayarak öncelikli kuyruk veri yapısı , gerçek öncelikli olarak, ama yok veri yapıları ilgilendiğim olmayan stabil bir sıralama için benzer şekilde, açık bir şekilde yerleştirme süreleri (veya ekleme sırası) depolamak .(p,time)

Eşdeğer (?): fazladan boşluk gerektirmeyen sağlam bir yığın sürümü var mı ?Ω(n)


Bence "a, sonra c, sonra b, sonra d"?
Ross Snider,

Bağlantılı kayıt listesine sahip yığın + karşılık gelen bağlantılı listeye öncelikli olarak işaretlenmiş dengeli ikili ağaç çalışmaz mı? Neyi kaçırıyorum?
Aryabhata

Moron: Ekleme sırasını açıkça depolayan, tam olarak kaçınmak istediğim bu. Sorun bildirimini açıklığa kavuşturdum (ve Ross'un yazım hatası düzeltildi).
Jeffε

Yanıtlar:


16

Bently-Saxe yöntemi oldukça doğal ve istikrarlı bir öncelik sırası verir.

Verilerinizi dizileri halinde . boyutuna sahip . Her bir dizi ayrıca bir sayacını da korur . dizi girişleri veri içerir.A i 2 i c i A i [ c i ] , , A i [ 2 i - 1 ]A0,,AkAi2iciAi[ci],,Ai[2i1]

Her , tüm elemanlar, daha yakın zamanda eklenmiştir ve her elementinin içindeki değerler, eski elemanların daha yeni elemanların önüne konmasıyla bağların değere göre sıralanmıştır. Bunun, ve ve bu sıralamayı koruyabileceğimiz anlamına geldiğine dikkat edin . (Birleştirme sırasında bağ olması durumunda, öğeyi .)A i A i + 1 A i A i A i + 1 A i + 1iAiAi+1AiAiAi+1Ai+1

değerini eklemek için , 0 öğe içerdiği en küçük bulun, ve öğelerini birleştirin , bunu ve uygun şekilde ayarlayın.ben bir benxiAi x A i c 0 , , c iA0,,Ai1xAic0,,ci

Min çıkarmak için, büyük indeksi bulmak ilk eleman bu tür tüm minimum ve artım .A i [ c i ] i c iiAi[ci]ici

Standart argümana göre, bu işlem başına itfa süresi verir ve yukarıda açıklanan sıralama nedeniyle kararlıdır.O(logn)

Bir yerleştirme ve çıkarma dizisi için , bu dizi girişini (boş dizileri saklamayın) artı defter tutma verisi kelimelerini kullanır. Bu, Mihai'nin sorunun versiyonuna cevap vermiyor, ancak istikrarlı kısıtlamanın fazla yer kaplamasını gerektirmediğini gösteriyor. Özellikle, hiçbir olduğunu gösterir gerekli ekstra alan üzerinde düşürmek bağlı.n O ( log n ) Ω ( n )nnO(logn)Ω(n)

Güncelleme: Rolf Fagerberg biz null adlı saklayabilir halinde (veri olmayan) değerleri, daha sonra bütün bu veri yapısı büyüklüğü bir diziye paketlenebilir işaret , burada şimdiye kadar eklemeler sayısıdır.nnn

Öncelikle, dizisini bu sıraya göre (önce , ardından boş değilse ). Bunun yapısı, şimdiye kadar eklenen elementlerin sayısı olan ikili gösterimi ile tamamen kodlanmıştır . İkili gösterimi durumunda pozisyonunda bir 1 sahiptir , daha sonra işgal edecek , dizi konumu, aksi takdirde herhangi bir dizi konumları işgal edecektir.A kAk,,A0Ak n n i A i 2 iAk1nniAi2i

Diziyi eklerken, ve uzunluğu 1 artar ve mevcut yerinde birleştirme algoritmaları kullanarak artı yeni öğeyi birleştirebiliriz.A 0 , , A inA0,,Ai

Şimdi, null değerlerini kullandığımız yer sayaçlarından kurtulmaktır . Gelen , biz, ardından takip eden değeri saklamak kalan ardından boş değerler, değerleri. Extract-min sırasında inceleyerek zamanında çıkartılacak değeri hala bulabiliriz . Bu değeri bulduğumuzda ı null ayarladık ve sonra boş olmayan ilk değerini ve ve nin almak için üzerinde ikili arama yapın .A i c i 2 i - c i - 1 O ( log n ) A 0 [ 0 ] , , A k [ 0 ] A i [ 0 ] A i [ 0 ] A i A i [ c i ] A i [ 0 ] A i [ c i ]ciAici2ici1O(logn)A0[0],,Ak[0]Ai[0]Ai[0]AiAi[ci]Ai[0]Ai[ci]

Sonuç: Tüm yapı, uzunluğu her ekleme ile artan bir dizi ve ekleme sayısını sayan bir sayaç, uygulanabilir.n


1
Bu, O (n) ekstraksiyonlarından sonra verilen bir anda potansiyel olarak O (n) fazladan boşluk kullanır, değil mi? Bu noktada önceliği de saklayabilirsiniz ...
Mehrdad

10

Kısıtlarınızın ne olduğundan emin değilim; aşağıdakiler uygun mu? Verileri, örtüklü bir ikili ağaç (ikili bir yığın gibi) olarak yorumladığımız bir dizide, ancak veri öğelerini iç düğümlerinden ziyade ağacın alt seviyesinden saklayın. Ağacın her bir iç düğümü, iki çocuktan kopyalanan değerlerden daha küçük depolar; Bağlar olursa, soldaki çocuğu kopyalayın.

Minimumunu bulmak için ağacın köküne bakın.

Bir öğeyi silmek için silinmiş olarak işaretleyin (tembel silme) ve ağacı yukarı doğru kaldırın (silinen öğenin bir kopyasını tutan kök yolundaki her düğüm, diğer çocuğun bir kopyasıyla değiştirilmelidir). Silinen öğelerin sayısını koruyun ve eğer tüm öğelerin bir kesimi çok büyük olursa, o zaman alt seviyedeki öğelerin sırasını koruyarak yapıyı yeniden oluşturun - yeniden oluşturma doğrusal zaman alır; işlem karmaşıklığı.

Bir öğe eklemek için, ağacın alt satırındaki bir sonraki boş konuma ekleyin ve kökü yolunu güncelleyin. Veya, alt satır doluysa, ağacın boyutunu iki katına çıkarın (yine bir amortisman argümanı ile; standart bir ikili yığın dizisini aştığında bu bölümün yeniden oluşturulması gerekmesinden farklı olmadığına dikkat edin).

Bu, Mihai'nin sorunun daha katı versiyonuna bir cevap değil, çünkü gerçek bir silme işleminin alan maliyetini göz ardı etsek bile, gerçek bir gizli veri yapısının iki katı kadar bellek kullanıyor.


Bunu severim. Düzenli bir örtülü ağaç min-yığın ile olduğu gibi, muhtemelen 3-ary veya 4-ary örtülü ağaç önbellek efektleri nedeniyle daha hızlı olacaktır (daha fazla kıyaslamaya ihtiyaç duymanıza rağmen).
Jonathan Graehl

8

Aşağıdaki, sorununuzun geçerli bir yorumudur:

N tuşlarını, A [1..N] dizisinde, destekleyebileceğiniz herhangi bir yardımcı bilginin olmadığı bir yerde saklamanız gerekir: * insert tuşu * delete min.

Örtük veri yapılarının, bazı öğelerin yerel sıralamasında bit kodlama hilesi oynadığı göz önüne alındığında, bu oldukça zor görünmektedir. Burada birden fazla erkek eşitse, sıraları korunmalıdır, bu yüzden böyle numaralar mümkün değildir.

İlginç.


1
Bence asıl soruya cevap vermediği için bu bir cevap olmalı, cevap değil . (
Silebilir

5
Evet, bu web sitesi biraz saçma. İtibarımız, ikramiyetimiz, kazandıklarımız ve yorumlayamayacağım her türlü yoldan yorumumuz var. Keşke bu bir çocuk oyununa daha az benzeyecekse.
Mihai

1
Bence yorum yazabilmek için daha fazla temsilciye ihtiyacı var. işte sorun bu.
Suresh Venkat

@Suresh: Ah, doğru, bunu hatırlamadım. Aslında bu tür durumlarla nasıl başa çıkacağız (yani, yeni bir kullanıcının bir soruyu yanıtlamadan önce açıklama istemesi gerekiyor)?
Jukka Suomela

2
kolay çıkış yolu yok. Bunu sık sık MO'da gördüm. Mihai, rep kazanmakta sorun yaşamayacak, eğer Mihai ise sanırım :)
Suresh Venkat

4

Kısa cevap: Yapamazsın.

Biraz daha uzun cevap:

Ω(n)Ω(n)

addr(X)<addr(Y)


Yanlış lapa lapa sözde-matematiğe çok uzun cevap:

Not: İkinci bölümün son kısmı da belirtildiği gibi kabataslakdır. Eğer bir matematikçi daha iyi bir sürüm sunabilseydi, minnettar olurdum.

P

(a,1)<(a,2)(a,1)=(a,1)(a,1)(b,1)

X<YXY

(?,1)?

  • Xlog2(P)2X
  • P

Xlog2(P)O(n)n

Şimdi, her bir bellek "hücresi" bize ne kadar bilgi veriyor?

  • WW
  • X

P1Xlog2(P)<X

Bu yüzden, tüm bilgilerimizi saklamak için iki seçeneğimiz var:

  • Ekleme siparişini adrese ve veri yükünü bellekte saklayın.
  • Her iki hafızada saklayın ve adresi başka bir kullanım için boş bırakın.

Açıkçası, israfı önlemek için ilk çözümü kullanacağız.


Şimdi işlemler için. Sanırım sahip olmak istersin:

  • Insert(task,priority)O(logn)
  • StableExtractMin()O(logn)

StableExtractMin()

Gerçekten çok genel bir algoritma şöyle devam eder:

  1. O(logn)
  2. O(logn)
  3. İade etmek.

0(1)O(1)O(1)

O(logn)2(Xlog2(P))

Xlog2(P)O(logn)O(logn)

O(logn)

O(logn)Xlog2(P)

O(logn)

Xlog2(P)O(logn)

Ekleme algoritması genellikle sadece bu bilginin bir kısmını güncellemeli, hızlı performans göstermesi daha pahalıya mal olacağını sanmıyorum.


Xlog2(P)

  • Xlog2(P)
  • P
  • Xlog2(P)

Ω(n)


CW cevabınızı gerçekten vermeyi düşündünüz mü?
Suresh Venkat

Evet. Cevabım, içinde belirtildiği gibi% 100 doğru değil ve eğer SO ya da başka bir yerde olmasam bile, birisinin düzeltebilmesi iyi olurdu. Bilgi paylaşılmalı, bilgi değişmeli olmalıdır. Ama belki CW kullanımını yanlış anladım, öyleyse, lütfen söyle :). EDIT: boğmaca, aslında CW yayınlarından hiçbir cevap alamayacağımı ve içeriğin herhangi bir şekilde lisanslanan CC-wiki olduğunu keşfettim ... Çok kötü :).
Suzanne Dupéron

3

Öncelik sıranızı dengeli bir ikili ağaç (popüler bir seçim) olarak uygularsanız, o zaman ağaca bir öğe eklediğinizde, eşit önceliğe sahip herhangi bir öğenin soluna eklendiğinden emin olmanız gerekir.
Bu şekilde, ekleme sırası ağacın yapısında kodlanır.


1
Fakat bu, işaretçilere O (n) boşluğu ekliyor, ki bence sorgulayıcı kaçınmak istediği şey nedir?
Jeremy,

-1

Bunun mümkün olduğunu sanmıyorum

somut vaka:

       x
    x    x
  x  x  1  x
1  x  

Tüm x> 1 ile min öbek

yığınlama sonunda böyle bir seçim yapacaktır

       x
    1    1
  x  x  x  x
x  x  

Şimdi hangi 1 kök yaymak için?

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.