Por que alguém usaria um Octree sobre uma árvore KD?

32

Tenho alguma experiência em computação científica e usei extensivamente kd-trees para aplicativos BSP (particionamento de espaço binário). Recentemente, familiarizei-me com octrees, uma estrutura de dados semelhante para particionar espaços euclidianos em 3D, mas que funciona em intervalos regulares fixos, pelo que entendi.

Um pouco de pesquisa sobre independência parece indicar que o kd-trees geralmente tem desempenho superior para a maioria dos conjuntos de dados - mais rápido para construir e consultar. Minha pergunta é: quais são as vantagens de octrees no desempenho espacial / temporal ou não, e em quais situações elas são mais aplicáveis ​​(eu ouvi a programação de gráficos 3D)? Um resumo das vantagens e problemas de ambos os tipos me agradeceria mais.

Como um extra, se alguém pudesse elaborar sobre o uso da estrutura de dados da árvore R e suas vantagens, eu também ficaria grato por isso. As árvores R (mais do que as octrees) parecem ser aplicadas de maneira bastante semelhante às árvores kd para pesquisas de k-vizinho mais próximo ou de alcance.

Noldorin
fonte
Devo observar que ambas as árvores kd e árvores R (mas não as árvores) parecem projetadas especificamente para facilitar as buscas dos vizinhos mais próximos k - como eles se comparam nesse sentido?
Noldorin
Uma observação é que as árvores kd garantem uma pequena profundidade. Árvores quádruplas compactadas podem levá-lo até lá, mas são menos convenientes.
Suresh Venkat
@Suresh Venkat: Obrigado por isso. Não estou familiarizado com quadríceps compactados, mas eles seriam realmente adequados para representantes espaciais em 3D? Talvez haja um análogo de "octree comprimido".
Noldorin
Também ouvi dizer que as octrees são mais apropriadas quando se tem uma curva conhecida de ordem Z (preenchimento de espaço), mas não tenho muita certeza do raciocínio aqui.
Noldorin

Respostas:

23

As células em uma árvore podem ter uma alta proporção, enquanto as células octree têm a garantia de serem cúbicas. Como se trata de um quadro teórico, apresentarei a razão teórica para a alta proporção de aspecto ser um problema: torna impossível o uso de limites de volume para controlar o número de células que você deve examinar ao resolver consultas de vizinhos mais próximas.kD

Mais detalhadamente: se você solicitar um vizinho mais próximo, próximo à , a um ponto de consulta , e o vizinho mais próximo estiver na distância , você normalmente termina uma pesquisa que examina todas as células da estrutura de dados que chegam de dentro para a parte externa de um anel ou invólucro anular com raio interno e raio externo . Se as células tiverem uma proporção de aspecto limitada, como estão em uma quadtree, pode haver no máximo essas células, e você poderá provar bons limites no tempo para a consulta. Se a proporção não for limitada, como em uma árvore , esses limites não se aplicarão.q d d ( 1 + ϵ ) d 1 / ϵ d - 1 k Dϵqdd(1+ϵ)d1/ϵd1kD

kD árvores de têm uma vantagem diferente sobre as quadrípedes, na medida em que elas garantem uma profundidade logarítmica máxima, o que também contribui para o tempo para uma consulta de vizinho mais próximo. Mas a profundidade de uma quadtree é, no máximo, o número de bits de precisão da entrada que geralmente não é grande, e existem métodos teóricos para controlar a profundidade como essencialmente logarítmica (consulte a estrutura de dados quadtree).

