Bir harita ağacı için en uygun veri yapısı nedir.


9

Bir veri yapısı arıyorum, bu temelde bir harita ağacı, nerede her düğüm harita bazı yeni öğeler, hem de onun üst düğümün harita elemanları. Burada harita ile STL'de harita veya python'da dikte gibi anahtarlar ve değerler içeren bir programlama haritası kastediyorum.

Örneğin, bir kök düğüm olabilir:

root = {'car':1, 'boat':2}

ve her biri üst haritaya bir öğe ekleyen 2 çocuk

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

Bu mümkün olduğunca alan verimli olmasını istiyorum, yani her düğümde ortaya çıkan haritanın tam bir kopyasını saklamak istemiyorum, ama ideal olarak arama hala O (log N), N toplam sayısı Düğümdeki öğeler, tüm ağaç değil.

Belki de bunun için kullanabileceğim akıllı bir karma işlevi olduğunu düşünüyordum, ama hiçbir şey bulamamıştım.

Saf yaklaşım, yeni eklenen girişleri her bir düğümdeki bir haritada saklamak ve daha sonra hiçbir şey bulunmazsa ağacı yukarı taşımak olacaktır. Bunu sevmiyorum çünkü ağaç derinliğine bağlı.


böylece her düğüm üst öğede saklanan haritayı incelten bir haritayı temsil eder?
Suresh Venkat

Ayrıca, matematiksel veya kartografik anlamda harita mı demek istediniz?
Suresh Venkat

Matematiksel / CS anlamında bir harita demek istiyorum. Örneğin STL'deki harita gibi.
phreeza

@Suresh: Görünüşe göre bu bir incelik değil. Soruyu doğru bulduğumda, bir alt düğüm üst düğümünün haritasına yeni öğeler ekler .
Jukka Suomela

ve ilk soruyu cevaplamak için, her bir düğüm daha fazla anahtar / değer çifti eklendiği için haritayı hassaslaştırır.
phreeza

Yanıtlar:


10

Sorguların ne olduğunu söylemediniz, ancak sorgu () bir düğümü ve anahtarı alır ve ilişkili değeri ister (veya böyle bir değer yoksa null değeri) varsayarım. Bu durumda, genel olarak her düğümde ayrı bir harita saklamaktan daha iyisini yapamayacağınızı düşünüyorum. Örneğin, her bir yol düğümünün kendisine bağlı bir düğüme sahip olduğu bir tırtıl ağacını düşünün (toplam 2n düğüm). Yolun bir ucunda kökleyin. Şimdi anahtarlar için evren boyutunun m olduğunu varsayalım. Çatallı her düğüm v ve m olası anahtarların her biri için, bu anahtar v'de var olabilir veya olmayabilir ve her ikisi de alt ağaç kısıtlamanıza uygun olacaktır. Yani, var2mn her bir çatal düğümünde her anahtarın var olup olmadığına dair olasılıklar, bu yüzden sadece gerekli bilgileri saklamak için mn alanlarına ihtiyacınız var.


5
Ancak bu örnek gereksiz bilgileri depolamanız gerektiğini göstermez (yani her bir alt öğede de kök düğümün girişlerini çoğaltmanız gerekir)!
Jukka Suomela

Kafam karıştı. Derinlik ağacında1 ile n düğümleri saklayamayacağınız açık m bağlamalar o(m)Uzay. Örneğiniz daha fazlasını gösteriyor mu?
Radu GRIGDaha

15

Her şeyden önce, "harita" ile ne demek istediğini TCS lingo "sözlük" olduğunu düşünüyorum. İkincisi, "ideal olarak arama halaO(logN)", sözlükte çeşitli karma tablolarla arama O (1) zaman aldığından. Üçüncü olarak, sorunun statik veya dinamik olup olmadığını belirtmediniz; statik olduğunu varsayıyorum.

Bu problem için en uygun karmaşıklık Θ(önceki arama), ör. O(lglgN)van Emde Boas kullanıyor. Eğer kelime boyutuΘ(lgn); optimal selefler için http://people.csail.mit.edu/mip/papers/pred/pred.pdf adresine bakınız .

Soruna saldırmanın doğru yolu, bir genel karma tablo oluşturmak ve tablodaki her anahtar için ayrı ayrı hiyerarşiyle uğraşmaktır. Bir anahtar içinx, göründüğü düğümleri biliyoruz. Ağacın sıralı bir geçişini düşünün. Düğümlerxbelirirse aralıkları bu sırayla tanımlayın. Belirlemek içinx bazı düğümlerin hash tablosunda v, sorup sormamanız gerekir vyukarıda tanımlandığı gibi herhangi bir segmenti bıçaklar. Bu, tüm aralık bitiş noktaları için önceki tabloyu oluşturduğumuz önceki arama ile kolayca yapılır.

Alt sınır için, bir bıçaklama sorusunun bile selefi kadar zor olduğuna dikkat edin (renkli selef aramasından kaynaklanan azalmaya bakın). Yukarıdaki kağıt referansları, önceki arama için en uygun doğrudan toplam davranışını gösterdiğinden, yukarıda açıklanan algoritmanın, düğüm sayısı ile toplam anahtar sayısı arasındaki herhangi bir rasyon için optimal olduğu anlamına gelir.

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.