Daha az bilinen ancak yararlı veri yapıları nelerdir?


795

Etrafında gerçekten yararlı olan ancak çoğu programcı tarafından bilinmeyen bazı veri yapıları vardır. Hangileri bunlar?

Herkes bağlantılı listeler, ikili ağaçlar ve karmaları bilir, ancak örneğin Listeleri atla ve Bloom filtreleri hakkında ne söylenir . Çok yaygın olmayan, ancak bilinmeye değer daha fazla veri yapısı bilmek istiyorum çünkü harika fikirlere güveniyorlar ve bir programcının araç kutusunu zenginleştiriyorlar.

PS: Ayrıca , ortak bir veri yapısının özelliklerini akıllıca kullanan Dans bağlantıları gibi tekniklerle de ilgileniyorum .

DÜZENLEME : Lütfen veri yapılarını daha ayrıntılı açıklayan sayfalara bağlantılar eklemeye çalışın . Ayrıca, bir veri yapısının neden havalı olduğuna dair birkaç kelime eklemeye çalışın ( Jonas Kölker'in işaret ettiği gibi). Ayrıca, yanıt başına bir veri yapısı sağlamaya çalışın . Bu, daha iyi veri yapılarının yalnızca oylarına dayanarak zirveye çıkmasına izin verecektir.


Yanıtlar:


271

Önek-ağaçlar ya da kritik-bit ağaçlar olarak da bilinen denemeler , 40 yılı aşkın bir süredir varlığını sürdürmektedir, ancak yine de nispeten bilinmemektedir. Denemelerin çok havalı bir kullanımı , bir üçgeni bir karma işleviyle birleştiren " TRASH - Dinamik LC-trie ve karma veri yapısı " nda açıklanmaktadır.


12
yazım denetleyicileri tarafından çok yaygın olarak kullanılır
Steven A. Lowe

Seri çekim denemeleri de, dizelerin yalnızca önekini düğüm olarak kullandığınız ve dizelerin listelerini düğümlerde sakladığınız ilginç bir varyanttır.
Torsten Marek

Perl 5.10'daki normal ifade motoru otomatik olarak denemeler oluşturur.
Brad Gilbert

Deneyimime göre, bir işaretçi genellikle bir karakterden daha uzun olduğu göz önüne alındığında, acı verici bir şekilde pahalı. Yalnızca belirli veri kümeleri için uygundurlar.
Joe

18
Hiçbir SO sorusu, konu ne olursa olsun, jQuery'den bahsetmeden tamamlanmadığı için .... jQuery'nin yaratıcısı John Resig, diğerleri arasında çeşitli üçlü uygulamalara baktığı ilginç bir veri yapısı dizisine sahiptir: ejohn.org/blog/ revize-javascript-sözlük-arama
Oskar Austegard

231

Bloom filtresi : Başlangıçta hepsi 0'a ayarlanmış m bitlik bit dizisi .

Bir öğe eklemek için, öğeyi daha sonra 1 olarak ayarladığınız dizide k dizinleri verecek olan k karma işlevlerinden geçirirsiniz.

Bir öğenin kümede olup olmadığını kontrol etmek için , k indekslerini hesaplayın ve hepsinin 1 olarak ayarlanıp ayarlanmadığını kontrol edin.

Tabii ki, bu yanlış pozitif olma olasılığını verir (wikipedia'ya göre n yaklaşık eklenen öğe sayısı yaklaşık 0.61 ^ (m / n)). Yanlış negatifler mümkün değildir.

Bir öğeyi kaldırmak imkansızdır, ancak ints dizisi ve artış / azalma ile temsil edilen sayma çiçek filtresini uygulayabilirsiniz .


20
Sözlüklerle kullanımlarından bahsetmeyi unutursunuz :) Tam bir sözlüğü, yaklaşık 512k'lık bir çiçek filtresine, değerleri olmayan bir hashtable gibi sıkıştırabilirsiniz
Chris S

8
Google, BigTable uygulamasında Bloom filtrelerinin kullanımını belirtiyor.
Brian Gianforcaro

16
@FreshCode Aslında yanlış pozitifler ancak asla yanlış negatifler alabileceğiniz için sette bir elementin yokluğunu ucuza test etmenizi sağlar
Tom Savage

26
@FreshCode @Tom Savage'ın dediği gibi, negatifleri kontrol ederken daha kullanışlıdır. Örneğin, hızlı ve küçük (bellek kullanımı açısından) yazım denetleyicisi olarak kullanabilirsiniz. Tüm kelimeleri ekleyin ve ardından kullanıcının girdiği kelimeleri aramaya çalışın. Negatif alırsanız yanlış yazılmış demektir. Ardından, en yakın eşleşmeleri bulmak ve düzeltmeler sunmak için biraz daha pahalı çekler yapabilirsiniz.
lacop

5
@ abhin4v: Bloom filtreleri, çoğu istek "hayır" yanıtı döndürme olasılığı yüksek olduğunda kullanılır (burada olduğu gibi), yani "evet" yanıtlarının az sayıda olması daha yavaş bir kesin sınama ile denetlenebilir. Bu yine de ortalama sorgu yanıt süresinde büyük bir düşüşe neden olur . Chrome'un Güvenli Tarama'nın bunu yapıp yapmadığını bilmiyorum, ama bu benim tahminim olacak.
j_random_hacker

140

Halat : Ucuz prepends, alt dize, orta ekler ve ekler sağlayan bir dize. Gerçekten sadece bir kez kullandım, ancak başka hiçbir yapı yeterli olmazdı. Düzenli dizeler ve diziler ekleri, yapmamız gereken şey için çok pahalıydı ve her şeyi tersine çevirmek söz konusu değildi.


Kendi kullanımım için böyle bir şey hakkında düşüncelerim vardı. Zaten başka bir yerde uygulanmış olduğunu bilmek güzel.
Kibbee

15
SGI STL'de
quark

2
Ne denildiğini bilmeden son zamanlarda Java için buna çok benzer bir şey yazdım - performans mükemmeldi: code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/…
mikera

Halat oldukça nadirdir: stackoverflow.com/questions/1863440/...
Will

6
Mikera'nın bağlantısı bayat, işte mevcut .
aptwebapps

128

Atla listeleri oldukça temiz.

Wikipedia
Atlama listesi, ikili arama ağacına (sipariş günlüğü n çoğu işlem için ortalama süre) benzeyen, birden çok paralel, sıralı bağlantılı listeye dayanan olasılıklı bir veri yapısıdır.

Dengeli ağaçlara alternatif olarak kullanılabilirler (dengelemenin sıkı bir şekilde uygulanması yerine probalistik dengeleme kullanarak). Uygulaması kolaydır ve kırmızı-siyah bir ağaçtan daha hızlıdır. Bence her iyi programcı araçlarında olmalılar.

Atlama listelerine derinlemesine bir giriş yapmak istiyorsanız, burada MIT'in Algoritmalara Giriş dersinin bir videosuna bir bağlantı var.

Ayrıca, burada görsel olarak atla Listeleri gösteren bir Java uygulamasıdır.


+1 Qt, sıralanmış haritaları ve kümeleri için RB ağaçları yerine atlama listelerini kullanır. Evet, şıklar (zaten zorunlu dillerde).
Michael Ekstrand

2
Redis, "Sıralı Kümeler" uygulamak için atlama listelerini kullanır.
antirez

Listeleri atla, muhtemelen iyi bir veri yapısına ihtiyacım olduğunda kullanmak için en sevdiğim veri yapısıdır ve verilerin sırası konusunda hiçbir garantim yoktur ve diğer "dengeli" veri yapılarından daha basit bir uygulama istiyorum. Ne güzel bir şey.
earino

İlginç yan not: Atlama listelerinize yeterli düzey eklerseniz, esas olarak bir B ağacı elde edersiniz.
Riyad Kalla

92

Uzamsal Endeksler , özellikle R ağaçları ve KD ağaçları , uzamsal verileri verimli bir şekilde depolar. Coğrafi harita koordinat verileri ve VLSI yer ve rota algoritmaları ve bazen de en yakın komşu arama için iyidir.

Bit Dizileri, ayrı bitleri kompakt olarak saklar ve hızlı bit işlemlerine izin verir.


6
Mekansal indeksler, yerçekimi gibi uzun menzilli kuvvetleri içeren N-vücut simülasyonları için de yararlıdır.
Justin Peel

87

Fermuarlar - doğal bir 'imleç' kavramına sahip yapıyı değiştiren veri yapılarının türevleri - geçerli konum. Bunlar, göstergelerin sınır dışı olamayacağını garanti ettikleri için gerçekten yararlıdır - örneğin,hangi pencerenin odaklandığını izlemekiçin xmonad pencere yöneticisinde kullanılır.

Şaşırtıcı bir şekilde, matematikten orijinal veri yapısının tipine teknikler uygulayarak bunları türetebilirsiniz !


2
bu sadece işlevsel programlamada kullanışlıdır (zorunlu dillerde sadece bir işaretçi veya indeks tutarsınız). Ayrıca fermuarların nasıl çalıştığını hala anlamıyorum.
Stefan Monov

4
@Stefan, şimdi ayrı bir dizin veya işaretçi tutmanız gerekmediğidir.
Don Stewart

69

Burda biraz var:

  • Sonek dener. Hemen hemen her türlü dize araması için kullanışlıdır (http://en.wikipedia.org/wiki/Suffix_trie#Functionality ). Ayrıca bkz. Sonek dizileri; sonek ağaçları kadar hızlı değil, çok daha küçük.

  • Ağaçları yaymak (yukarıda belirtildiği gibi). Serin olmalarının nedeni üç yönlüdür:

    • Küçüktürler: Herhangi bir ikili ağaçta yaptığınız gibi sadece sol ve sağ işaretçilere ihtiyacınız vardır (düğüm rengi veya boyut bilgilerinin depolanması gerekmez)
    • Uygulaması (nispeten) çok kolaydır
    • Bir dizi "ölçüm kriteri" için optimal amortisman karmaşıklığı sunarlar (log n arama süresi herkesin bildiği zaman). Görmekhttp://en.wikipedia.org/wiki/Splay_tree#Performance_theorems
  • Yığın sıralı arama ağaçları: Bir ağaçta birkaç anahtar (anahtar, prio) çifti saklarsınız, öyle ki anahtarlara göre bir arama ağacı olur ve önceliklere göre yığınla sıralanır. Böyle bir ağacın benzersiz bir şekli olduğunu gösterebilir (ve her zaman tam olarak soldan sağa dolu değildir). Rastgele önceliklerle size beklenen O (log n) arama süresini, IIRC verir.

  • Bir niş, O (1) komşu sorguları ile yönlendirilmemiş düzlemsel grafikler için bitişik listelerdir. Bu, mevcut bir veri yapısını organize etmenin özel bir yolu kadar bir veri yapısı değildir. Bunu şu şekilde yapabilirsiniz: her düzlemsel grafiğin derecesi en fazla 6 olan bir düğümü vardır. Böyle bir düğümü seçin, komşularını komşu listesine koyun, grafikten kaldırın ve grafik boşalana kadar tekrarlayın. Bir çift (u, v) verildiğinde, v'nin komşu listesinde u ve u'nun komşu listesinde v arayın. Her ikisinin boyutu en fazla 6, yani bu O (1).

Yukarıdaki algoritmaya göre, u ve v komşuysa, v listesinde u ve u listesinde v bulunmaz. Buna ihtiyacınız varsa, her düğümün eksik komşularını bu düğümün komşu listesine ekleyin, ancak hızlı arama için ne kadar komşu listesinden bakmanız gerektiğini depolayın.


Yığın sıralı arama ağacına arpacık denir. Bunlarla yapabileceğiniz bir hile, bir düğümün önceliğini, ağacın alt kısmına silmek için değiştirilmesidir.
paperhorse

1
"Öbek sıralı arama ağacına bir ikram denir." - Duyduğum tanımda, IIRC, bir muamele, rastgele önceliklere sahip öbek sıralı bir arama ağacıdır . Uygulamaya bağlı olarak başka öncelikler de seçebilirsiniz ...
Jonas Kölker

2
Sonek üçgeni , dizeleri olan ve kenarlarında tek tek harfler olmayan ve doğrusal zamanda (!) Oluşturulabilen çok daha serin sonek ağacıyla neredeyse aynı değildir . Ayrıca asimptotik olarak daha yavaş olmasına rağmen, uygulamada sonek dizileri genellikle daha küçük boyutları ve daha az işaretçi dolaylamaları nedeniyle birçok görev için sonek ağaçlarından çok daha hızlıdır. O (1) düzlemsel grafik arama BTW seviyorum!
j_random_hacker

@j_random_hacker: sonek dizileri asimptotik olarak yavaş değildir. İşte lineer sonek dizi yapımı için ~ 50 kod satırı: cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
Edward KMETT

1
@Edward Kmett: Aslında bu makaleyi okudum, sonek dizisi yapımında oldukça büyük bir atılımdı . (Doğrusal zaman yapısının bir sonek ağacına "geçerek" mümkün olduğu zaten bilinmesine rağmen, bu inkar edilemez derecede pratik "doğrudan" algoritma idi.) Ancak, bir LCA olmadığı sürece inşaat dışındaki bazı işlemler hala bir sonek dizisinde asimptotik olarak daha yavaştır masa da inşa edilmiştir. Bu, O (n) 'de de yapılabilir, ancak saf sonek dizisinin boyutunu ve yerellik avantajlarını kaybedersiniz.
j_random_hacker

65

Bence standart veri yapılarına kilitsiz alternatifler, yani kilitsiz kuyruk, yığın ve liste çok göz ardı ediliyor.
Eşzamanlılık daha yüksek bir öncelik haline geldiğinden ve eşzamanlı okuma / yazma işlemlerini gerçekleştirmek için Mutexes veya kilitleri kullanmaktan çok daha takdire şayan bir amaç olduğu için giderek daha alakalı hale geliyorlar.

İşte bazı bağlantılar
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
http://www.research.ibm.com/people/m/michael/podc-1996.pdf [PDF'ye bağlantılar]
http://www.boyet.com/Articles/LockfreeStack.html

Mike Acton'un (genellikle kışkırtıcı) blogunda kilitsiz tasarım ve yaklaşımlar hakkında bazı mükemmel makaleler var



Bir yıkıcı, çoğu durumda aslında daha iyi bir iş çıkarır.
deadalnix

55

Bir grup öğeyi farklı setlere ve sorgu üyeliğine bölmeniz gerektiğinde Disjoint Set'in oldukça şık olduğunu düşünüyorum . Birlik ve Bul operasyonlarının iyi uygulanması, etkin bir şekilde sabit olan itfa edilmiş maliyetlerle sonuçlanır (veri yapıları sınıfımı doğru bir şekilde hatırlarsam Ackermnan'ın İşlevinin tersi).


8
Buna "buluntu bulma veri yapısı" da denir . Algoritmalar sınıfındaki bu akıllı veri yapısını ilk öğrendiğimde hayranlık duydum ...
BlueRaja - Danny Pflughoeft

union-find-delete uzantıları da sabit zamanlı silmeye izin verir.
Peaker

4
Tüm odalara pasajlarla ulaşılabildiğinden emin olmak için Zindan jeneratörüm için bir Ayrık Set kullandım :)
goldenratio