David Eppstein
fonte
4
Veja o livro recente de Sariel Har-Peled para um resumo moderno de quadríceps compactados.
Jeffε
Obrigado por um bom resumo quantitativo, David. Apenas para confirmar: o uso de "proporção" é sinônimo de "proporção de ramificação"? Definitivamente vou ter que checar quadrees / octrees e também quadtrees / octrees comprimidos.
Noldorin
11
A proporção de uma caixa retangular pode ser definida como a proporção entre o comprimento mais longo da borda e o menor comprimento da borda. Não sei o que razão de ramificação deve significar neste contexto, mas a proporção de aspecto não está relacionada ao fator de ramificação das árvores (que é constante para as duas estruturas de dados).
David Eppstein
Eu perdi as "células". Faz sentido agora.
Noldorin
15

Eu e um grupo de amigos estamos trabalhando em um jogo RTS espacial como um projeto paralelo divertido. Estamos usando muitas das coisas que aprendemos na Ciência da Computação para torná-la altamente eficiente, o que nos permite criar exércitos maciços mais tarde.

Para esse propósito, consideramos o uso do kd-trees, mas rapidamente os descartamos: inserções e exclusões são extremamente comuns em nosso programa (considere uma nave voando pelo espaço), e essa é uma bagunça profana com o kd-trees. Por isso, escolhemos octrees para o nosso jogo.

Alex ten Brink
fonte
Ah, sim, eu já ouvi isso antes também. A inserção / exclusão com kd-trees é uma operação cara (devido ao reequilíbrio). Eu acredito que as complexidades de melhor caso ainda são as mesmas ...
Noldorin 5/10/11
2
Depende de como você conserta a árvore do kd. Uma boa complexidade de tempo de melhor caso não é algo que geralmente busco: por exemplo, o bogosort tem uma complexidade de melhor caso O (1), mas espero que ninguém a use.
Alex10 Brink
Infelizmente, não consigo encontrar bons resumos de complexidades de tempo para operações comuns nessas estruturas de dados, mas não me importo. -Case média complexidade de tempo é muitas vezes perspicaz ...
Noldorin
11
Eu realmente acho que você ainda faria melhor se usasse uma árvore KD que alternasse entre eixos e simplesmente dividisse o espaço no meio. Ignore o volumoso SAH e outros cortes medianos caros e você terminará com algo que não apenas pesquisa mais rápido que um octree, mas também cria mais rapidamente. Como você está particionando o espaço uniformemente como faria com uma octree, mas com uma árvore binária em vez de uma árvore com 8 anos, o que você estava fazendo antes para remoções não deveria ser mais complexo com a árvore KD, pois serão espaçados igualmente de maneira semelhante. Ex: você pode simplesmente remover nós vazios além de uma profundidade de N.
Dragon Energy
8

quais são as vantagens dos octrees no desempenho espacial / temporal ou não, e em quais situações elas são mais aplicáveis ​​(eu ouvi a programação de gráficos 3D)?

As árvores kD são árvores binárias balanceadas e outras são tentativas, de modo que as vantagens e desvantagens provavelmente são herdadas dessas estruturas de dados mais gerais. Especificamente:

  • O reequilíbrio pode ser caro (os octrees não precisam de reequilíbrio).
  • O balanceamento lida melhor com a heterogeneidade porque é adaptável.
  • Maior fator de ramificação em octrees significa árvores mais rasas (menos indiretos e alocações) para distribuições homogêneas.

Além disso, a bissecção (como em octrees) se presta a uma implementação trivial em termos de manipulação de bits. Da mesma forma, imagino que os octrees possam se beneficiar muito das distâncias pré-computadas ao fazer pesquisas de alcance.

EDITAR

Aparentemente, minhas referências a tentativas e homogeneidade precisam de esclarecimentos.

As tentativas são uma família de estruturas de dados representadas por árvores de dicionários e são usadas como dicionários para chaves que são sequências (principalmente cadeias de caracteres, mas também seqüências de DNA e os bits em um valor de hash para tentativas de hash). Se cada dicionário mapeia um bit de cada uma das coordenadas x, ye z (bit mais significativo no primeiro nível do trie, próximo bit significativo no segundo nível etc.), então o trie é uma octree que subdivide uniformemente o espaço 3D. Portanto, os octrees herdam as características das tentativas que são, em geral:

  • Alto fator de ramificação pode significar árvores rasas que incorrem em poucos indiretos, portanto a pesquisa é rápida, por exemplo, 20 níveis de árvore binária podem ser armazenados em 4 níveis de uma árvore com um fator de ramificação de 256.
  • As tentativas não são reequilibradas durante inserções e exclusões, economizando uma operação cara e necessária para árvores binárias balanceadas.

