Apa struktur data yang kurang dikenal tetapi bermanfaat?

795

Ada beberapa struktur data di sekitar yang benar-benar berguna tetapi tidak diketahui oleh kebanyakan programmer. Yang mana mereka?

Semua orang tahu tentang daftar yang ditautkan, pohon biner, dan hash, tetapi bagaimana dengan Melewati daftar dan filter Bloom misalnya. Saya ingin tahu lebih banyak struktur data yang tidak begitu umum, tetapi patut diketahui karena mereka mengandalkan ide-ide hebat dan memperkaya kotak alat programmer.

PS: Saya juga tertarik dengan teknik seperti Dancing link yang memanfaatkan properti struktur data secara pintar.

EDIT : Silakan coba sertakan tautan ke halaman yang menggambarkan struktur data secara lebih rinci. Juga, coba tambahkan beberapa kata tentang mengapa struktur data keren (seperti yang ditunjukkan Jonas Kölker ). Juga, coba berikan satu struktur data per jawaban . Ini akan memungkinkan struktur data yang lebih baik mengapung ke atas berdasarkan suara mereka sendiri.

f3lix
sumber

Jawaban:

271

Tries , juga dikenal sebagai prefix-tree atau crit-bit tree , telah ada selama lebih dari 40 tahun tetapi masih relatif tidak dikenal. Penggunaan percobaan yang sangat keren dijelaskan dalam " TRASH - LC-trie dinamis dan struktur data hash ", yang menggabungkan trie dengan fungsi hash.

David Phillips
sumber
12
sangat umum digunakan oleh pemeriksa ejaan
Steven A. Lowe
Burst Try juga merupakan varian yang menarik, di mana Anda hanya menggunakan awalan string sebagai node dan menyimpan daftar string di node.
Torsten Marek
Mesin regex di Perl 5.10 secara otomatis membuat percobaan.
Brad Gilbert
Dalam pengalaman saya percobaan sangat mahal, mengingat bahwa pointer umumnya lebih panjang dari char, yang memalukan. Mereka hanya cocok untuk kumpulan data tertentu.
Joe
18
Karena tidak ada pertanyaan SO, apa pun topiknya, selesai tanpa seseorang menyebut jQuery .... John Resig, pencipta jQuery, memiliki serangkaian struktur data yang menarik di mana ia melihat berbagai implementasi trie antara lain: ejohn.org/blog/ revisi-javascript-kamus-pencarian
Oskar Austegard
231

Filter Bloom : Array bit m bit, awalnya semua diatur ke 0.

Untuk menambahkan item Anda menjalankannya melalui fungsi hash k yang akan memberi Anda indeks k dalam array yang kemudian Anda tetapkan ke 1.

Untuk memeriksa apakah suatu item ada di set, hitung indeks k dan periksa apakah semuanya diatur ke 1.

Tentu saja, ini memberikan beberapa kemungkinan false-positif (menurut wikipedia sekitar 0,61 ^ (m / n) di mana n adalah jumlah item yang dimasukkan). Negatif palsu tidak dimungkinkan.

Menghapus item tidak mungkin, tetapi Anda dapat menerapkan penghitungan filter bloom , yang diwakili oleh array int dan kenaikan / penurunan.

albwq
sumber
20
Anda lupa menyebutkan penggunaannya dengan kamus :) Anda dapat memeras kamus penuh ke dalam filter mekar dengan sekitar 512k, seperti hashtable tanpa nilai-nilai
Chris S
8
Google mengutip penggunaan filter Bloom di sana penerapan BigTable.
Brian Gianforcaro
16
@FreshCode Ini sebenarnya memungkinkan Anda dengan murah menguji tidak adanya elemen dalam set karena Anda bisa mendapatkan positif palsu tetapi tidak pernah negatif palsu
Tom Savage
26
@FreshCode Seperti yang dikatakan @Tom Savage, lebih berguna saat memeriksa negatif. Misalnya, Anda dapat menggunakannya sebagai pemeriksa ejaan cepat dan kecil (dalam hal penggunaan memori). Tambahkan semua kata ke dalamnya lalu coba cari kata-kata yang dimasukkan pengguna. Jika Anda mendapatkan negatif itu berarti itu salah eja. Kemudian Anda dapat menjalankan beberapa pemeriksaan lebih mahal untuk menemukan kecocokan terdekat dan menawarkan koreksi.
lacop
5
@ abhin4v: Filter Bloom sering digunakan ketika sebagian besar permintaan cenderung mengembalikan jawaban "tidak" (seperti halnya di sini), yang berarti bahwa sejumlah kecil jawaban "ya" dapat diperiksa dengan tes pasti yang lebih lambat. Ini masih menghasilkan pengurangan besar dalam waktu respons kueri rata - rata . Tidak tahu apakah Penjelajahan Aman Chrome melakukan itu, tapi itu hanya dugaan saya.
j_random_hacker
140

