【问题标题】:Efficiently gathering data from a game board有效地从游戏板上收集数据
【发布时间】:2021-08-11 03:30:23
【问题描述】:

假设我有一个 connect-4 板,它是一个 7x6 板,我想在该板上的哪个位置存储要存储的部分。使用 2 数组会很好,因为我可以快速将其可视化为一个板,但我担心循环遍历数组以经常收集数据的效率。

1) 存储该游戏板和 2) 从所述游戏板收集数据的最有效方法是什么?

谢谢。

【问题讨论】:

  • “存储”和“收集”到底是什么意思?
  • 我猜最好的放置方式是存储相当于将数据放入数组中(即他在 (5,7) 上有一个红色块)收集相当于循环一个数组来收集存储在里面的所有数据
  • 相同的语法board[4][6] 用于您对“存储”和“收集”的定义。这真的是你要问的吗? (由于不清楚,我投票结束。)

标签: java algorithm multidimensional-array


【解决方案1】:

老生常谈的答案是,在 7x6 上,这没什么大不了的:除非您使用的是微控制器,否则这可能不会产生实际影响。但是,如果您从 的角度考虑这个问题,您可以对这些操作进行推理; “存储”和“收集”不够具体。您需要仔细考虑您要支持哪些操作,以及如果您有数千列和数百万个片段,它们将如何扩展。操作可能是:

  • 根据xy 坐标,读取一块是否存在,以及它是什么颜色。
  • 当您将一块添加到一列时,它会“下落”。给定一个列,它下降了多远,或者对于添加到列x 的一块,新的y 值是多少?无论阅读成本是多少,这最多将是height 倍,因为您只需扫描列即可。
  • 在给定的xy 坐标处添加一块。
  • 扫描所有部分,最多是width 乘以height 乘以阅读成本。

当然,所有这些都必须适合您的计算机,因此您既关心存储空间又关心时间。

让我们列出一些选项:

  1. 数组,例如game[x][y]game[n],其中n 类似于x * height + y:在给定xy 的情况下读取/写入的恒定时间(O(1)),但O(width * height)扫描和计数,O(height) 时间来计算一块下降多远。 O(width * height) 的常量空间。对于 7x6 来说完全合理,如果您有一个巨大的网格(例如 700 万 x 600 万),这可能不是一个好主意。

  2. 数组,例如game[n],其中每个棋子都添加到棋盘上,每个棋子都包含其xy 坐标:O(pieces) 查找/添加/删除给定x 和@987654346 的棋子的时间@、O(pieces) 扫描时间、O(pieces) 空间。对于极其稀疏的网格(例如 700 万 x 600 万)可能有好处,但对于 7x6 来说却是不必要的慢。

  3. 正如格兰特所建议的那样,HashMap 的键是您编写的包含xy 的Point 数据对象。 O(1) 读/写,O(height) 查看一块下降多远,O(pieces) 扫描时间,O(pieces) 空间。比阵列略好,因为您不需要板上的每个空白空间都有一个空阵列插槽。 HashMap 键对象的每个条目都有一点额外的内存,但是您可以有效地制作一个巨大的板,而额外的成本很少,如果您不介意编写额外的 Point 类,这比选项 1 略好。

  4. 一组可调整大小的列数组,例如列表。这类似于固定数组的数组,但由于 List 存储其大小并且只能根据需要分配尽可能多的内存,因此您可以非常有效地存储状态,包括一块需要下降多远。恒定的读/写/添加,恒定的“下降”时间,O(pieces) + O(width) 扫描时间,O(pieces) + O(width) 空间,因为您不需要扫描/存储您知道为空的单元格。

鉴于这些选项,我认为列表数组(#4)是最具可扩展性的解决方案,但除非我知道它需要扩展,否则我可能会选择数组数组(#1)以便于编写和理解.

【讨论】:

    【解决方案2】:

    我可能是错的,但我认为如果你想要效率,你正在寻找一个哈希图(一种哈希表)。

    这是文档: https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html

    HashMap 为大多数操作(如 add()、remove() 和 contains())提供了预期的常数时间性能 O(1)。

    由于您使用的是 7x6 板,因此您可以简单地将键和值命名为 A1 ... A6。

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2021-12-28
      • 2011-12-04
      • 2016-05-12
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多