Sé que los kd se usan tradicionalmente para almacenar puntos, pero en su lugar quiero almacenar líneas. ¿Sería mejor dividir la línea en cada intersección con la división del árbol kd? ¿o almacenaría solo los puntos finales en kd-suficiente para encontrar al vecino más cercano?Cómo almacenar mejor las líneas en un árbol kd
Respuesta
Bueno, tienes que dividir las líneas en las intersecciones, de lo contrario te metes en problemas con los pesos de las hojas del árbol.
Por otro lado, si no usa SAH o cualquier otro algoritmo para atravesar el árbol, puede hacer lo que quiera con la idea original del árbol kd. Pero si es vinculado a algunos algoritmos tradicionales, tiene para dividir líneas. Tienes que hacerlo solo porque cada hoja del árbol tiene un peso (supongo que en tu caso depende de la longitud de las líneas).
Y si no divide las líneas, también obtendrá los pesos incorrectos de las hojas. No, si no divide las líneas, debe duplicarlas en ambas hojas a las que pertenece la línea.
¿Tienes que usar un árbol kd? Para primitivas extendidas, un bv-tree podría ser más eficiente.
El kd-tree en sí está diseñado para objetos punto. Ni siquiera para cajas, esferas o algo como esto. Creo que puede de alguna manera usar un árbol 6d que almacena minx, maxx, miny, maxy, minz, maxz
; pero no estoy del todo seguro sobre cómo consultarlo correctamente.
El R*-tree (Wikipedia) podría ser una mejor opción aquí. Está realmente diseñado para objetos con una extensión espacial. Si buscas las publicaciones relacionadas, incluso experimentaron con diferentes aproximaciones de objetos complejos; por ejemplo, si vale la pena triangularizarlos, usar una circumsfera, un cuadro delimitador y, curiosamente, IIRC, el polígono de 5 esquinas proporciona el mejor rendimiento en algunos casos.
De todos modos, la familia de árboles * R podría ser una opción interesante.
- 1. KD-Árbol en GLSL
- 2. Edificio kd-árbol en CUDA
- 3. ¿Cómo almacenar estructuras de árbol en Java?
- 4. Cómo almacenar un árbol en la base de datos SQL
- 5. La mejor manera de almacenar el árbol de prefijo grande
- 6. Mejor técnica para las líneas de tiempo
- 7. método eficiente para encontrar KNN de todos los nodos de un árbol KD-
- 8. ¿Cómo se dibujan las líneas de un árbol genealógico usando HTML CSS?
- 9. ¿Cómo funciona la búsqueda del vecino KD más cercano?
- 10. Cuándo usar árboles Kd?
- 11. En vim, ¿cómo puedo eliminar todas las líneas en un archivo, excepto las últimas 100 líneas?
- 12. C/C++: Cómo almacenar datos en un archivo en el árbol B
- 13. ExtJS 4 - Nunca almacenar en caché los nodos del árbol en el panel del árbol
- 14. KD-Tree transversal (raytracing): ¿me falta un caso?
- 15. ¿Cuál es la mejor clave principal para almacenar las URL
- 16. La mejor manera de almacenar las configuraciones para T4
- 17. La mejor manera de almacenar las configuraciones fuera de web.config
- 18. ¿Cómo implementar un árbol binario?
- 19. Reemplace las líneas nuevas, pero conserve las líneas en blanco
- 20. ¿Cómo manejo las nuevas líneas en JSON?
- 21. C# ¿Cómo cuento las líneas en un archivo de texto
- 22. ¿Cómo contar las líneas de un archivo en C++?
- 23. ¿Cómo elimino todas las líneas coincidentes en un buffer?
- 24. Cómo unir las primeras n líneas en un archivo
- 25. Cómo decorar un árbol en Haskell
- 26. ¿Puedo usar métricas arbitrarias para buscar árboles KD?
- 27. ¿Cómo almacenar el directorio/jerarquía/estructura de árbol en la base de datos?
- 28. ¿Cómo contar las líneas en una cadena?
- 29. Cómo romper una cuerda en las líneas
- 30. Mejor manera de almacenar datos en caché
Depende de lo que quieras hacer. Recuerde que una línea (segmento) es simplemente una colección de dos coordenadas, por lo que puede describirse por una sola coordenada, con el doble de dimensiones. Por lo tanto, podría almacenar líneas como puntos en un árbol kd de mayor dimensión. –
Estoy tratando de crear un campo de distancia con las líneas. Por lo tanto, utilizaré la funcionalidad vecina más cercana del kd-tree. Sin embargo, no quiero agregar más datos de los que tengo (los puntos finales de los segmentos de línea). – newDelete