【发布时间】:2019-07-05 05:49:19
【问题描述】:
在这两种情况下,船只不重叠,可能彼此相邻。
案例 1 - 所有船都是1xN 并且是垂直或水平的
- Ship 对象包含起点的坐标(顶部
左)、方向和大小- 每次射击时,我们都会遍历所有船只,对于每艘船只,我们都会计算它们的坐标并确定其中一艘是否 坐标匹配镜头坐标
这似乎已经很低效了,因为对于每个镜头,我们都必须遍历所有船只。
案例 2 - 所有船都是任意大小,棋盘是 10 亿乘 10 亿方格,有 100 万艘船
- 使用以前的方法肯定行不通,因为我们必须保留每艘船的所有坐标列表,并且每次拍摄都需要大量时间来处理
跟踪船只位置/坐标的最有效方法是什么,以便解决方案能够优雅地扩展?
【问题讨论】:
-
我错过了什么吗?你不会只对那些确实有船的方格感兴趣吗?因此,您创建了一个包含船只坐标的二维矩阵,并通过 x/y 坐标访问该矩阵。
-
这可能是 k-d 树 或类似空间索引结构的情况。
-
@NevilleKuyt,使用 2D 矩阵,我可以看到我如何能够追踪命中,但我将如何准确追踪哪艘船被命中?我假设 2D 矩阵代表游戏板,如果游戏板太大而无法放入内存怎么办?
-
您需要定义“高效”的含义(对一个 CPU 的时间有效,对内存消耗有效,对开发人员时间有效,对功耗有效,对“许多 CPU”有效,.. .,多种可能性的某种混合)。您的第一个解决方案(遍历
ship对象)是最有效的(仅用于内存消耗),@NevilleKuyt 的解决方案(2D 数组)可能是最有效的(仅用于 CPU 时间),以下答案中的解决方案可能是对于某些未知的 CPU 时间和内存消耗组合,最有效。 -
@Brendan,这是一个很好的观点,我会在接下来的问题中记住这一点。我想我只是在寻找尽可能多的建议,但在我的脑海中,我的意思是 CPU 效率,但是,内存效率也在这里发挥作用。
标签: algorithm performance optimization data-structures