Tali : Ini adalah string yang memungkinkan untuk prepends murah, substring, sisipan tengah dan tambahkan. Saya benar-benar hanya pernah menggunakannya sekali, tetapi tidak ada struktur lain yang cukup. String dan susunan array reguler jauh terlalu mahal untuk apa yang perlu kami lakukan, dan membalikkan segala sesuatu adalah mustahil.

Patrick
sumber
Saya sudah memikirkan hal seperti ini untuk keperluan saya sendiri. Senang mengetahui itu sudah diterapkan di tempat lain.
Kibbee
15
Ada implementasi dalam SGI STL (1998): sgi.com/tech/stl/Rope.html
quark
2
Tanpa mengetahui apa yang disebut, saya baru-baru ini menulis sesuatu yang sangat mirip dengan ini untuk Java - kinerjanya sangat baik: code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/…
mikera
Tali sangat jarang: stackoverflow.com/questions/1863440/…
Will
6
Tautan Mikera sudah basi, ini dia yang sekarang .
aptwebapps
128

Melewati daftar cukup rapi.

Wikipedia
Daftar lompatan adalah struktur data probabilistik, berdasarkan beberapa paralel, daftar tertaut yang diurutkan, dengan efisiensi yang sebanding dengan pohon pencarian biner (catatan log dan waktu rata-rata untuk sebagian besar operasi).

Mereka dapat digunakan sebagai alternatif untuk pohon seimbang (menggunakan keseimbangan probalistik daripada penegakan keseimbangan yang ketat). Mereka mudah diimplementasikan dan lebih cepat daripada mengatakan, pohon merah-hitam. Saya pikir mereka harus berada di setiap toolchest programmer yang baik.

Jika Anda ingin mendapatkan pengantar mendalam untuk melewati daftar di sini adalah tautan ke video perkenalan tentang Algoritma MIT untuk mereka.

Juga, di sini adalah applet Java menunjukkan Lists Lewati visual.

Simucal
sumber
+1 Qt menggunakan daftar lompatan alih-alih RB-tree untuk peta & set yang diurutkan. Ya, mereka bagus (dalam bahasa imperatif, toh).
Michael Ekstrand
2
Redis menggunakan daftar lewati untuk menerapkan "Set Diurutkan".
antirez
Abaikan daftar mungkin struktur data favorit saya untuk digunakan ketika saya membutuhkan struktur data yang baik dan saya tidak memiliki jaminan untuk urutan data, dan saya ingin implementasi yang lebih sederhana daripada struktur data "seimbang" lainnya. Suatu hal yang baik.
earino
Catatan sisi yang menarik: Jika Anda menambahkan level yang cukup ke daftar lompatan Anda, Anda pada dasarnya berakhir dengan B-tree.
Riyad Kalla
92

Indeks spasial , khususnya pohon R dan pohon KD , menyimpan data spasial secara efisien. Mereka bagus untuk data koordinat peta geografis dan algoritma VLSI place and route, dan kadang-kadang untuk pencarian tetangga terdekat.

Array Bit menyimpan bit individual secara kompak dan memungkinkan operasi bit cepat.

Yuval F
sumber
6
Indeks spasial juga berguna untuk simulasi N-body yang melibatkan gaya jarak jauh seperti gravitasi.
Justin Peel
87

