¿Cuál es la mejor estructura de datos para usar al programar una grilla bidimensional de mosaicos en Java? Las fichas en la cuadrícula deben ser fácilmente referenciadas por su ubicación, de modo que los vecinos y las rutas se puedan calcular de manera eficiente. ¿Debería ser una matriz 2D? Una ArrayList? ¿Algo más?Programación de una grilla 2D en Java
Respuesta
Si no se preocupa demasiado por la velocidad o la memoria, puede simplemente usar una matriz 2D: esto debería funcionar bastante bien.
Si la velocidad y/o la memoria son problemas para usted, esto depende del uso de la memoria y del patrón de acceso.
Una matriz unidimensional es el camino a seguir si necesita un alto rendimiento. Calcule el índice correcto como y * wdt + x
. Hay 2 posibles problemas con esto: falta de memoria caché y el uso de memoria.
Si sabe que su patrón de acceso es tal que busca vecinos de un elemento la mayor parte del tiempo, mapear un espacio 2D en una matriz 1D como se describió anteriormente puede causar fallas de caché; desea que los vecinos estén cerca memoria, y los vecinos de 2 filas diferentes no lo son. Puede que tenga que asignar sus mosaicos 2d en un orden diferente a su matriz 1d. Ver Hilbert curves por ejemplo.
Para un mejor uso de la memoria, si sabe que la mayoría de sus teselas son siempre las mismas (por ejemplo, césped), puede implementar sparse array o quad tree. Ambos pueden implementarse de manera bastante eficiente, teniendo en cuenta el conocimiento de caché (el enlace de matriz dispersa es un buen ejemplo de esto). Otro beneficio es que estos pueden ser extendidos dinámicamente. Sin embargo, siempre tendrá que pagar niveles adicionales de indirección para que esto funcione.
NOTA: Tenga cuidado con el uso de clases genéricas como HashMap
s con el tipo de clave siendo un tipo primitivo o una clase de ubicación especial si le preocupa el rendimiento: tendrá que asignar un objeto cada vez que indexe el hash map o pagar el precio del boxeo/unboxing. Además de esto, los mapas hash no te permitirán consultas espaciales eficientes (por ejemplo, dame todos los objetos existentes en el radio R de un objeto dado - los árboles cuádruples son mejores para esto).
Una matriz 2D parece una buena apuesta si planeas insertar cosas en lugares específicos. Siempre y cuando sea un Tamaño fijo.
Si tiene una dimensión fija para su cuadrícula, utilice una matriz 2D. Si necesita que el tamaño sea dinámico, use una ArrayList de ArrayLists.
Si simplemente necesita iterar sobre la cuadrícula y el direccionamiento aleatorio de las celdas, MyCellType [] [] debería estar bien. Esto es más eficiente en términos de espacio y (uno esperaría) tiempo para estos casos de uso.
La estructura de datos a utilizar realmente depende del tipo de operaciones se llevará a cabo:
En caso de que el número de posiciones significativas (distinto de cero/no predeterminados) en la red es más bien baja (< < nxm) se podría ser más eficiente en el uso del espacio para usar un hashmap, que mapea las posiciones (x, y) en mosaicos específicos. También puede iterar sobre posiciones significativas mucho más eficientemente. Además, podría almacenar referencias a las fichas vecinas en cada tesela para acelerar el recorrido de la ruta/vecindario.
Si su cuadrícula está llena de "información", debería considerar utilizar una matriz 2d o ArrayList (en caso de que en algún momento tenga tipos genéricos implicados como "tipo de mosaico", debe usar ArrayLists, ya que Java no permite matrices nativas de tipo genérico).
- 1. Programación simple de gráficos en 2D
- 2. copiar una matriz 2D en Java
- 3. Búsqueda en primer lugar en una grilla de 8x8 en Java
- 4. Implementando Polygon2D en Java 2D
- 5. Programación de metadatos Java
- 6. Buscando 'burbujas' en una matriz 2D de caracteres en Java
- 7. Pathfinding 2D Java juego?
- 8. ¿Cómo dibujar una grilla en SketchFlow?
- 9. ¿Cómo dibujar una superposición 2D en una escena Java 3D?
- 10. Gráficos 2D de juegos Java
- 11. Tutoriales de programación de juegos 2D en C#
- 12. Pregunta de matriz 2D Java
- 13. ¿Cómo obtener una columna de una matriz java 2D?
- 14. Matplotlib: Reposicionando una subparcela en una grilla de subtramas
- 15. ¿Cómo se oculta una fila en una grilla de WPF?
- 16. Juegos Java 2d con Java SWING
- 17. programación funcional en Java
- 18. Java 2D Drawing Optimal Performance
- 19. Programación paralela en Java
- 20. En matlab, cómo dibujar una grilla sobre una imagen
- 21. ¿Programación de juegos en Java?
- 22. Filtrado de ASP.NET MVC resultados en una lista/grilla
- 23. En busca de una grilla para ASP.NET MVC
- 24. Programación de juegos Android 2D: ¿utilizando OpenGL o no?
- 25. ¿Cómo unir los hijos de una grilla a una lista?
- 26. Conversión de una ArrayList en una matriz 2D
- 27. De renderizar 2D Java a Flash
- 28. Frijoles en la programación java
- 29. ¿Qué colección utilizar en lugar de matriz 2D en Java?
- 30. Programación defensiva: Directrices en Java
+1 para la amplia gama de alternativas y se centran en problemas de rendimiento. –