52

Fibonacci yığınları

En Kısa Yol problemi gibi grafikle ilgili birçok sorun için bilinen en hızlı algoritmalarda (asimptotik olarak) kullanılırlar. Dijkstra'nın algoritması standart ikili yığınlarla O (E log V) zamanında çalışır; Fibonacci yığınlarının kullanılması, yoğun grafikler için büyük bir hız olan O (E + V log V) 'e iyileştirir. Ne yazık ki, yüksek sabit bir etkenleri vardır, bu da onları pratikte pratik değildir.


Dediğiniz gibi yüksek sabit faktör ve zor bir arkadaşına göre uygulamak zor. Nişanlısı o kadar güzel değil, ama yine de, belki de bilmeye değer.
p4bl0

Buradaki adamlar onları diğer yığın türlerine göre daha rekabetçi hale getirdiler : cphstl.dk/Presentation/SEA2010/SEA-10.pdf Pairing Heaps adı verilen ve uygulaması daha kolay olan ve oldukça iyi pratik performans sunan bir veri yapısı var. Ancak, teorik analiz kısmen açıktır.
Manuel

Fibonacci yığınları ile yaşadığım deneyimlerden, bellek ayırmalarının maliyetli çalışmasının onu bir dizinin desteklediği basit bir ikili yığından daha az verimli hale getirdiğini öğrendim.
jutky