Ritsleting - turunan dari struktur data yang memodifikasi struktur untuk memiliki gagasan alami 'kursor' - lokasi saat ini. Ini sangat berguna karena mereka menjamin indeks tidak dapat keluar dari batas - digunakan, misalnya di window manager xmonad untuk melacak window mana yang telah difokuskan.

Hebatnya, Anda dapat menurunkannya dengan menerapkan teknik dari kalkulus ke jenis struktur data asli!

Don Stewart
sumber
2
ini hanya berguna dalam pemrograman fungsional (dalam bahasa imperatif Anda hanya menyimpan pointer atau indeks). Juga tbh saya masih belum mengerti bagaimana ritsleting bekerja.
Stefan Monov
4
@Stan intinya adalah bahwa Anda tidak perlu menyimpan indeks atau pointer terpisah sekarang.
Don Stewart
69

Berikut ini beberapa di antaranya:

  • Suffix mencoba. Berguna untuk hampir semua jenis pencarian string (http://en.wikipedia.org/wiki/Suffix_trie#Functionality ). Lihat juga susunan sufiks; mereka tidak secepat pohon sufiks, tetapi jauh lebih kecil.

  • Bentangkan pohon (seperti yang disebutkan di atas). Alasan mereka keren ada tiga:

    • Mereka kecil: Anda hanya perlu pointer kiri dan kanan seperti yang Anda lakukan di pohon biner apa pun (tidak ada informasi warna-simpul atau ukuran yang perlu disimpan)
    • Mereka (relatif) sangat mudah diimplementasikan
    • Mereka menawarkan kompleksitas diamortisasi optimal untuk seluruh host "kriteria pengukuran" (login dan waktu pencarian menjadi semua orang tahu). Lihathttp://en.wikipedia.org/wiki/Splay_tree#Performance_theorems
  • Pohon pencarian berurutan Heap: Anda menyimpan sekelompok (kunci, prio) pasangan di pohon, sehingga itu pohon pencarian sehubungan dengan kunci, dan tumpukan memerintahkan sehubungan dengan prioritas. Orang dapat menunjukkan bahwa pohon seperti itu memiliki bentuk yang unik (dan itu tidak selalu penuh ke atas dan ke kiri). Dengan prioritas acak, ini memberi Anda waktu pencarian O (log n) yang diharapkan, IIRC.

  • Ceruk satu adalah daftar adjacency untuk grafik planar tidak berarah dengan O (1) pertanyaan tetangga. Ini bukan struktur data seperti cara tertentu untuk mengatur struktur data yang ada. Begini cara Anda melakukannya: setiap grafik planar memiliki simpul dengan derajat paling banyak 6. Pilih simpul seperti itu, letakkan tetangganya dalam daftar tetangganya, hapus dari grafik, dan ulangi sampai grafik kosong. Ketika diberi pasangan (u, v), cari u di daftar tetangga v dan untuk v di daftar tetangga u. Keduanya memiliki ukuran paling banyak 6, jadi ini adalah O (1).

Dengan algoritma di atas, jika u dan v adalah tetangga, Anda tidak akan memiliki u dalam daftar v dan v dalam daftar u. Jika Anda membutuhkan ini, tambahkan saja tetangga yang hilang setiap node ke daftar tetangga simpul itu, tetapi simpan berapa banyak dari daftar tetangga yang perlu Anda cari untuk pencarian cepat.

Jonas Kölker
sumber
Pohon pencarian Heap memerintahkan disebut treap. Salah satu trik yang dapat Anda lakukan dengan ini adalah mengubah prioritas sebuah node untuk mendorongnya ke bagian bawah pohon di mana lebih mudah untuk dihapus.
paperhorse
1
"Pohon pencarian yang dipesan Heap disebut treap." - Dalam definisi yang saya dengar, IIRC, treap adalah pohon pencarian yang diurutkan berdasarkan tumpukan dengan prioritas acak . Anda dapat memilih prioritas lain, tergantung pada aplikasi ...
Jonas Kölker
2
Trif sufiks hampir tetapi tidak sama dengan pohon sufiks yang jauh lebih dingin , yang memiliki string dan bukan huruf individual di tepinya dan dapat dibangun dalam waktu linier (!). Meskipun lebih lambat secara asimptot, dalam praktiknya susunan sufiks seringkali jauh lebih cepat daripada susunan sufiks untuk banyak tugas karena ukurannya yang lebih kecil dan lebih sedikit tipuan penunjuk. Love the O (1) planar graph lookup BTW!
j_random_hacker
@ j_random_hacker: array suffix tidak lebih lambat asimptotik. Berikut adalah ~ 50 baris kode untuk konstruksi array sufiks linier: cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
Edward KMETT
1
@ Edward Kmett: Sebenarnya saya sudah membaca makalah itu, itu adalah terobosan yang cukup dalam konstruksi susunan sufiks . (Walaupun sudah diketahui bahwa konstruksi waktu linier dimungkinkan dengan menggunakan "melalui" pohon sufiks, ini adalah algoritma "langsung" praktis pertama.) Tetapi beberapa operasi di luar konstruksi masih lebih lambat secara asimptot pada array sufiks kecuali LCA meja juga dibangun. Itu juga dapat dilakukan di O (n), tetapi Anda kehilangan ukuran dan manfaat lokalitas array suffix murni dengan melakukannya.
j_random_hacker
65

Saya pikir alternatif bebas kunci untuk struktur data standar yaitu antrian bebas kunci, tumpukan dan daftar banyak diabaikan.
Mereka semakin relevan karena concurrency menjadi prioritas yang lebih tinggi dan tujuan yang jauh lebih mengagumkan daripada menggunakan Mutex atau kunci untuk menangani baca / tulis bersamaan.

Berikut ini beberapa tautan
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
http://www.research.ibm.com/people/m/michael/podc-1996.pdf [Tautan ke PDF]
http://www.boyet.com/Articles/LockfreeStack.html

Blog Mike Acton (sering provokatif) memiliki beberapa artikel bagus tentang desain dan pendekatan bebas kunci

zebrabox
sumber
Alternatif bebas kunci sangat penting di dunia kecanduan multi-core, sangat paralel, skalabilitas saat ini :-)
earino
Yah, pengganggu sebenarnya melakukan pekerjaan yang lebih baik dalam banyak kasus.
deadalnix
55

