es un conjunto de puntos en un plano. Se da un punto aleatorio en el mismo plano. La tarea es ordenar todo por distancia euclidiana entre e .
Un enfoque sin cerebro es calcular distancias entre e para todos y luego ordenarlos usando cualquier algoritmo rápido.
¿Hay alguna forma de almacenar o preprocesar para que el proceso de clasificación sea más rápido?
cg.comp-geom
sorting
Alex K.
fuente
fuente
Respuestas:
Solución 1: Encuentre las bisectrices perpendiculares entre pares de puntos y construya la disposición de estas líneas. La disposición tiene celdas Θ ( n 4 ) , dentro de las cuales el orden ordenado es constante. Por lo tanto, cree una estructura de datos de ubicación de puntos para la disposición y decore cada celda con el orden ordenado que se devolverá para los puntos dentro de esa celda. Los pedidos ordenados entre celdas adyacentes difieren solo en una sola transposición, por lo que puede usar una estructura de datos persistente para permitir que las representaciones de estos pedidos clasificados compartan espacio. El espacio total es O ( n 4 ) y el tiempo de consulta es OΘ(n2) Θ(n4) O(n4) .O(logn)
Solución 2: Elija una muestra aleatoria de de estas mismas bisectrices perpendiculares, construya su disposición y divida cada celda de disposición por segmentos de línea vertical a través de cada cruce de dos líneas muestreadas. La partición resultante tiene celdas Θ ( n 2 ) , cada una de las cuales con alta probabilidad es cruzada por O ( n ) bisectrices sin muestrear. Decora cada celda de la partición mediante un orden ordenado válido de los puntos como se ve desde alguna x dentro de la celda. El espacio total es O ( n 3 ) .Θ(n) Θ(n2) O(n) O(n3)
Ahora, para hacer una consulta, ubique el punto de consulta en la partición, busque el orden almacenado con la celda de partición y use el algoritmo de clasificación de comparación de árbol cartesiano de Levcopoulos y Petersson (1989) comenzando con este orden almacenado. El tiempo para este paso es proporcional a donde k i es el número de puntos que están fuera de orden con el punto y i . Pero Σ k i es O ( n ) (cada uno sin muestrear causas bisectrices a lo sumo uno fuera de orden par de puntos), por lo que el tiempo de consulta∑iO(1+logki) ki yi ∑ki O(n) también es O ( n ) .∑iO(1+logki) O(n)
fuente
Probablemente no podrá escapar de momento en que lo corte; incluso las regiones de precomputación correspondientes a todas las posibles órdenes de clasificación podrían (creo) producir regiones O ( n ! ) y, por lo tanto, encontrar 'su' región mediante cualquier técnica de búsqueda significativa tomará O ( log ( n ! ) ) = O ( n log ( n ) ) tiempo. ( EDITAR:nlog(n) O(n!) O(log(n!))=O(nlog(n)) esto está absolutamente mal; ¡vea la excelente respuesta de David Eppstein para obtener más información!) Una forma útil de reducir la complejidad, por otro lado, especialmente si no necesita la clasificación completa de una vez, pero solo necesita poder extraer aleatoriamente el más cercano sobre la marcha - que podría ser a través de orden superior diagramas de Voronoi: extensiones de la celda de Voronoi estándar que acogen no sólo el vecino más cercano, pero, papel de Frank Dehne etc. segunda más cercana de k-vecino más cercano de búsqueda, http: //people.scs .carleton.ca / ~ dehne / publications / 2-02.pdf parece ser la referencia canónica; su página de inicio en http://www.dehne.carleton.ca/publications tiene otros documentos sobre diagramas de Voronoi que podrían ser útiles.k
fuente