özleri ile bir öncelik sırası var mı ?


46

Öncelik sırası arayüzünü uygulayan pek çok veri yapısı vardır:

  • Ekle: yapıya bir öğe ekleyin
  • Get-Min: yapıdaki en küçük elemanı döndür
  • Extract-Min: yapıdaki en küçük elementi kaldırın

Bu arayüzü uygulayan ortak veri yapıları (dak) yığınlardır .

Genellikle, bu işlemlerin (itfa edilmiş) çalışma süreleri şunlardır:

  • Ekle: (bazen O ( log n ) )O(1)O(logn)
  • Get-Min: O(1)
  • Özü-Min: O(logn)

Fibonacci yığın örneğin bu çalışma saatlerini başarır. Şimdi sorum şu:

Aşağıdaki (itfa edilmiş) çalışma sürelerine sahip bir veri yapısı var mı?

  • Ekle: O(logn)
  • Get-Min: O(1)
  • Ekstresi-Min: O(1)

Eğer böyle bir yapıyı sıralı giriş verilen zaman içinde kurabilirsek, o zaman örneğin o ( nO(n)kavşaklar, 'olağan' öncelik sıralarını kullanırsak kesinlikle daha hızlıdır.o(nlogn)


Ben düşünüyorum ki olur dengeli bir BST kullanarak değil Özü-Min işe yarayabilir yaparken yeniden dengelemeye. Ya da belki bir atlama listesi.
svick

@svick: atla listeleri rasgele, aradığım şey bu değil. Eğer bir BST ile yapabiliyorsa, o zaman bu harika, ama yapmanız gereken düşünüyorum bazı dengeleme tür.
Alex ten Brink,

Bir yandan not: bu bir tohumlama sorusudur ve cevabı biliyorum, ancak bunun kolay kolay çözülmediğini görmek güzel. Kimse cevabı biliyorsa, vermekte tereddüt etmeyin :)
Alex ten Brink

İtfa edilmiş güncelleme zamanlarını kabul ediyorsanız, standart yığın yapılarınızı koruyabilir ve analizinizde yalnızca küçük değişiklikler yapabilirsiniz. Aşağıdaki cevaba bakınız.
Joe,

Yanıtlar:


27

Bizim fikrimiz dişli yayvan ağaçlar kullanmaktır . Vikipedi makalesinden başka, ağaçları ipliğe sokacağız, böylece her düğüm nextsıralı seyahatte halefi için bir işaretçi olacak; ayrıca startağaçtaki en küçük elemana işaretçi tutarız.

En küçük elemanın (en kötü durumda) zamanında çıkarılmasının mümkün olduğunu görmek kolaydır : sadece işaretçiyi takip edin , minimumu kaldırın ve işaretçiyi minimuma değiştirin . Asgari bir sol çocuğu asla olamaz; eğer doğru bir çocuğa sahipse, onu ağaçtaki minimum yere koyarız. Biz do not yapacağını genellikle yayvan operasyon yayvan ağaçları gerçekleştirin. Sonuç hala makul bir şekilde dengelenmiş bir arama ağacıdır: yalnızca soldaki düğümleri kaldırdığımız için, düğüm sayısının (etkilenen bir alt ağaçtaki), silme nedeniyle orijinal sayının yaklaşık yarısına düştüğünü biliyoruz (alt ) ağacın yüksekliği bir azalır.O(1)startnext

Ekler itfa süresi içerisinde mümkündür ; Zig-zag (ve ne olmasın) işlemleri burada ağacı güzelce dengeleyecek.O(logn)

Bu en iyi ihtimalle kaba bir taslak. Krediler, benimle ilgili soruna şaşırtan F. Weinberg'e ve denemeyi başaramadığımız tek ağaç çeşidi hakkında yayvan ağaçlardan bahseden danışmanımız M. Nebel'e veriyor.


2
ExtractMin'i kullanmazsanız, amortismanlı analizin nasıl çalışılacağı bana açık değildir. Bir ipucu verebilir misin?
jbapple

Detaylı olarak yapmadık. Ana fikir, min-min işlem serisinin ağacı dengesiz hale getirmemesidir, bu nedenle yayılmaya gerek yoktur ve normal analizler yerleştirmeler için çalışmalıdır.
Raphael

