Hangi sınıf veri yapıları kalıcı hale getirilebilir?


19

Kalıcı veri yapıları değişmez veri yapılarıdır. İşlemler, veri yapısının yeni bir "kopyasını" döndürür, ancak işlem tarafından değiştirilir; eski veri yapısı değişmeden kalır. Verimlilik genellikle temeldeki verilerin bir kısmını paylaşarak ve veri yapısının tam kopyalanmasını önleyerek elde edilir.

Sorular:

  • Kalıcı olarak yapılabilecek veri yapıları sınıfları hakkında sonuçlar var mı (aynı veya çok benzer karmaşıklıkları korurken)?

  • Can hepsi (aynı veya çok benzer karmaşıklığını tutarken) veri yapıları kalıcı yapılabilir?

  • Kalıcı hale getirilemediği bilinen herhangi bir veri yapısı var mı (aynı veya çok benzer karmaşıklıkları korurken)?


1
Rasgele bir öğeye erişmek için korunmuş O (1) karmaşıklığına sahip bir vektörü kalıcı yapamazsınız.
smossen


2
@smossen bunu kanıtlayabilir misin?
Realz Slaw

1
İlk sorunuz çok geniş bir soru. Veri yapıları konusunda kalıcı hale getirilebilecek birçok sonuç vardır. Kişi konuyla ilgili bir kitabın tamamını yazabilirdi ve bazı kişilerde şunlar vardır: örneğin, Okasaki'nin kitabı bu konuda bir klasik. Bu konuda biraz araştırma yaptınız mı? Soruyu daraltabilir misiniz? Haliyle, bu site için iyi bir uyumun çok geniş olabileceğinden şüpheleniyorum. Belki 3. soruyu ayrı bir soruya bölebiliriz?
DW

@ Realz Slaw: Resmi olarak kanıtlayamıyorum, ama bence sağduyu. O (1) vektörlerdeki elemanlara (hash tabloları dahil) erişim, belirli bir donanımda adres kod çözme için sabit süreye bağlıdır. Kalıcılık, vektör dizinine ek olarak bir veya iki boyut ekler. Ancak donanım adresleri hala tek boyutludur.
smossen

Yanıtlar:


23

Olumlu sonuç: sebat çok pahalı değil. Her veri yapısının en fazla O ( lg n ) ile tamamen kalıcı hale getirilebileceği gösterilebilirO(lgn) yavaşlamasıyla .

İspat: Standart veri yapılarını kullanarak bir dizi alıp kalıcı hale getirebilirsiniz (örn. Dengeli bir ikili ağaç; biraz daha ayrıntılı bilgi için bu cevabın sonuna bakınız). Bu, yavaşlamasına neden olur : her dizi erişimi , kalıcı olmayan veri için O ( 1 ) süresi yerine kalıcı veri yapısıyla O ( lg n ) süresi alır . Şimdi RAM modelinde çalışma süresi O ( f ( n ) ) olan herhangi bir zorunlu algoritmayı alın , burada n kullanılan bellek miktarını gösterir. Tüm hafızayı büyük bir dizi olarak (O(lgn)O(lgn)O(1)O(f(n))n öğeleri) ve kalıcı bir harita kullanarak kalıcı hale getirin. Zorunlu algoritmanın her adımı en fazla O ( lg n ) yavaşlamasına neden olur, dolayısıyla toplam çalışma süresi O ( f ( n ) lg n ) olur .nO(lgn)O(f(n)lgn)

Görünüşe göre biraz daha iyi yapmak mümkündür: görünüşe göre , aşağıda belirtilen Demaine belgesindeki teknikleri kullanarak yavaşlama faktörünü (beklenen, itfa edilmiş zaman) olarak düşürebilir - ancak ayrıntılara aşina değilim bu iş için kendim kefil olamam. Bu gözlem için jbapple'a teşekkürler.O(lglgn)


Olumsuz sonuç: bazı veri yapıları için yavaşlamayı önleyemezsiniz. Üçüncü sorunuza cevap vermek için, onları kalıcı hale getirmenin biraz yavaşlama sağladığı bilinen veri yapıları vardır.