Saya pikir Disjoint Set cukup bagus untuk kasus-kasus ketika Anda perlu membagi banyak item menjadi set yang berbeda dan permintaan keanggotaan. Implementasi yang baik dari operasi Union dan Find menghasilkan biaya diamortisasi yang secara efektif konstan (kebalikan dari Fungsi Ackermnan, jika saya mengingat kelas struktur data dengan benar).

Dana
sumber
8
Ini juga disebut "struktur data union-find." Saya kagum ketika saya pertama kali belajar tentang struktur data pintar ini di kelas algoritme ...
BlueRaja - Danny Pflughoeft
ekstensi union-find-delete memungkinkan penghapusan waktu-konstan juga.
Peaker
4
Saya menggunakan Disjoint Set untuk generator Dungeon saya, untuk memastikan semua kamar dapat dijangkau melalui jalur :)
goldenratio
52

Tumpukan Fibonacci

Mereka digunakan dalam beberapa algoritma yang dikenal paling cepat (tanpa gejala) untuk banyak masalah yang berhubungan dengan grafik, seperti masalah Jalur Terpendek. Algoritma Dijkstra berjalan dalam waktu O (E log V) dengan tumpukan biner standar; menggunakan tumpukan Fibonacci meningkatkannya menjadi O (E + V log V), yang merupakan percepatan besar untuk grafik padat. Sayangnya, mereka memiliki faktor konstan yang tinggi, seringkali membuat mereka tidak praktis dalam praktik.

