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.