Árvore B comparada a uma árvore R - Não são apenas várias listas vinculadas?

10

Estou bastante familiarizado com uma Árvore B, principalmente tendo que manter os bancos de dados bem alimentados com eletricidade, ar condicionado e espaço no disco rígido. Associo-me a uma lista vinculada dupla (doubl [ie, ey]?).

Hoje, um dos desenvolvedores no almoço mencionou uma árvore R.

Eu pulei na Wikipedia e comecei a ler. Parecia uma árvore B mais alta. Infelizmente, não ter uma formação matemática profunda torna difícil entender o que alguns dos meus colegas de trabalho estão falando.

Eu esperava que alguém pudesse esclarecer algumas diferenças entre uma árvore B e uma árvore R. Provavelmente, acabarei perguntando aos caras, mas não há garantia de que eles responderão à minha pergunta. Muito provavelmente eles começarão a divagar sobre Deus sabe o quê. . .

surfasb
fonte
um BTree definitivamente não é como uma lista dupla vinculada. Uma árvore permite acessar operações de log (n) em vez de proporcional a n, como nas listas.
Javier
@Javier: os nós das folhas de um índice de árvore b são geralmente uma lista duplamente vinculada para permitir a recuperação rápida de irmãos dos nós de índice.
Jordan
11
Sendo uma questão puramente técnica, isso pertence ao StackOverflow (por favor, não o repasse lá, ele será automigrado se houver pessoas suficientes para fechá-lo aqui).
Péter Török
11
Este tópico está aqui: Programmers.SE é para perguntas conceituais sobre programação. O estouro de pilha é para quando você realmente tem código com o qual precisa de ajuda.
2
@ Peter Torok: Sob o sistema antigo, isso seria uma pergunta SO. Mas agora que este site existe.
surfasb

Respostas:

7

Uma árvore R pode ser vista como generalização de uma árvore b. Onde uma árvore b fornece acesso a O (log n) em um "intervalo limitado" das chaves que ele contém, uma árvore R fornece acesso a O (log n) em uma "região dimensional K" das chaves que ele contém.

Se você quisesse mapear CEPs para nomes de condados, você poderia usar uma B-Tree, pois poderia perguntar "Quais são todos os municípios com CEPs entre 60000 e 61000?" No entanto, uma B-Tree não seria adequada para mapear coordenadas GPS para nomes de condados para consultas como "Quais são todos os municípios dentro de 160 quilômetros de Chicago?", Uma vez que apenas ordena suas chaves em uma única dimensão. Um R-Tree divide suas chaves de acordo com as caixas delimitadoras sobrepostas e, portanto, é uma maneira natural de armazenar chaves quando você precisa consultar várias dimensões.

SingleNegationElimination
fonte
Eu gosto da analogia.
Surfasb
11
Mais um exemplo concreto do que uma analogia, é exatamente como esses algoritmos de índice são usados.
SingleNegationElimination
6

A maioria das estruturas em árvore pode ser reduzida a alguma forma de lista vinculada, desde que você ignore como a lista é construída (especificamente, como os elementos são adicionados e removidos e como os nós são reequilibrados, se aplicável). É essencialmente o algoritmo de inserção / exclusão / recuperação que distingue uma estrutura de dados de outra.

Os nós em uma árvore R geralmente contêm uma caixa delimitadora, que permite indexar com eficiência os locais, conforme necessário, se você deseja procurar registros "próximos" a um local específico. Os elementos em uma árvore B têm uma ordem mais simples; você pode comparar diretamente se algo é maior ou igual a outro elemento. Em uma árvore R, o objetivo de cada entrada é determinar quais elementos estão contidos em uma caixa delimitadora.

Uma Árvore B permite pesquisar com eficiência itens que podem ser solicitados na memória secundária (como um disco rígido), e uma Árvore R permite pesquisar com eficiência elementos que estão "em" ou "próximos" a um ponto ou caixa delimitadora específica, também na memória secundária.

JasonTrue
fonte
Parece que a árvore R começa a mostrar sua distinção à medida que o número de elementos cresce, correto? Ou isso é um pouco simplificado demais?
Surfasb
Penso que, dado um número semelhante de nós, você não veria uma diferença específica no uso do espaço, exceto pelo custo linear dos dados da caixa delimitadora em nós que não são folhas. Mas você simplesmente não pode representar caixas delimitadoras com eficiência na definição convencional de uma Árvore B, portanto, certamente usaria muito mais espaço se tentasse representar informações espaciais em uma Árvore B. A R-Tree é para relacionamentos espaciais, a B-Tree suporta apenas pedidos de dimensão única.
JasonTrue
2
@ JasonTrue: Na verdade, existem maneiras eficientes de linearizar caixas delimitadoras para a indexação da Árvore B: en.wikipedia.org/wiki/Geohash . Embora os hashes sejam "eficientes", eles não são particularmente convenientes. É provável que uma consulta arbitrária de caixa delimitadora faça 9 consultas separadas para um espaço bidimensional e, se a caixa se sobrepuser a um eixo principal (por exemplo, The International Dateline), o número de consultas pode dobrar ou quadruplicar e torna-se muito complicado de usar. Apesar disso, ainda é uma opção quando os índices lineares são o único tipo disponível.
SingleNegationElimination