用Java编写二维图块网格时使用的最佳数据结构是什么?网格上的图块应易于通过其位置进行引用,以便可以高效地计算邻居和路径。应该是2D阵列吗? ArrayList?还有别的吗

最佳答案

如果您不太担心速度或内存,则可以简单地使用2D阵列-这样应该可以很好地工作。

如果您对速度和/或内存有问题,则取决于内存使用情况和访问方式。

如果需要高性能,单维数组是必经之路。您将正确的索引计算为y * wdt + x。这样做有两个潜在的问题:缓存未命中和内存使用情况。

如果您知道自己的访问模式使您大部分时间都获取某个元素的邻居,则如上所述将2D空间映射到1D数组中可能会导致高速缓存未命中-您希望邻居在内存中接近并且邻居从2个不同的行不是。您可能必须以不同的顺序将2d瓷砖映射到1d阵列。例如,参见Hilbert curves

为了更好地使用内存,如果您知道大多数磁贴始终是相同的(例如始终是草皮),则可能需要实现sparse arrayquad tree。牢记缓存的意识,两者都可以非常有效地实现(稀疏数组链接就是一个很好的例子)。另一个好处是它们可以动态扩展。但是,最终,您将始终必须付出额外的间接级别,才能使此工作正常进行。

注意:如果要担心性能,请谨慎使用键类型为某种原始类型的特殊类(如HashMap s或特殊的位置类)-每次索引哈希图或支付费用时,都必须分配一个对象装箱/拆箱的价格。除此之外,哈希映射将不允许您进行有效的空间查询(例如,将给定对象半径R中存在的所有对象都提供给我-四叉树对此更好)。

关于java - 用Java编写2D网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6388887/

10-13 21:28