假设我有一个connect-4电路板,它是一个7x6的电路板,我想存储存储在该电路板上的哪个点上的数据。使用2数组会很好,因为我可以快速地将其可视化为一个电路板,但我担心通过循环数组来收集数据的效率如此之高。
1)存储该游戏板和2)从所述游戏板收集数据的最有效的方法是什么?
谢谢。
发布于 2021-05-25 01:02:23
老生常谈的答案是,在7x6的情况下,这不会是什么大问题:除非你使用的是微控制器,否则这可能不会产生实际的差异。但是,如果您从algorithm的角度考虑这个问题,您可以对操作进行推理;“存储”和“收集”还不够具体。您需要仔细考虑您正在尝试支持哪些操作,以及如果您有数千列和数百万个片段,这些操作将如何扩展。操作可能是:
当你向一列中添加一件物品时,如果你将它添加到一列中,那么它就会掉下来。如果你把一件物品添加到一列中,那么它就会掉下来,如果你把它的coordinates.
x中的一部分的新y值是多少?不管阅读成本是多少,这至多是阅读成本的倍数,因为您只需扫描一列即可。x和y coordinate.height倍。当然,所有这些都必须适合您的计算机,所以您需要关心存储空间和时间。
让我们列出一些选项:
game[x][y]或game[n],其中n类似于x * height + y:在给定x和y的情况下读取/写入的恒定时间(O(1)),但O(width * height)用于扫描和计数,以及O(height)计算一块落差的时间。O(width * height)的常量空间。对于7x6来说非常合理,如果你有一个巨大的网格(例如700万x 600万),这可能是一个坏主意。game[n],其中每一块都被添加到电路板,并且每一块都包含其x和y坐标:O(pieces)查找/添加/删除给定x和y,O(pieces)扫描时间,O(pieces)空间的一段时间。对于非常稀疏的网格(例如700万x 600万),可能很好,但对于7x6,则不必要地变慢。x和y的点数据对象。O(1)用于读/写,O(height)用于查看一块数据下降了多远,O(pieces)扫描时间,O(pieces)空间。比数组稍好一些,因为您不需要电路板上每个空白空间都有一个空的数组插槽。对于Point键对象,每个条目有一点额外的内存,但您可以有效地用很少的额外成本制作一个巨大的电路板,如果您不介意编写extra HashMap类,这将使它比选项1稍好。O(pieces) + O(width)扫描时间,O(pieces) + O(width)空间,因为你不需要扫描/存储你知道是空的单元格。考虑到这些选项,我认为列表数组(#4)是最具伸缩性的解决方案,但除非我知道它需要扩展,否则我可能会选择数组数组(#1),以便于编写和理解。
发布于 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。
https://stackoverflow.com/questions/67644748
复制相似问题