44

3D renderleme deneyimi olan herkes BSP ağaçlarına aşina olmalıdır . Genel olarak, bir 3D sahneyi kamera koordinatlarını ve yönünü bilerek oluşturma için yönetilebilir olacak şekilde yapılandıran yöntemdir.

İkili uzay bölümleme (BSP), bir uzayı hiperplanlar tarafından dışbükey kümelere özyineli olarak alt bölümlere ayırmak için bir yöntemdir. Bu alt bölüm, BSP ağacı olarak bilinen bir ağaç veri yapısı aracılığıyla sahnenin temsiline yol açar.

Başka bir deyişle, karmaşık şekilli çokgenleri dışbükey kümelere veya tamamen refleks olmayan açılardan (180 ° 'den küçük açılar) oluşan daha küçük çokgenlere ayırma yöntemidir. Alan bölümlendirmesinin daha genel bir açıklaması için bkz. Alan bölümlendirmesi.

Başlangıçta, bu yaklaşım oluşturma verimliliğini artırmak için 3D bilgisayar grafiklerinde önerildi. Diğer bazı uygulamalar arasında CAD'de şekillerle (yapısal katı geometri) geometrik işlemlerin yapılması, robotik ve 3D bilgisayar oyunlarında çarpışma tespiti ve karmaşık mekansal sahnelerin işlenmesini içeren diğer bilgisayar uygulamaları yer alır.


... ve ilgili oktrees ve kd ağaçları.
Lloeki


38

Parmak Ağaçlarına bir göz atın , özellikle daha önce bahsedilen tamamen işlevsel veri yapılarının hayranıysanız . Bunlar, amortize edilmiş sabit zamanda uçlara erişimi ve daha küçük parçanın boyutunda zaman logaritmik olarak birleştirmeyi ve bölünmeyi destekleyen kalıcı dizilerin işlevsel bir temsilidir.

Gereğince orijinal makalesinde :

Fonksiyonel 2-3 parmak ağaçlarımız, Okasaki (1998) tarafından ortaya konulan ve örtük özyinelemeli yavaşlama adı verilen genel bir tasarım tekniğinin bir örneğidir . Bu ağaçların, örtülü deque yapısının bir uzantısı olduğunu ve verimli birleştirme ve bölme için gereken esnekliği sağlamak için çiftleri 2-3 düğümle değiştirdiğini daha önce belirtmiştik.

Bir Parmak Ağacı bir monoid ile parametrelendirilebilir ve farklı monoidlerin kullanılması ağaç için farklı davranışlara neden olur. Bu, Parmak Ağaçlarının diğer veri yapılarını simüle etmesini sağlar.



Bu yinelenen cevaba bir göz atın , okumaya değer!
Francois G

34

Dairesel veya halka tampon - diğer şeylerin yanı sıra akış için kullanılır.


4
Ayrıca, iğrenç bir şekilde, bir şekilde patentli olmayı başardı (en azından video için kullanıldığında). ip.com/patent/USRE36801
David Eison

Bağlantıyı okumaya dayanarak, veri yapısının kendisinin patentli olduğunu düşünmüyorum, ancak buna dayanan bir buluş. Bunun kesinlikle çok az kullanılan bir veri yapısı olduğunu kabul ediyorum.
Yerçekimi

33

Kimsenin Merkle ağaçlarından (yani Hash Ağaçları ) bahsetmediğine şaşırdım .

Dosyanın yalnızca bir kısmını elinizde bulundurduğunuzda tüm dosyanın karmasını doğrulamak istediğiniz birçok durumda (P2P programları, dijital imzalar) kullanılır.


32

<zvrba> Van Emde-Boas ağaçları

Bence neden havalı olduklarını bilmek faydalı olacaktır . Genel olarak, "neden" sorusu en önemli sorudur;)