Adam Rosenfield
sumber
Faktor konstan tinggi seperti yang Anda katakan, dan sulit diimplementasikan dengan baik menurut teman yang harus. Fianally tidak begitu keren, tapi tetap saja, mungkin perlu diketahui.
p4bl0
Orang-orang di sini membuat mereka berjalan kompetitif dibandingkan dengan jenis tumpukan lainnya: cphstl.dk/Presentation/SEA2010/SEA-10.pdf Ada struktur data terkait yang disebut Pairing Heaps yang lebih mudah diimplementasikan dan yang menawarkan kinerja praktis yang cukup bagus. Namun, analisis teoretis sebagian terbuka.
Manuel
Dari pengalaman saya dengan tumpukan Fibonacci, saya menemukan bahwa operasi alokasi memori yang mahal membuatnya kurang efisien daripada tumpukan biner sederhana yang didukung oleh array.
Juli
44

Siapa pun yang berpengalaman dalam rendering 3D harus terbiasa dengan pohon-pohon BSP . Secara umum, ini adalah metode dengan menyusun adegan 3D agar dapat dikelola untuk rendering mengetahui koordinat dan bantalan kamera.

Binary space partisiing (BSP) adalah metode untuk membagi ruang secara rekursif menjadi set cembung oleh pesawat terbang. Subdivisi ini memunculkan representasi adegan dengan menggunakan struktur data pohon yang dikenal sebagai pohon BSP.

Dengan kata lain, ini adalah metode memecah poligon yang berbentuk rumit menjadi set cembung, atau poligon yang lebih kecil yang seluruhnya terdiri dari sudut non-refleks (sudut lebih kecil dari 180 °). Untuk deskripsi yang lebih umum tentang partisi ruang, lihat partisi ruang.

Awalnya, pendekatan ini diusulkan dalam grafik komputer 3D untuk meningkatkan efisiensi rendering. Beberapa aplikasi lain termasuk melakukan operasi geometris dengan bentuk (konstruktif solid geometri) di CAD, deteksi tabrakan dalam game robotika dan komputer 3D, dan aplikasi komputer lainnya yang melibatkan penanganan adegan spasial yang kompleks.

spoulson
sumber
... dan oktri terkait dan pohon kd.
Lloeki
43

Pohon Huffman - digunakan untuk kompresi.

Lurker Memang
sumber
Meskipun menarik, bukankah ini jenis 'Intro to Algorithms', di sini-adalah-contoh-dari-jenis-serakah-algo?
rshepherd
38

Lihatlah Finger Trees , terutama jika Anda seorang penggemar struktur data yang murni fungsional yang disebutkan sebelumnya . Mereka adalah representasi fungsional dari sekuens persisten yang mendukung akses ke ujung dalam waktu konstan diamortisasi, dan penggabungan dan pemisahan dalam waktu logaritmik dalam ukuran potongan yang lebih kecil.

Sesuai artikel aslinya :

Pohon 2-3 jari fungsional kami adalah contoh dari teknik desain umum yang diperkenalkan oleh Okasaki (1998), yang disebut perlambatan rekursif implisit . Kami telah mencatat bahwa pohon-pohon ini merupakan perpanjangan dari struktur deque implisitnya, menggantikan pasangan dengan 2-3 node untuk memberikan fleksibilitas yang diperlukan untuk penggabungan dan pemisahan yang efisien.

Finger Tree dapat diparameterisasi dengan monoid , dan menggunakan monoid yang berbeda akan menghasilkan perilaku yang berbeda untuk pohon tersebut. Ini memungkinkan Finger Tree mensimulasikan struktur data lainnya.

huitseeker
sumber
Lihat jawaban duplikat ini , ini layak dibaca!
Francois G
34

Circular atau ring buffer - digunakan untuk streaming, antara lain.

pendiam
sumber
4
Juga, menjijikkan, entah bagaimana berhasil dipatenkan (setidaknya saat digunakan untuk video). ip.com/patent/USRE36801
David Eison
Berdasarkan membaca tautan, saya tidak berpikir struktur data itu sendiri dipatenkan, tetapi beberapa penemuan berdasarkan itu. Saya setuju bahwa ini jelas merupakan struktur data yang sangat jarang digunakan.
Gravity
33

Saya terkejut tidak ada yang menyebut pohon Merkle (mis. Hash Trees ).

Digunakan dalam banyak kasus (program P2P, tanda tangan digital) di mana Anda ingin memverifikasi hash seluruh file ketika Anda hanya memiliki bagian dari file yang tersedia untuk Anda.

