Hızlı indeksleme, ekleme, başa ekleme, yineleme ile dizi benzeri değişmez (kalıcı) veri yapısı uygulaması


11

Hızlı indeksleme, ekleme, başa ve yineleme (iyi konum) işlemleri için izin dizi (ama değişmez) benzer kalıcı bir veri yapısı arıyorum .

Clojure kalıcı Vektör sağlar, ancak sadece hızlı ekleme içindir. Scala'nın Vector'inin sabit zamanlı eklenmesi ve başlaması etkili bir şekilde var, ancak Clojure vektörü ile aynı veri yapısına (bit eşlemli vektör trie) ve anladığım kadarıyla bit eşlemeli vektör trie'ye dayalı olduğu için nasıl uygulandığını anlayamıyorum bazı hileler olmadan hızlı başa sahip olamaz.

Ben uygulamaya hazır değil, kendim böyle bir veri yapısının nasıl uygulanacağının bir açıklaması ile ilgileniyorum.

Yanıtlar:


13

Açık aday kalıcı dengeli bir ikili ağaçtır. Listelediğiniz tüm işlemler yol kopyalama kullanılarak veya zamanında gerçekleştirilebilir . Bu çalışma zamanına nasıl ulaşılacağı hakkında daha fazla bilgi için, aşağıda belirtilen Chris Okasaki kitabına veya cevabım için buraya bakın .O ( lg , n )O(1)O(lgn)

Tabii ki, bir varyant olarak, böyle bir ağacın her yaprağı kendi başına değişmez bir dizi (ardışık değerler dizisi) içerebilir. Bu, bir değerin güncellenmesini daha az verimli hale getirir, ancak mevcut bir değeri asla değiştirmek istemiyorsanız, durumunuzu eklemeniz ve eklemeniz yeterlidir. Bu şekilde, vektörünüz, yapraklarda değişmez dizilere sahip dengeli bir ikili ağaç olarak temsil edilen değişmez dizilerin bir dizisi olarak temsil edilir. Bu, hızlı indeksleme (yaprak sayısında logaritmik), hızlı ekleme ve önleme ve hızlı yineleme sağlar. En kötü durum asimptotik karmaşıklığı daha iyi değildir, ancak uygulamadaki performans önemli ölçüde daha iyi olabilir.

Standart referans Chris Okasaki'nin 1998 tarihli "Tamamen işlevsel veri yapıları" kitabını içerir.
Ayrıca bakınız


Teşekkür ederim. Görünüşe göre RRB ağaçları iyi bir aday ve zaten (tam değil) Clojure uygulaması var.
Tvaroh

Sanırım Okasaki bize bu çalışma zamanlarını değişmezlik ve sebat altında nasıl elde edeceğimizi anlatıyor?
Raphael

1
@ Raphael, evet. Çalışma zamanına nasıl ulaştığınızı açıklamak için referanslar ekledim (cevabımın başına).
DW

4

Makalemde bu tür bir veri yapısının artımlı düzenli ifade eşleşmesi hakkında bir uygulamasını tanımladım - bkz. Http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation ve bu bölümün altındaki ve üstündeki metin .

Sabit yükseklikte bir ağaç çeşididir (B ağaçları veya 2-3 ağaç gibi). Temel olarak, yaprak başına yükü önlemek için yaprakları (N, 2N-1) diziler olan bir (2,3) ağaçtır. (A (N, 2N-1) dizisi, uzunlukları N..2N-1 aralığında olan bir dizidir.) Daha büyük N size daha küçük ek yük verir, ancak bölme ve birleştirme karmaşıklığını doğrusal olarak artırır. İndeksleme, bölme ve birleştirme gibi işlemler, 2-3 ağaçta çalışma şekline çok benzer, yaprak seviyesinde (N, 2N-1) olur.


Bağlantı kopuyor; lütfen uygun ve sağlam bir referans verin (kişilerin makalenizi bağlantı olmadan bulmasını sağlar).
Raphael

Makaleyi herhangi bir dergide yayınlamadım, sadece kişisel web sitemde. Muhtemelen Arxiv üzerine koymak gerekir, iyi fikir.
jkff

Çoğunlukla yazar (lar) ı, unvanı ve yılı düşünüyordum - bu da Google'ı gerekirse kolaylaştırır. ArXiv üzerine koymak daha iyi olurdu, doğru!
Raphael
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.