Cevabım, O (log log n) sözlüklerine, kullanılan anahtarlardan bağımsız olarak {1..n} anahtarları sağlamalarıdır. Tekrarlanan yarıya kadar size O (log n) verirken, tekrarlanan sqrting size O (log log n) verir, bu da vEB ağacında gerçekleşir.


Teorik açıdan güzeller. Bununla birlikte, pratikte, bunlardan rekabetçi performans elde etmek oldukça zordur. Bildiğim kağıt onları 32 bit anahtarlara ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.7403 ) kadar iyi çalışmalarını sağladı, ancak yaklaşım belki 34-35 bit'ten daha fazla ölçeklenmeyecek veya ve bunun bir uygulaması yok.
Manuel

Serin olmalarının bir başka nedeni, bir dizi önbellek-habersiz algoritma için önemli bir yapı taşı olmalarıdır.
Edward KMETT


29

Karma tablonun ilginç bir varyantına Cuckoo Hashing denir . Karma çarpışmalarla başa çıkmak için sadece 1 yerine çoklu karma işlevlerini kullanır. Çarpışmalar, eski nesnenin birincil karma tarafından belirtilen konumdan kaldırılması ve alternatif bir karma işleviyle belirtilen bir konuma taşınmasıyla çözülür. Cuckoo Hashing, bellek alanının daha verimli kullanılmasına izin verir, çünkü yük faktörünüzü sadece 3 hash fonksiyonu ile% 91'e kadar artırabilir ve yine de iyi erişim süresine sahip olabilirsiniz.


