Custos de execução aprox. pesquisa de vizinho mais próximo em um salto de quadtree

10

NOTA : A pergunta foi reafirmada em minhas respostas: Supondo que agora possamos encontrar os ancestrais de irmãos mais baixos no tempo , a RNA pode realmente ser executada em O ( log n ) ?O(1)O(logn)


Quadtrees são índices espaciais eficientes. Eu tenho um quebra-cabeça com a implementação de uma pesquisa de vizinhos mais próximos em uma estrutura de quadtree compactada, conforme descrito em [2]. (Sem entrar em detalhes, a pesquisa vai de cima para baixo ao longo dos chamados quadrados equidistantes, terminando no nó da cauda de um caminho equidistante. Na imagem anexada, pode ser que um dos nós no sudeste esteja cheio de pontos.)

Para que o algoritmo funcione, é necessário manter para cada nó - um quadrado com pelo menos dois quadrantes não vazios - ponteiros para cada nó ancestral mais baixo (o mais próximo da hierarquia) em cada uma das quatro direções (norte, oeste, sul , leste). Eles são indicados pelas setas verdes do ancestral oeste dos nós (a seta aponta para o centro do quadrado ancestral).

O documento afirma que esses ponteiros podem ser atualizados em O (1) durante inserções e exclusões de pontos. No entanto, ao olhar para a inserção do ponto verde, parece que preciso atualizar qualquer número arbitrário de ponteiros, neste caso seis deles.

Espero um truque para fazer essa atualização do ponteiro em tempo constante. Talvez exista uma forma de indireção que possa ser explorada?

quadtree antes (esquerda) e depois da inserção do ponto (direita)

EDITAR:

A secção relevante do papel é de 6,3, onde se lê: "se o caminho tem curvas, em seguida, para além da mais baixas antepassados de q , devemos considerar também para cada um dos 2 d instrues ancestral mais baixo de q que vai nessa direção [...] A localização desses quadrados a partir de q pode ser feita em O ( 1 ) tempo por quadrado se associarmos ponteiros adicionais de 2 d a cada quadrado em Q 0log(c/ε)q2dqqO(1)2dQ0apontando para seus antepassados ​​mais próximos para cada direção. Esses ponteiros também podem ser atualizados no tempo durante uma inserção ou exclusão de um ponto ".O(1)

[2]: Eppstein, D. e Goodrich, MT e Sun, JZ, “The Skip Quadtree: Uma estrutura dinâmica simples de dados para dados multidimensionais”, em Anais do vigésimo primeiro simpósio anual em geometria computacional, pp. 296-305 2005.

0__
fonte
2
Já faz um tempo, então não me lembro com precisão, mas ao reler o artigo nesta manhã (tanto nas versões arxiv quanto nas revistas), não consegui encontrar onde diz que mantemos os indicadores de que precisamos. Eu pensei que estávamos apenas mantendo ponteiros pai-filho e ponteiros de amostras cruzadas. Então, talvez você possa apontar com mais precisão o texto no artigo que diz o que você diz que faz.
David Eppstein #
2
Oi David, obrigado por dar uma olhada. A pesquisa de RNA é a última seção (6). O problema está indicado na fig. 7 (b), que é aproximadamente o que representei graficamente na ilustração acima, se q estiver em algum lugar no canto inferior esquerdo. Eu editei a pergunta para incluir a parte específica do texto da seção 6.3. Eu tenho algumas idéias sobre como eu poderia ser relaxado com a definição de equistabbing talvez, mas eu não tenho certeza se pode provar que qualquer contagem alternativa não viola o desempenho alvejado ...
0__
2
Ok, isso parece um problema. Estou discutindo isso com Goodrich (perdemos contato com Sun, que fez a maioria dos detalhes aqui). Nosso sentimento atual é que não precisamos realmente desses ponteiros extras (não precisamos deles por intervalos aproximados, por que os vizinhos aprox devem ser diferentes e deve ser possível que o algoritmo de consulta se lembre dos ancestrais que viu no em vez de usar ponteiros para procurá-los), mas entraremos em contato com você quando tivermos um pouco mais de certeza dos detalhes aqui.
David Eppstein
2
Ótimo, muito obrigado. Por razões de contagem de caracteres e layout, adicionarei uma resposta que esboça minha 'ideia intuitiva', talvez seja um ponto de partida.
0__

Respostas:

11

Como Davi, não sei por que Jonathan fez essa observação sobre os indicadores. Eles não são necessários. Como David mencionou acima, a propriedade essencial é que, quando estamos localizando um ponto em uma folha v em Q_0, é suficiente lembrar os nós irmãos (e suas caixas) no quadtree pular. Quando processamos uma caixa a partir de P, fazemos um local de ponto para a caixa de folha mais próxima ao nosso ponto de consulta, inserindo as caixas de irmãos à medida que descemos. Parece que isso seria mais ou menos o mesmo que sua resposta. Além disso, esse procedimento é muito semelhante, por exemplo, à forma como a localização aproximada dos pontos é feita no seguinte artigo: Arya, Sunil e Mount, David M. e Netanyahu, Nathan S. e Silverman, Ruth e Wu, Angela Y., "Um algoritmo ideal para o vizinho mais próximo aproximado pesquisando dimensões fixas", JACM, 1998. De fato,

Michael Goodrich
fonte
Boas notícias! Eu só não tinha certeza se a adição dos irmãos durante a etapa descendente mudaria o limite do pior custo geral ou não, mas suponho que não. Eu tinha olhou para o papel por Arya et al, mas eu achei muito menos acessível do que o seu papel Quadtree :).
0__
5
Uau! Bem-vindo ao cstheory.SE!
Hsien-Chih Chang
5

Pode-se pensar em pular quadtree como uma implementação de lista de pulos de uma estrutura de dados que armazena os pontos de acordo com sua ordem z. É (sem dúvida) pelo menos conceitualmente mais simples ...

Veja o capítulo 2 aqui: http://goo.gl/pLiEO .

E sim, supondo que você possa executar algumas operações básicas da ordem z em tempo constante, você pode definitivamente executar a ANN em tempo logarítmico. O capítulo mencionado acima também mostra que não há como evitar operações bizarras se alguém quiser quadríceps compactados. Observe que a operação LCA não é necessária ...

Sariel Har-Peled
fonte
3
Sim, e as variantes determinísticas são muito semelhantes a 2-3 árvores para a mesma ordem z.
precisa
r
O raio definitivo diminui durante o processo de pesquisa. Estou razoavelmente otimista, o argumento está correto.
precisa saber é o seguinte
1

Também sinto intuitivamente que alguém poderia viver sem esses ponteiros e, como preciso persistir em todos os nós para fazer o disco rígido em algum momento, qualquer redução nos ponteiros é grande.

lbestrmaxdist(v,q)qvv

Plbestp0Q0rmaxlbestp0Q0qlbestrmaxqdist(q,v)dist(q,v)vqqv

dist(q,v)>rmaxq2P

qp0QjrmaxQj1Q0

rmaxP


EDIT (abril de 2013)

rmax

O(n)

insira a descrição da imagem aqui

0__
fonte
0

O(ϵ1d(logn+logϵ1))

ϵ=1v

Q0

O(n)d=2ϵ=1O(logn)

Portanto, a menos que esteja faltando algo crucial, o algoritmo não pode atingir a velocidade declarada. Quaisquer comentários ou idéias?

Travessia

0__
fonte