B Tree dibandingkan dengan R tree - Bukankah hanya sekelompok daftar yang ditautkan yang dihubungkan bersama?

10

Saya cukup akrab dengan B Tree, terutama harus menjaga agar database tetap dialiri oleh listrik, AC, dan ruang harddisk. Saya mengaitkan dengan daftar tertaut ganda (yaitu [mata, mata]?).

Hari ini, salah satu pengembang saat makan siang menyebutkan pohon R.

Saya melompat ke Wikipedia dan mulai membaca. Kedengarannya mengerikan seperti pohon B yang lebih tinggi. Sayangnya, tidak memiliki latar belakang matematika yang mendalam membuatnya sulit untuk memahami apa yang dibicarakan beberapa rekan kerja saya.

Saya berharap jika seseorang dapat mengklarifikasi beberapa perbedaan antara pohon B dan pohon R. Aku mungkin akan berakhir bertanya pada mereka, tapi tidak ada jaminan bahwa mereka akan menjawab pertanyaanku. Kemungkinan besar mereka akan mulai mengoceh tentang apa yang Tuhan tahu. . .

surfasb
sumber
sebuah BTree jelas tidak seperti daftar yang ditautkan ganda. Pohon memungkinkan akses dalam operasi log (n) bukannya proporsional ke n, seperti pada daftar.
Javier
@ Javier: node daun dari indeks b-tree biasanya merupakan daftar yang ditautkan ganda untuk memungkinkan pengambilan saudara cepat dari indeks indeks.
Jordan
1
Menjadi pertanyaan yang murni teknis, ini milik StackOverflow (tolong jangan posting ulang di sana, itu akan otomatis jika cukup banyak orang memilih untuk menutupnya di sini).
Péter Török
1
Ini adalah topik di sini: Programmer.SE adalah untuk pertanyaan konsep tentang pemrograman. Stack Overflow adalah untuk saat Anda benar-benar memiliki kode yang Anda perlukan bantuan.
2
@ Peter Torok: Di bawah sistem yang lama, ini AKAN menjadi pertanyaan SO. Tapi sekarang situs ini ada.
surfasb

Jawaban:

7

R Tree dapat dianggap sebagai generalisasi dari b-tree. Di mana b-tree menyediakan O (log n) akses di atas "rentang terbatas" dari kunci yang dikandungnya, R Tree menyediakan O (log n) akses di atas "wilayah dimensi K" dari kunci yang dikandungnya.

Jika Anda ingin memetakan kode pos ke nama county, Anda bisa menggunakan B-Tree, karena Anda bisa bertanya "Apa semua negara dengan kode pos antara 60000 dan 61000?" Namun, B-Tree akan tidak cocok untuk memetakan koordinat GPS ke nama-nama county untuk pertanyaan seperti "Apa semua kabupaten dalam 100 mil dari Chicago?", Karena itu hanya memesan kuncinya pada dimensi tunggal. R-Tree memecah kuncinya sesuai dengan kotak tumpang tindih yang tumpang tindih, dan itu adalah cara alami untuk menyimpan kunci ketika Anda perlu melakukan query pada berbagai dimensi.

SingleNegationElimination
sumber
Saya suka analoginya.
surfasb
1
Lebih dari contoh konkret daripada analogi, Persisnya bagaimana algoritma indeks ini digunakan.
SingleNegationElimination
6

Sebagian besar struktur pohon dapat direduksi menjadi beberapa bentuk daftar yang ditautkan, selama Anda mengabaikan cara pembuatan daftar (khususnya, bagaimana elemen ditambahkan dan dihapus, dan bagaimana simpul-simpul tersebut disusun kembali, jika ada). Ini pada dasarnya adalah algoritma penyisipan / penghapusan / pengambilan yang membedakan satu struktur data dari yang lain.

Node dalam R-Tree umumnya berisi kotak pembatas, yang memungkinkan Anda untuk mengindeks lokasi secara efisien, seperti yang mungkin Anda perlukan jika Anda ingin mencari catatan "di dekat" lokasi tertentu. Elemen dalam B-Tree memiliki pemesanan yang lebih sederhana; Anda dapat langsung membandingkan apakah sesuatu lebih besar atau sama dengan elemen lain. Dalam R-Tree, tujuan setiap entri adalah untuk menentukan elemen apa yang terkandung dalam kotak pembatas.

B-Tree memungkinkan Anda untuk mencari item yang dapat dipesan secara efisien dalam memori sekunder (seperti hard disk), dan R-Tree memungkinkan Anda untuk mencari elemen-elemen yang "at" atau "dekat" titik atau kotak pembatas tertentu secara efisien, juga dalam memori sekunder.

Jason True
sumber
Kedengarannya seperti pohon R mulai menunjukkan perbedaannya ketika jumlah elemen bertambah, benar? Atau itu terlalu disederhanakan?
surfasb
Saya pikir mengingat jumlah node yang sama, Anda tidak akan melihat perbedaan tertentu dalam penggunaan ruang kecuali untuk biaya linier dari data kotak pembatas pada node non-daun. Tetapi Anda tidak bisa merepresentasikan kotak pembatas secara efisien dalam definisi konvensional B-Tree, jadi, Anda tentu akan menggunakan lebih banyak ruang jika Anda mencoba merepresentasikan informasi spasial dalam B-Tree. R-Tree adalah untuk hubungan spasial, B-Tree hanya mendukung pemesanan satu dimensi.
JasonTrue
2
@JasonTrue: Sebenarnya, ada cara-cara efisien untuk membuat linierisasi kotak terikat untuk pengindeksan B-Tree: en.wikipedia.org/wiki/Geohash . Meskipun hash "efisien", mereka tidak terlalu nyaman. Kueri kotak terikat sewenang-wenang cenderung mengambil 9 kueri terpisah untuk ruang 2 dimensi, dan jika kotak tumpang tindih dengan sumbu utama (katakanlah, Dateline Internasional), jumlah kueri dapat berlipat dua atau empat kali lipat dan menjadi sangat rumit untuk digunakan. Meskipun demikian, ini masih menjadi pilihan ketika indeks linier adalah satu-satunya jenis yang tersedia.
SingleNegationElimination