5
Daha hızlı olduğu iddia edilen seksek hashini kontrol edin.
chmike

27

Bir min-maks yığın bir bir çeşididir yığın uygular bir çift uçlu bir öncelik sırası. Bunu, yığın özelliğinde yapılan basit bir değişiklikle başarır: Çift (tek) seviyedeki her eleman, tüm çocuklardan ve büyük çocuklardan daha az (daha büyük) ise, bir ağacın min-max sipariş edildiği söylenir. Seviyeler 1'den başlayarak numaralandırılmıştır.

http://internet512.chonbuk.ac.kr/datastructure/heap/img/heap8.jpg


Uygulaması zor. En iyi programcılar bile yanlış anlayabilir.
finnw

26

Cache Oblivious veri yapılarını seviyorum . Temel fikir, birçok farklı boyuttaki önbelleklerin kendilerine uygun olan bloklardan yararlanabilmesi için, özyineli olarak daha küçük bloklara bir ağaç yerleştirmektir. Bu, RAM'deki L1 önbelleğinden, bu önbellek katmanlarından herhangi birinin boyutlarının özelliklerini bilmeye gerek kalmadan diskten okunan büyük veri yığınlarına kadar her şeyin önbelleğe alınmasının verimli bir şekilde kullanılmasına yol açar.


