é um conjunto de pontos em um plano. Um ponto aleatório é dado no mesmo plano. A tarefa é classificar todos pela distância euclidiana entre e .
Uma abordagem sem cérebro é calcular as distâncias entre e para todos os e depois classificá-las usando qualquer algoritmo rápido.
Existe alguma maneira de armazenar ou pré-processar para que o processo de classificação se torne mais rápido?
cg.comp-geom
sorting
Alex K.
fonte
fonte
Respostas:
Solução 1: Encontre os bissetores perpendiculares entre pares de pontos e construa o arranjo dessas linhas. A organização possui células , nas quais a ordem classificada é constante. Portanto, crie uma estrutura de dados de localização de pontos para a organização e decore cada célula com a ordem classificada que será retornada para os pontos dentro dessa célula. As ordens classificadas entre células adjacentes diferem apenas em uma única transposição, portanto, você pode usar uma estrutura de dados persistente para permitir que as representações dessas ordens classificadas compartilhem espaço. O espaço total é e o tempo de consulta é .Θ ( n 4 ) O ( n 4 ) O ( log n )Θ ( n2) Θ ( n4) O ( n4) O ( logn )
Solução 2: Escolha uma amostra aleatória de desses mesmos bissetores perpendiculares, construa seu arranjo e divida cada célula de arranjo por segmentos de linha verticais através de cada cruzamento de duas linhas amostradas. A partição resultante possui células , cada uma das quais com alta probabilidade é atravessada por bissetores não amostrados. Decore cada célula da partição com uma ordenação ordenada válida dos pontos, conforme visualizado em algum x dentro da célula. O espaço total é .Θ ( N 2 ) O ( n ) S ( n 3 )Θ ( n ) Θ ( n2) O ( n ) O ( n3)
Agora, para fazer uma consulta, localize o ponto de consulta na partição, procure a ordem armazenada com a célula da partição e use o algoritmo de classificação por comparação de árvore cartesiana de Levcopoulos & Petersson (1989) começando com essa ordem armazenada. O tempo para esta etapa é proporcional a que é o número de pontos que estão fora de ordem com o ponto . Mas é (cada bissetor não amostrado causa no máximo um par de pontos fora de ordem), portanto, o tempo de consulta também é .∑EuO ( 1 + logkEu) kEu yEu ∑ kEu O ( n ) ∑EuO ( 1 + logkEu) O ( n )
fonte
Você provavelmente não será capaz de se afastar do tempo da maneira que o cortar; mesmo regiões pré-computadas correspondentes a todas as ordens de classificação possíveis poderiam (acredito) produzir regiões O ( n ! ) e, assim, encontrar 'sua' região por qualquer técnica de pesquisa significativa levará O ( log ( n ! ) ) = O ( n log ( n ) ) hora. ( EDIT:n log( N ) O ( n ! ) O ( log( n ! ) ) = O ( n log( N ) ) isso está absolutamente errado; veja excelente resposta de David Eppstein para mais informações) Uma forma útil de começar a reduzir a complexidade, por outro lado - especialmente se você não precisa o tipo completo de uma só vez, mas só precisa ser capaz de puxar aleatoriamente th-mais próximo em tempo real - pode ser através de diagramas de Voronoi de ordem superior: extensões da célula Voronoi padrão que acomodam não apenas o vizinho mais próximo, mas o segundo mais próximo etc. O artigo de Frank Dehne sobre o k-vizinho mais próximo pesquisando, http: //people.scs .carleton.ca / ~ dehne / publicações / 2-02.pdf parece ser a referência canônica; sua página inicial em http://www.dehne.carleton.ca/publications tem vários outros artigos sobre diagramas de Voronoi que podem ser úteis.k
fonte