Özellikle, öğeden oluşan bir dizi düşünün . Kalıcı olmadan, her dizi erişimi O ( 1 ) zaman alır (RAM modelinde). Kalıcılıkla, görünüşe göre, rastgele bir öğeye erişmek için O ( 1 ) en kötü durum karmaşıklığına sahip kalıcı bir dizi oluşturmanın bir yolu olmadığı gösterilmiştir . Özellikle, tam olarak kalıcı dizilerin sahip olması gerektiğini gösteren bir alt sınır varnO(1)O(1) erişim süresine. Bu alt sınır aşağıdaki makalenin p.3 kısmında belirtilmiştir:Ω(lglgn)

Alt sınır Mihai Patrascu'ya atfedilir, ancak bu iddia edilen alt sınırın kanıtının ayrıntılarını veren bir kaynağa atıf yoktur.


Zengin bir araştırma alanı. Rasgele bir veri yapısı veya algoritma alırsak, onu en çok yavaşlama ile kalıcı hale getirip getiremeyeceğiniz biraz hassas bir sorudur . Genel bir sınıflandırma teoremi bilmiyorum. Bununla birlikte, belirli veri yapılarını etkili bir şekilde kalıcı hale getirmenin yolları üzerinde çok fazla araştırma vardır.O(1)

İşlevsel programlama dilleriyle de güçlü bir bağlantı vardır. Özellikle, tamamen işlevsel bir şekilde (mutasyon olmadan) uygulanabilen her veri yapısı zaten kalıcı bir veri yapısıdır. (Tam tersi durum böyle değil, ne yazık ki.) Gözlerinizi kısmak istiyorsanız, bunu zayıf bir tür kısmi sınıflandırma teoremi olarak kabul edebilirsiniz: eğer tamamen işlevsel bir programlama dilinde aynı zaman sınırlamasıyla uygulanabilirse zorunlu bir dil ise, kalıcı olmayan dil ile aynı zaman sınırına sahip kalıcı bir veri yapısı vardır. Bunun muhtemelen aradığınız şey olmadığını anlıyorum - çoğunlukla durumun önemsiz bir ifadesi.


Kalıcı bir dizi nasıl yapılır. O ile tamamen kalıcı bir dizi oluşturmak için nasıl yapı anlatmaya çalışmayacağım en kötü durumda erişim süresi. Ancak, temel fikirler çok karmaşık değil, bu yüzden fikirlerin özünü özetleyeceğim.O(lgn)

dd

nO(lgn)O(lgn)O(lgn)

Aşağıdaki kaynaklarda, güzel resimlerle daha fazla açıklama bulabilirsiniz:

Bu size ana fikri verecektir. Dikkat edilmesi gereken ekstra ayrıntılar var, ancak ayrıntılar bu sorunun kapsamı dışında. Neyse ki, bunların hepsi standart şeylerdir ve literatürde bu tür veri yapılarının nasıl oluşturulacağına dair birçok bilgi bulunmaktadır. Yukarıdaki kaynaklar yeterli değilse ve kalıcı bir dizi veri yapısı oluşturma ayrıntıları hakkında daha fazla bilgi edinmek istiyorsanız ayrı bir soru sormaktan çekinmeyin.


İlk paragrafı gerçekten anlamıyorum, kırmızı-siyah bir ağaç kullanarak bir diziyi kalıcı hale nasıl getirebilirim?
G. Bach

G.Bach @, "İkili arama ağaçları" ve "Rastgele erişimli yapılar" da (özellikle ağaç yöntemi) etiketli bölümlerde oldukça iyi bir açıklaması var toves.org/books/persist/index.html . Başka güzel açıklamalar için, netcode.ru/dotnet/?artID=6592#BinaryTrees ve sonraki bölümlerin bazılarına bakın . Bu size ana fikri verecektir. Ayrıntılar bu sorunun kapsamı dışındadır, ancak bunların hepsi standart şeylerdir; Böyle bir veri yapısının nasıl oluşturulacağı hakkında daha fazla bilgi edinmek istiyorsanız ayrı bir soru sormanızı öneririm.
DW

4
O(lglgn)
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.