Bu bağlantıdan ilginç transkripsiyon: "Anahtar, 1977 yılında Peter van Emde Boas tarafından tasarlanan van Emde Boas ağacı veri yapısının adını alan van Emde Boas düzeni"
sergiol

23

Sol eğilerek kırmızı-siyah ağaçlar . 2008 yılında yayınlanan Robert Sedgewick tarafından kırmızı-siyah ağaçların önemli ölçüde basitleştirilmiş bir uygulaması (~ uygulanacak kod satırlarının yarısı). Kırmızı-Siyah bir ağacın uygulanmasına başınızı sarmakla ilgili sorun yaşadıysanız, bu varyantı okuyun.

Andersson Ağaçlarına çok benzer (özdeş değilse).



19

Gerth Stølting Brodal ve Chris Okasaki'nin çizik çarpık binom yığınları :

Uzun adlarına rağmen, bir işlev ayarında bile asimptotik olarak en uygun yığın işlemleri sağlarlar.

  • O(1)boyut, birleşim , insert, minimum
  • O(log n) deleteMin

Bu birlik alır Not O(1)yerine O(log n)genel olarak örneğin bir veri yapısı ders kitaplarında, kaplı daha iyi bilinen kümeler farklı zaman sol yığınları . Ve Fibonacci yığınlarından farklı olarak , bu asimtotikler, kalıcı olarak kullanılsa bile, amortize edilmekten ziyade en kötü durumdur!

