【问题标题】:Programming a 2D grid in Java用 Java 编写 2D 网格
【发布时间】:2011-06-19 20:39:24
【问题描述】:

在 Java 中编写二维图块网格时使用的最佳数据结构是什么?网格上的瓦片应该很容易通过它们的位置来引用,以便可以有效地计算邻居和路径。它应该是二维数组吗?一个数组列表?还有什么?

【问题讨论】:

    标签: java data-structures


    【解决方案1】:

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

    如果速度和/或内存对您来说是个问题,那么这取决于内存使用情况和访问模式。

    如果您需要高性能,一维数组是您的最佳选择。您将正确的索引计算为y * wdt + x。这有 2 个潜在问题:缓存未命中和内存使用。

    如果您知道您的访问模式大部分时间都在获取元素的邻居,那么如上所述将 2D 空间映射到 1D 数组可能会导致缓存未命中 - 您希望邻居在内存中接近,并且来自 2 个不同行的邻居不是。您可能必须以不同的顺序将二维图块映射到一维数组。例如,请参阅Hilbert curves

    为了更好地使用内存,如果您知道大多数图块始终相同(例如始终是草),您可能需要实现 sparse arrayquad tree。考虑到缓存感知,两者都可以非常有效地实现(稀疏数组链接就是一个很好的例子)。另一个好处是这些可以动态扩展。但是,最终您将始终需要支付额外的间接级别才能使其正常工作。

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

    【讨论】:

    • +1 用于广泛的替代方案并专注于性能问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您打算将内容插入特定位置,那么二维数组似乎是一个不错的选择。只要它的大小是固定的。

      【讨论】:

        【解决方案4】:

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

        如果网格中有意义的位置(非零/非默认)的数量相当低(),则使用哈希映射可能会更节省空间,映射 ( x,y) 位置到特定图块。您还可以更有效地迭代有意义的位置。此外,您可以将对相邻图块的引用存储到每个图块中,以加快路径/邻域遍历。

        如果您的网格充满了“信息”,您应该考虑使用 2d 数组或 ArrayList(如果您在某些时候将泛型类型作为“平铺类型”涉及,则必须使用 ArrayLists,因为 Java 确实如此)不允许泛型类型的本机数组)。

        【讨论】:

          【解决方案5】:

          如果您只需要遍历网格和随机寻址单元格,那么 MyCellType[][] 应该没问题。对于这些用例,这在空间和(人们期望的)时间方面是最有效的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-04
            相关资源
            最近更新 更多