Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java编程二维网格_Java_Data Structures - Fatal编程技术网

用Java编程二维网格

用Java编程二维网格,java,data-structures,Java,Data Structures,在Java中编程二维分幅网格时,最佳的数据结构是什么?网格上的分片应易于根据其位置进行引用,以便可以有效地计算邻居和路径。它应该是二维数组吗?ArrayList?还有什么吗?如果你打算把东西插入特定的位置,2D数组似乎是个不错的选择。只要大小固定。如果网格的尺寸固定,请使用二维数组。如果需要动态的大小,请使用ArrayList中的ArrayList。如果只需要在网格上迭代并对单元格进行随机寻址,那么MyCellType[][]就可以了。对于这些用例来说,这在空间和时间方面是最有效的。如果你不太担

在Java中编程二维分幅网格时,最佳的数据结构是什么?网格上的分片应易于根据其位置进行引用,以便可以有效地计算邻居和路径。它应该是二维数组吗?ArrayList?还有什么吗?

如果你打算把东西插入特定的位置,2D数组似乎是个不错的选择。只要大小固定。

如果网格的尺寸固定,请使用二维数组。如果需要动态的大小,请使用ArrayList中的ArrayList。

如果只需要在网格上迭代并对单元格进行随机寻址,那么MyCellType[][]就可以了。对于这些用例来说,这在空间和时间方面是最有效的。

如果你不太担心速度或内存,你可以简单地使用2D数组,这应该足够好了

如果速度和/或内存是您的问题,那么这取决于内存使用和访问模式

如果您需要高性能,一维阵列是一种不错的选择。您可以将适当的索引计算为
y*wdt+x
。这有两个潜在问题:缓存未命中和内存使用

如果您知道您的访问模式是这样的,即您在大多数情况下都会获取元素的邻居,那么如上所述将2D空间映射到1D数组可能会导致缓存未命中-您希望邻居在内存中靠近,而来自两个不同行的邻居则不会。您可能需要以不同的顺序将二维分幅映射到一维阵列。例如,见

为了更好地使用内存,如果您知道大多数磁贴都是相同的(例如,always grass),则可能需要实现或。这两种方法都可以非常有效地实现,同时考虑缓存感知(稀疏数组链接就是一个很好的例子)。另一个好处是可以动态扩展这些功能。然而,为了使其工作,最终您将不得不支付额外的间接级别


注意:如果担心性能,请小心使用泛型类,例如
HashMap
s,其中键类型是一些基本类型或特殊位置类-您将不得不在每次索引hash映射时分配对象,或者支付装箱/取消装箱的代价。除此之外,哈希映射不允许您进行高效的空间查询(例如,为我提供给定对象半径R内的所有对象-四叉树更好)。

要使用的数据结构实际上取决于您将执行的操作类型:


如果网格中有意义的位置(非零/非默认)的数量相当低,则对于广泛的备选方案(+1),并将重点放在性能问题上。