BlueRaja - Danny Pflughoeft
sumber
32

<zvrba> Pohon Van Emde-Boas

Saya pikir akan bermanfaat untuk mengetahui mengapa mereka keren. Secara umum, pertanyaan "mengapa" adalah yang paling penting untuk ditanyakan;)

Jawaban saya adalah mereka memberi Anda kamus O (log log n) dengan kunci {1..n}, terlepas dari berapa banyak kunci yang digunakan. Sama seperti separuh berulang memberi Anda O (log n), sqrting berulang memberi Anda O (log log n), yang adalah apa yang terjadi di pohon vEB.

Jonas Kölker
sumber
Mereka bagus dari sudut pandang teoretis. Namun dalam praktiknya, cukup sulit untuk mendapatkan kinerja kompetitif dari mereka. Makalah yang saya tahu membuat mereka bekerja dengan baik hingga 32 bit kunci ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.240.403 ) tetapi pendekatan tidak akan skala untuk lebih dari mungkin 34-35 bit atau begitu dan tidak ada implementasi itu.
Manuel
Alasan lain mengapa mereka keren adalah bahwa mereka adalah blok bangunan kunci untuk sejumlah algoritma yang tidak memperhatikan cache.
Edward KMETT
29

Varian yang menarik dari tabel hash disebut Cuckoo Hashing . Ini menggunakan beberapa fungsi hash, bukan hanya 1 untuk menangani tabrakan hash. Tabrakan diselesaikan dengan menghapus objek lama dari lokasi yang ditentukan oleh hash utama, dan memindahkannya ke lokasi yang ditentukan oleh fungsi hash alternatif. Cuckoo Hashing memungkinkan penggunaan ruang memori yang lebih efisien karena Anda dapat meningkatkan load factor hingga 91% dengan hanya 3 fungsi hash dan masih memiliki waktu akses yang baik.

A. Retribusi
sumber
5
Periksa hashing hopscotch diklaim lebih cepat.
chmike
26

Saya suka Cast Oblivious datastructures . Ide dasarnya adalah untuk meletakkan pohon di blok-blok yang lebih kecil secara rekursif sehingga cache dengan berbagai ukuran akan memanfaatkan blok yang cocok untuk mereka. Ini mengarah pada penggunaan caching yang efisien dalam segala hal, mulai dari cache L1 di RAM hingga potongan besar data yang dibaca dari disk tanpa perlu mengetahui secara spesifik ukuran dari setiap lapisan caching tersebut.

btilly
sumber
Transkripsi menarik dari tautan itu: "Kuncinya adalah tata letak van Emde Boas, dinamai setelah struktur data pohon van Emde Boas disusun pada tahun 1977 oleh Peter van Emde Boas"
sergiol
23

Pohon Miring Merah-Hitam Miring . Implementasi yang disederhanakan secara signifikan dari pohon merah-hitam oleh Robert Sedgewick yang diterbitkan pada 2008 (~ setengah dari baris kode untuk diimplementasikan). Jika Anda pernah mengalami kesulitan membungkus kepala Anda di sekitar implementasi pohon Merah-Hitam, baca tentang varian ini.

Sangat mirip (jika tidak identik) dengan Andersson Trees.

Lucas
sumber
19

Tumpukan binewial bootstrap oleh Gerth Stølting Brodal dan Chris Okasaki:

Terlepas dari nama panjang mereka, mereka menyediakan operasi heap optimal asimptotik, bahkan dalam pengaturan fungsi.

  • O(1)ukuran, penyatuan , masukkan, minimum
  • O(log n) deleteMin

Perhatikan bahwa penyatuan membutuhkan O(1)lebih dari O(log n)waktu tidak seperti tumpukan yang lebih terkenal yang biasanya dicakup dalam buku teks struktur data, seperti tumpukan kiri . Dan tidak seperti tumpukan Fibonacci , asimptotik itu adalah yang terburuk, bukannya diamortisasi, bahkan jika digunakan terus-menerus!

Ada beberapa implementasi di Haskell.