9
Dikkatli! Yayvan ağaçlar mutlaka dengeli değildir. Uzun süredir erişilmeyen düğümler ağaçta çok derin olabilir . Analiz geçmesi yapmak için, sahip kompleks bir yapıya sahiptir analiz etmek için kullanılır aynı potansiyel fonksiyon açısından tartışmak.
JeffE

20
  • Ekle: O(logn)
  • Get-Min: O(1)
  • Ekstresi-Min: O(1)

İtfa Edilen Zaman

cnlognO(logn)O(logn)Ω(logn)O(1)

En kötü durumda

Literatürde mevcut bir veri yapısını kullanabilirsiniz: parmak arama ağaçları ve sadece minimum elementin bir göstergesini koruyun. Bu Bkz anket genel bir bakış için, ve 1988 kağıt ihtiyaçlarınızı karşılayan uygulanabilir bir versiyonu için Levcopoulos ve Overmars tarafından.


1
Ne kadar sinsi. Haklısın, sanırım bunu dışlamak için daha güçlü bir şey talep etmeliydim. Güzel bir fikir :)
Alex ten Brink

O(1)


8

Talep üzerine, soruyu formüle ettikten sonra bulduğum yapı şudur:

Temel fikir, dişli bir günah keçisi ağacını minimumda bir işaretçi ile birlikte kullanmaktır (ve iyi ölçüm için de maksimum). Diş açmaya daha basit bir alternatif, her düğümde selefi ve ardışık işaretçileri korumaktır (eşdeğer, daha basit ancak daha fazla ek yüke sahiptir). Sadece bir isim vermek için Scapegoat yığını demeye geldim .

Sadece bu temel yapı size şu işlemleri verir:

  • O(logn)
  • O(logn)
  • O(1)
  • Get-Min / Max: işaretçiyi minimum veya maksimum değerine döndürür.

O(logn)O(1)O(logn)O(1)O(1)O(1)

  • O(1)

Bunu birleştirmek:

  • O(1)

İşaretçilerle biraz daha fazlasını yapabilirsiniz: örneğin, ortancaya ya da başka bir düzen istatistiklerine bir gösterici koymak zor değildir, bu yüzden ihtiyaç duyduğunuzda bu kadar çok sayıda işaretçi tutabilirsiniz.

Başka şeyler:

  • nO(n)
  • O(n)

Ve son olarak, bu işlemleri destekleyebileceğinizden eminim ama kesin olarak bilmeden önce bunları biraz daha düşünmem gerekiyor:

  • O(1)

Temel görüş, günah keçisi ağaçlarının , yeniden birleştirme yapmadan herhangi bir düğümü silmenin uzun vadede diğer düğümlerin performansını etkilemeyeceğinden, çok sayıda düğümü silseniz bile sizi temin ederim.
Raphael

O(lgn)O(1)O(lgn)

2
O(1)O(1)O(1)O(1)
Alex ten Brink

Ah, şimdi anlıyorum.
jbapple

2

ϵO(1)log(1/ϵ)ϵ

ϵn

Orijinal, açık ve güzel yazılmış kağıt için, bkz. Bernard Chazelle, Yumuşak Yığın: En Uygun Hata Oranına Sahip Bir Öncelik Sırası, ACM Dergisi, 47 (6), s. 1012-1027, 2000 . SODA'09'dan daha basit ve daha sezgisel olduğunu iddia eden alternatif uygulama ve analiz için bkz. Kaplan H. ve Zwick U., Chazelle'nin yumuşak yığınlarının daha basit bir uygulaması ve analizi, 2009 .


Oldukça ilginç bir veri yapısı olmasına rağmen, yumuşak yığınlar kesin değildir: findmin, minimum değil, sadece yaklaşık minimum bir değer getirebilir. Yine de bağlantılar için teşekkürler :)
Alex ten Brink

1
@AlextenBrink: Veri yapısının amacı (birçok olasılıksal algoritma gibi) kesin cevaplar almak için yaklaşık veri yapısını kullanabilmenizdir. Aslında, yumuşak yığınların yaklaşık doğası, minimum yayılma ağacı için bilinen tek doğrusal zaman algoritmasında kullanılmasını engellemedi.
Jérémie,

2

Tamam, sonunda aradığın karmaşıklığı buldum ve en iyisi, literatürde buldum:

En Kötü Durumda Karmaşıklık

O(1)

O(1)

O(1)

O(log n)

Referans

[3]O(1)O(log n)O(n)