Haskell'de birden fazla uygulama var .

Brodal ve Okasaki, Brodal ve aynı asimtotik ile zorunlu bir yığın bulduktan sonra ortaklaşa türetildiler .


18
  • Gerçek Zamanlı Raytracing'de kullanılan mekansal veri yapısı (diğerleri arasında) olan Kd-Ağaçları , farklı alanlarla kesişen üçgenlerin kırpılması gereken dezavantaja sahiptir. Genellikle BVH'ler daha hızlıdır çünkü daha hafiftirler.
  • MX-CIF Quadtrees , normal bir dörtlü ağacı dörtlülerin kenarlarındaki ikili bir ağaçla birleştirerek rastgele nokta kümeleri yerine sınırlayıcı kutuları saklar.
  • HAMT , ilgili sabitler nedeniyle genellikle O (1) karma haritalarını aşan erişim sürelerine sahip hiyerarşik karma haritası.
  • Arama motoru çevrelerinde oldukça iyi bilinen Tersine çevrilmiş dizin , çünkü farklı arama terimleriyle ilişkili belgelerin hızlı bir şekilde alınması için kullanılır.

Bunların hepsi olmasa da çoğu NIST Algoritmalar ve Veri Yapıları Sözlüğü'nde belgelenmiştir.



17

Gerçekten bir veri yapısı değil; dinamik olarak tahsis edilmiş dizileri optimize etmenin bir yolu daha vardır, ancak Emacs'ta kullanılan boşluk tamponları biraz havalıdır.


1
Bunu kesinlikle bir veri yapısı olarak görecektim.
Christopher Barber

İlgilenen herkes için, Swing metin bileşenlerini destekleyen Belge (örn. PlainDocument) modelleri de bu şekilde uygulanmaktadır; 1.2'den önce belge modellerinin düz diziler olduğuna inanıyorum, bu da büyük belgeler için korkunç yerleştirme performansına yol açıyor; Gap Buffers'a taşındıklarında, her şey tekrar dünya için geçerliydi.
Riyad Kalla

16

Fenwick Ağacı. Bir vektördeki tüm i ve j alt dizinleri arasındaki tüm öğelerin toplamını saymak için kullanılan bir veri yapısıdır. Başlangıcından bu yana toplamı önceden hesaplayan önemsiz çözüm, bir öğenin güncellenmesine izin vermez (devam etmek için O (n) işi yapmanız gerekir).

Fenwick Ağaçları O (log n) 'de güncelleme ve sorgulama yapmanıza izin verir ve nasıl çalıştığı gerçekten harika ve basittir. Fenwick'in burada bulunan ve ücretsiz olarak sunulan orijinal makalesinde gerçekten iyi açıklanmıştır:

http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue3/spe884.pdf

Babası, RQM ağacı da çok havalı: Vektörün iki indeksi arasındaki minimum eleman hakkında bilgi tutmanızı sağlar ve ayrıca O (log n) güncelleme ve sorguda da çalışır. Önce RQM'ye sonra Fenwick Ağacı'na öğretmeyi seviyorum.


Korkarım bu bir kopya . Belki de bir önceki cevaba eklemek istersiniz?
Francois G

Ayrıca, her türlü aralık sorgusu yapmak için yararlı olan Segment Ağaçları ile de ilgilidir.
dhruvbird


13

Yuvalanmış kümeler , ilişkisel veritabanlarındaki ağaçları temsil etmek ve üzerlerinde sorgu çalıştırmak için iyidir. Örneğin, ActiveRecord (Ruby on Rails'in varsayılan ORM'si) , ağaçlarla çalışmayı önemsiz hale getiren çok basit bir iç içe ayar eklentisi ile birlikte gelir .


12

Oldukça alana özgüdür, ancak yarım kenarlı veri yapısı oldukça temizdir. Bilgisayar grafikleri ve hesaplama geometrisinde çok yararlı olan çokgen kafesler (yüzler ve kenarlar) üzerinde yineleme yapmak için bir yol sağlar .

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.