首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效地从游戏板收集数据

有效地从游戏板收集数据
EN

Stack Overflow用户
提问于 2021-05-22 07:20:14
回答 2查看 51关注 0票数 0

假设我有一个connect-4电路板,它是一个7x6的电路板,我想存储存储在该电路板上的哪个点上的数据。使用2数组会很好,因为我可以快速地将其可视化为一个电路板,但我担心通过循环数组来收集数据的效率如此之高。

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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-05-25 01:02:23

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

当你向一列中添加一件物品时,如果你将它添加到一列中,那么它就会掉下来。如果你把一件物品添加到一列中,那么它就会掉下来,如果你把它的coordinates.

  • When
  • 添加到一列中,它会掉下来。给定一个列,它会下降到什么程度,或者添加到列x中的一部分的新y值是多少?不管阅读成本是多少,这至多是阅读成本的倍数,因为您只需扫描一列即可。
  • 在给定的xy coordinate.
  • Scan处添加一段内容,遍历所有内容,这至多是阅读成本的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万),这可能是一个坏主意。

  1. 数组,例如game[n],其中每一块都被添加到电路板,并且每一块都包含其xy坐标:O(pieces)查找/添加/删除给定xyO(pieces)扫描时间,O(pieces)空间的一段时间。对于非常稀疏的网格(例如700万x 600万),可能很好,但对于7x6,则不必要地变慢。

  1. HashMap正如格兰特所建议的,其中关键字是您编写的包含xy的点数据对象。O(1)用于读/写,O(height)用于查看一块数据下降了多远,O(pieces)扫描时间,O(pieces)空间。比数组稍好一些,因为您不需要电路板上每个空白空间都有一个空的数组插槽。对于Point键对象,每个条目有一点额外的内存,但您可以有效地用很少的额外成本制作一个巨大的电路板,如果您不介意编写extra HashMap类,这将使它比选项1稍好。

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-05-22 07:46:39

我可能错了,但我认为如果您想要提高效率,就应该使用hashmap (一种哈希表)。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67644748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档