Brodal, Gerth Stølting. 'Hızlı Eritilebilir Öncelik Kuyruğu'. Uluslararası Algoritmalar ve Veri Yapıları Çalıştayı 4. Çalışmasında, 282-290. WADS '95. Londra, İngiltere, İngiltere: Springer-Verlag, 1995.

[3]: Dietz, Paul F ve Rajeev Raman. 'Sürekli Güncelleme Zamanı Parmak Arama Ağacı'. Bilgi İşlem Mektupları 52, no. 3 (1994): 147 - 154.

Bu hesaplama modelini RAM kullanıyor olsa da :

Veri yapımız, birim maliyet ölçüsü ve logaritmik kelime boyutuyla rastgele erişimli makine (RAM) modelini kullanır;

Daha yakın bir zamanda, Pointer-Machine hesaplama çözümü modeli verilmiştir [1].

[1]: Brodal, Gerth Stølting, George Lagogiannis, Christos Makris, Athanasios Tsakalidis ve Kostas Tsichlas. 'İşaretçi Makinesinde Optimal Parmak Arama Ağaçları'. J. Comput. Sist. Sci. 67, hayır. 2 (Eylül 2003): 381-418.


2

İki veri yapısını koruyarak bu soruna yaklaşmak: Bir Dizi ve İkili Ağaç.

Ω(lognloglogn)Ω(logn)

O(logn)O(logn)

nullO(logn)

O(1)O(1)

O(logn)O(1)delete_at(idx)


1 Patrascu, Mihai ve Erik D. Demaine. “Hücre-Prob Modelinde Logaritmik Alt Sınırlar.” SIAM J. Comput. 35, hayır. 4 (Nisan 2006): 932–963. DOI: 10,1137 / S0097539705447256.


1
O(logn)

"İkili arama ağacını diziye dizmek" ne anlama geliyor?
jbapple

@AT: Ben jbapple'ın duygularını paylaşıyorum.
Raphael

Ω(k)kO(1)

Rotasyonları sabit bir zamanda nasıl uygulayacağınızı açıkladığınız güncellemeniz, dizilerde çalışmaz. Bu cevap hala yanlıştır. Referans verdiğiniz Tarjan makalesi, düğüm ve işaretçilerle depolanan ağaçlar hakkındadır.
jbapple

-2

O(1)O(log log n)

2007 makalesine bakınız: Öncelik sıraları ve Mikkel Thorup tarafından sıralama arasındaki denklik .

O(n log log n)


Bağladığınız makale ilginç olsa da, sundukları öncelik sırası sabit zaman silmelerine sahip değil (özeti doğru okuduysam) ve bu yüzden istediğim şey değil.
Alex ten Brink,

-2

analiz

o(n log log n)

o(log log n)

O(1)

O(n)

O(1)

O(1)

uygulama

  1. O(1)
  2. O(6)O(1)
  3. k±
    ((k>nsize1)(k<n0)((k<ni)(k>ni+1)))
    o(log log n)

[1]: Andersson, Arne ve Christer Mattsson. 'O'da Dinamik İnterpolasyon Arama (log log n) Time'. Automata'da, Languze ve Programlama, Andrzej Lingas, Rolf Karlsson ve Svante Carlsson, 700: 15–27 tarafından düzenlendi. Bilgisayar Bilimleri Ders Notları. Springer Berlin / Heidelberg, 1993. http://dx.doi.org/10.1007/3-540-56939-1_58 .


2
Ekleme zamanı işaretten çok uzak.
Raphael

nsize1n0nini+1

Bağladığınız kağıdın özetini okurken, bu sınırların belirli bir dağıtımın girişleri için sınırlar beklediği anlaşılıyor, bu nedenle aradığım şey bu değil: Herhangi bir girdiden bahsettiğim sınırları istiyorum.
Alex ten Brink,

O(log n)

@AT Logaritmik ikili arama, rastgele erişime ihtiyaç duyar. Uygulanan temel liste nedir? İddia ettiğiniz sınırları gerçekten tartışmalısınız. Ayrıca, "listedeki pozisyonlar" belirsizdir - hangi pozisyonlar ve semboller neyi ifade eder? Bağladığınız kağıda herkes erişemez. Lütfen cevabınızı (daha fazlasını) bağımsız tutmaya ve en azından gerçekleri özetlemeye çalışın. Bu noktada cevabın doğru olduğuna inanmıyorum.
Juho
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.