A desvantagem é que a heterogeneidade pode resultar em tentativas / octrees desequilibradas, portanto as pesquisas podem exigir muitos indiretos. O problema equivalente nas tentativas é resolvido usando a compactação de arestas para recolher vários níveis de indireção em um único nível. Octrees não fazem isso, mas não há nada para impedi-lo de compactar uma octree (mas acho que você não poderia chamar o resultado de octree!).

Para comparação, considere um dicionário especializado para chaves de cadeia de caracteres que é representado como um trie. O primeiro nível da série ramifica no primeiro caractere na chave. O segundo nível no segundo caractere e assim por diante. Qualquer cadeia de caracteres pode ser procurada pesquisando o primeiro caractere da chave no dicionário para obter um segundo dicionário usado para pesquisar o segundo caractere na chave e assim por diante. Um conjunto de cadeias de teclas aleatórias seria uma distribuição homogênea . Um conjunto de cadeias de teclas que compartilham algum prefixo (por exemplo, todas as palavras que começam com "anti") são heterogêneasdistribuição. No último caso, o primeiro dicionário contém apenas uma ligação, para "a", o segundo único para "n" e assim por diante. A busca por qualquer mapeamento na série está sempre pesquisando os mesmos quatro dicionários com as mesmas quatro chaves. Isso é ineficiente e é o que os octrees fazem se, por exemplo, forem usados ​​para armazenar distribuições heterogêneas de partículas, onde a grande maioria das partículas se encontra em um pequeno volume dentro do espaço vetorial.

Jon Harrop
fonte
"octrees are try"? Além disso, o que você quer dizer com "lida melhor com a heterogeneidade"? Homogêneo não é uma palavra que encontrei em relação a árvores.
Noldorin
2
"Octtrees não precisam de reequilíbrio"? Isso não é absolutamente verdade para os octters que armazenam distribuições de pontos heterogêneas. Como alternativa, dependendo da definição geral de "octtree": O reequilíbrio de uma octtree é simplesmente impossível , por mais desejável que seja.
Jeffε
@Noldorin "octrees are try". Sim. Você sabe o que é um trie? en.wikipedia.org/wiki/Trie
Jon Harrop 13/06
@Noldorin "Homogêneo não é uma palavra que encontrei em relação a árvores". Estou me referindo à homogeneidade da distribuição que está sendo particionada. Por exemplo, ao particionar partículas em um espaço 3D, os átomos em um sólido são distribuídos homogeneamente, enquanto as estrelas no universo são distribuídas heterogeneamente. É provável que as árvores kD sejam preferíveis para distribuições heterogêneas porque sua subdivisão de espaço é adaptável.
precisa
@ Jɛ ff E "O reequilíbrio de uma octtree é simplesmente impossível". Isso é exatamente o que eu estava me referindo. Desculpas se minhas palavras eram confusas.
precisa
2

Octrees são úteis como um tipo de dados base para modelos de continuum, veja, por exemplo, o solucionador de fluxo Gerris . A vida é bastante difícil na dinâmica de fluidos, portanto, saber que os tamanhos de todos os seus subcubos depende apenas da profundidade deles deve ser um fator simplificador.

Advertência: Eu não sou um dinamista fluido!

jjg
fonte
Interessante. Definitivamente, posso apreciar que as octrees são mais simples de trabalhar em modelos contínuos ... Gostaria de saber qual é o motivo da programação gráfica?
Noldorin