Hızlı liste değiştirme ve sipariş sorguları için bir veri yapısı var mı?


9

Bir dizi sahip kümesinden elemanların listeleri, . gelen her öğe tek bir listede görünür . Aşağıdaki güncellemeleri gerçekleştirebilecek bir veri yapısı arıyorum:LN={1,2,3,...,n}NL

  1. concat(x,y) : içeren listeyi içeren listenin sonuna birleştiriryx

  2. split(x) : içeren listeyi hemen sonra bölerxx

Ayrıca aşağıdaki sorguları gerçekleştirmesi gerekir:

  1. follows(x,y) : döner ise ve aynı listede ve sonra gelen (ama zorunlu olarak bitişik değildir )truexyyxx

  2. first(x) : listenin içeren ilk öğesini döndürürx

  3. next(x) : sonra döner bir sonraki eleman listesi ihtiva edenxx

Zaten bu güncelleştirmeleri ve sorguları zamanda gerçekleştiren bir veri yapısı ile geldim . Çoğunlukla bunu yapabilen bir veri yapısının olup olmadığıyla ilgileniyorum (umarım daha hızlı?).O(lg2(n))O(lg(n))

Motivasyon: köklü yönlendirilmiş ormanlar bu liste kümelerinden ikisiyle temsil edilebilir ve bu tür ormanlarda erişilebilirliğin hızlı bir şekilde hesaplanmasını sağlar. Başka ne için kullanılabileceklerini ve bunların zaten bilinip bilinmediğini görmek istiyorum.

Yanıtlar:


11

Tam sayılarınızı atlama listelerinde tutun. Normal atlama listeleri anahtarla sıralanır, ancak bunları sadece dizilerin bir temsili olarak kullanacağız. Ayrıca, bir dizi boyut işaretçisi bulundurunn. Dizinin her öğesinin atlama listesindeki bir düğüme işaret etmesi gerekir. Bunun desteklediğine inanıyorumnext içinde O(1) ve diğer tüm işlemler O(lgn).

özellikle:

  • concating veya splitiki atlama listesinin alınması O(lgn) bu nedenle en fazla geçersiz kılar O(lgn) işaretçileri.
  • next yaprak seviyesindeki ileri işaretçisini takip ederek O(1) saati.
  • first alır O(lgn)zaman: takılana kadar işaretçileri takip edin, ardından sol işaretçiyi takip edin. Daha fazla sol işaretçi izleyemediğinizde, atlama listenizin baş göstergesindesiniz. Yaprak işaretçileri, sonra bir ileri işaretçisi izleyin. Bu listedeki ilk öğedir.
  • followsbiraz daha hileli. Olduğu gibi ilerlefirst için y, ancak takıldığınız değerlerin bir listesini kaydedin (yani, artık işaretçileri izleyemeyeceğiniz yer). Bu listeye "iz" kaydettiğinizi söyleyeceğiz. Aynı şeyix, ancak takıldığınızda sağ işaretçileri takip edin, sola değil. Eğerx ilerlettiği yizleri kesişir. İzler boyuttadırO(lgn). İzdeki her öğeye sıkışmış seviye eklenmişse, zaman içinde bir kavşak olup olmadığını kontrol edebilirizO(lgn).

next en kötü durum O(1), diğerleri O(lgn) yüksek olasılıkla . Deterministik atlama listeleri kullanılarak en kötü duruma getirilebilirler.

bence concat yapılabilir O(lglgn)yaprak seviyesi bağlantılı (2,5) ağaçlar kullanarak ve dikenleri güçlendirerek. Bootstrapping hilesi için Kaplan ve Tarjan'ınKatlanabilir listelerin tamamen işlevsel gösterimleri ” bölümüne bakınız .


güzel. listeleri atlamak hakkında düşünüyordum ama oldukça ilişkili anahtar değerleri olmadan takip yapmak nasıl göremedim.
Sasho Nikolov

Bu harika; Tüm güncellemelerin nasıl deterministik hale getirileceğini görüyorumO(lg(n)), hangisi iyi. O'yu anlamak için okumaya devam etmeliyim (lg lg (n)). @ Jbapple gönderi için teşekkürler.
bbejot

1

En küçük ortak atası : Sorun da aşağıda ilgilenen edilecektir hayal böylece, dinamik köklü ağaçlarda ulaşılabilirlik sorunu çözmek için kullanılabilir Optimal Algoritmalar Bulma İçin Ortak Atalar yakın Dinamik Ağaçlarında , Alstrup ve THORUP tarafından. Bu yazı, zamana bağlıO(n+mloglogn) için n bağlantılar ve m işaretçi makinede nca sorgular.


referans için teşekkür ederim. En yakın ortak ata sorunu kesinlikle ağaçlardaki ulaşılabilirliği çözer. Bağlantı verdiğiniz kağıt, tüm işlemleri içeren artımlı bir ağacı açıklarO(lglg(n))saati. Acaba tamamen dinamik ağaçlarla çalışmanın geliştirilip geliştirilemeyeceğini merak ediyorum.
bbejot
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.