Mereka bersama-sama diturunkan oleh Brodal dan Okasaki, setelah Brodal datang dengan tumpukan imperatif dengan asimptotik yang sama.

Edward KMETT
sumber
18
  • Kd-Trees , struktur data spasial yang digunakan (antara lain) dalam Real-Time Raytracing, memiliki sisi negatif yang segitiga yang memotong ruang yang berbeda harus dipotong. Secara umum, BVH lebih cepat karena lebih ringan.
  • MX-CIF Quadtrees , simpan kotak pembatas alih-alih set titik sembarang dengan menggabungkan quadtree biasa dengan pohon biner di tepi paha depan.
  • HAMT , peta hash hirarkis dengan waktu akses yang umumnya melebihi O (1) peta hash karena konstanta yang terlibat.
  • Inverted Index , cukup terkenal di kalangan mesin pencari, karena digunakan untuk pengambilan cepat dokumen yang terkait dengan istilah pencarian yang berbeda.

Sebagian besar, jika tidak semua, ini didokumentasikan pada Kamus Algoritma dan Struktur Data NIST

Jasper Bekkers
sumber
18

Pohon Bola. Hanya karena mereka membuat orang tertawa.

Bola pohon adalah struktur data yang mengindeks poin dalam ruang metrik. Inilah artikel tentang membangunnya. Mereka sering digunakan untuk menemukan tetangga terdekat ke suatu titik atau mempercepat k-means.

anon
sumber
Ini juga dikenal sebagai pohon "vantage point" atau vp-tree. en.wikipedia.org/wiki/Vp-tree
Edward KMETT
17

Tidak benar-benar struktur data; lebih banyak cara untuk mengoptimalkan array yang dialokasikan secara dinamis, tetapi buffer celah yang digunakan dalam Emacs agak keren.

kerkeslager
sumber
1
Saya pasti akan menganggap itu sebagai struktur data.
Christopher Barber
Bagi siapa pun yang tertarik, ini persis bagaimana model Dokumen (misalnya, PlainDocument) yang mendukung komponen teks Swing diterapkan juga; sebelum 1.2 saya percaya model dokumen adalah Array lurus, yang mengarah pada kinerja penyisipan yang mengerikan untuk dokumen besar; segera setelah mereka pindah ke Gap Buffers, semua beres dengan dunia lagi.
Riyad Kalla
16

Pohon Fenwick. Ini adalah struktur data untuk menjaga jumlah penjumlahan semua elemen dalam vektor, antara dua subindeks i dan j yang diberikan. Solusi sepele, menghitung ulang jumlah sejak awal tidak memungkinkan untuk memperbarui item (Anda harus melakukan O (n) bekerja untuk menjaga).

Fenwick Trees memungkinkan Anda untuk memperbarui dan meminta dalam O (log n), dan cara kerjanya sangat keren dan sederhana. Ini dijelaskan dengan sangat baik di koran asli Fenwick, tersedia secara gratis di sini:

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

Ayahnya, pohon RQM juga sangat keren: Ini memungkinkan Anda untuk menyimpan info tentang elemen minimum antara dua indeks dari vektor, dan juga bekerja di O (log n) pembaruan dan kueri. Saya suka mengajar pertama RQM dan kemudian Pohon Fenwick.

eordano
sumber
Saya khawatir ini duplikat . Mungkin Anda ingin menambahkan ke jawaban sebelumnya?
Francois G
Juga terkait adalah Segmen Pohon, yang berguna untuk melakukan segala macam kueri rentang.
dhruvbird
13

Kumpulan bersarang bagus untuk mewakili pohon dalam database relasional dan menjalankan kueri pada mereka. Sebagai contoh, ActiveRecord (ORM default Ruby on Rails) hadir dengan plugin set bersarang yang sangat sederhana , yang membuat bekerja dengan pohon sepele.

esad
sumber
12

Ini cukup spesifik untuk domain, tetapi struktur data setengah-tepi cukup rapi. Ini menyediakan cara untuk beralih di atas jerat poligon (wajah dan tepi) yang sangat berguna dalam grafik komputer dan geometri komputasi.

Mpen
sumber