【发布时间】:2021-11-03 14:48:01
【问题描述】:
我正在尝试解决编码挑战,但我的解决方案性能不佳,我正在寻找有关如何改进算法的建议或建议。
谜题如下:
给定一个代表果园的单元格网格,每个单元格可以是空点 (0) 或果树 (1)。一位农民想知道果园内距离所有果树 k 距离内有多少空地。
使用taxicab geometry计算距离,例如:
k = 1
[1, 0]
[0, 0]
the answer is 2 as only the bottom right spot is >k distance from all trees.
我的解决方案是这样的:
- 遍历网格并存储所有树的位置
- 从第一个树位置开始 BFS 并存储所有空点,直到我们到达超过 k 距离的邻居
- BFS 从下一个树位置开始并存储空点的交集
- 重复第 3 步,直到我们遍历所有树位置
- 返回所有路口后剩余的空位数
我发现对于具有较大 k 值的大型网格,我的算法会变得非常慢,因为我最终会多次检查网格中的每个点。经过一番研究,我找到了一些类似问题的解决方案,建议取两个最极端的目标节点,然后只比较它们的距离:
- https://www.codingninjas.com/codestudio/problem-details/count-nodes-within-k-distance_992849
- https://www.geeksforgeeks.org/count-nodes-within-k-distance-from-all-nodes-in-a-set/
但是,鉴于以下某些输入,这不适用于我的挑战:
k = 4
[0, 0, 0, 1]
[0, 1, 0, 0]
[0, 0, 0, 0]
[1, 0, 0, 0]
[0, 0, 0, 0]
使用极端节点方法,即使距离中间树 5 距离,右下角的空白点也会被计算在内。
谁能指出我更有效的方法?我对这些类型的问题还很陌生,所以我很难看到下一步应该采取的措施。
【问题讨论】:
-
"距离所有果树k距离内" 这看起来很奇怪。如果果园是 n × n 且 n > 2 * k,则所有树的 k 中都不能有一个点。
-
@ravenspoint 果园可能很大,但可能只有少数树,而且它们都彼此靠近。如果有两棵树的距离> 2 * k,则所有树的k内都没有点的情况;这不等于 n > 2 * k。
-
您能否澄清一下您的意思是“所有树”还是“任何树”?
-
@Richard "all trees" 正确,看问题定义
标签: algorithm optimization graph-theory graph-algorithm