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.