B Дерево порівняно з деревом R - Хіба це не лише купа зв'язаних списків, пов’язаних разом?


10

Я досить добре знайомий з деревом B, в основному змушений підтримувати бази даних, які живляться електроенергією, кондиціонером та жорстким диском. Я пов'язую з подвійним (подвійним (тобто, очей)?) Списком пов'язаних.

Сьогодні один із розробників під час обіду згадав R-дерево.

Я стрибнув у Вікіпедію і почав читати. Це звучало жахливо, як високе дерево Б. На жаль, відсутність глибокої математики є важкою для розуміння того, про що говорять деякі мої колеги.

Я сподівався, що хтось зможе уточнити кілька відмінностей між B-деревом та R-деревом. Я, мабуть, все одно запитаю хлопців, але немає гарантії, що вони відповідуть на моє запитання. Більш ніж ймовірно, вони почнуть суперечити про те, що Бог знає, що. . .


BTree точно не схожий на подвійний зв'язаний список. Дерево дозволяє отримати доступ до операцій log (n) замість пропорційного n, як у списках.
Хав'єр

@Javier: Листові вузли індексу b-дерева, як правило, є подвійно пов'язаним списком, щоб забезпечити швидке знайомство вузлів індексу.
Йорданія

1
Будучи чисто технічним питанням, це належить до StackOverflow (будь ласка, не перекладайте його там, хоча воно буде автоматизовано, якщо достатньо людей проголосує, щоб закрити його тут).
Péter Török

1
Це тематичне питання тут: Programmers.SE призначений для концептуальних питань щодо програмування. Переповнення стека - це те, коли у вас фактично є код, вам потрібна допомога.

2
@ Петер Торок: У старій системі ця ОСОБА була б питанням. Але тепер, коли цей сайт існує.
surfasb

Відповіді:


7

Дерево R можна розглядати як узагальнення b-дерева. Якщо b-дерево забезпечує O (log n) доступ через "обмежений діапазон" клавіш, який він містить, дерево R забезпечує доступ O (log n) до "K розмірної області" ключів, які він містить.

Якщо ви хотіли зіставити поштові індекси на імена округів, ви можете скористатись B-деревом, оскільки ви можете запитати його "Які всі округи мають поштові індекси між 60000 та 61000?" Однак B-Tree було б погано підходити для відображення координат GPS до назв графств для запитів типу "Які всі округи в межах 100 миль від Чикаго?", Оскільки він замовляє свої ключі лише в одному вимірі. R-дерево розбиває свої ключі відповідно до перекриваючих обмежувальних коробок, і тому це природний спосіб зберігати ключі, коли вам потрібно здійснити запит у кількох вимірах.


Мені подобається аналогія.
surfasb

1
Більш конкретний приклад, ніж аналогія. Це саме те, як ці алгоритми індексу використовуються.
SingleNegationElimination

6

Більшість структур дерев можна звести до деякої форми зв'язаного списку, якщо ви ігноруєте, як створений список (зокрема, як елементи додаються та видаляються, і як ребалансируються вузли, якщо це застосовується). По суті, алгоритм вставки / видалення / вилучення відрізняє одну структуру даних від іншої.

Вузли в дереві R зазвичай містять обмежувальне поле, яке дозволяє ефективно індексувати місця, як це може знадобитися, якщо ви хочете шукати записи "біля" певного місця. Елементи в B-дереві мають більш просте впорядкування; Ви можете безпосередньо порівняти, чи є щось більше або рівне іншому елементу. У R-дереві мета кожного запису полягає у визначенні, які елементи містяться у обмежувальному полі.

Дерево B-дерева дозволяє ефективно шукати впорядковані елементи у вторинній пам'яті (наприклад, на жорсткому диску), а R-дерево дозволяє ефективно шукати елементи, які знаходяться "біля" або "поруч" у певній точці чи обмежувальному вікні у вторинній пам'яті.


Здається, R-дерево починає виявляти свою відмінність, коли кількість елементів зростає, правда? Або це трохи надто спрощено?
surfasb

Я думаю, що, враховуючи аналогічну кількість вузлів, ви не побачите особливої ​​різниці у використанні простору, за винятком лінійної вартості даних обмежувальної коробки на нелистових вузлах. Але ви просто не можете ефективно представити обмежувальні поля в звичайному визначенні B-дерева, тож ви, звичайно, використаєте набагато більше місця, якби спробували представити просторову інформацію в B-дереві. Дерево R призначене для просторових відносин, B-Дерево підтримує лише одномірне впорядкування.
JasonTrue

2
@JasonTrue: Насправді є ефективні способи лінеаризації обмежувальних полів для індексації B-Tree: en.wikipedia.org/wiki/Geohash . Хоча хеші "ефективні", вони не особливо зручні. Довільний обмежувальний запит на вікно, ймовірно, потребуватиме 9 окремих запитів для двовимірного простору, і якщо вікно перекриває основну вісь (скажімо, International Dateline), кількість запитів може подвоїтися або вчетверо збільшитися, і вона стає дуже громіздкою у використанні. Незважаючи на це, все ще є варіант, коли лінійні індекси є єдиним видом.
SingleNegationElimination
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.