我会说实话,这是一个任务问题,但我无法找到解决方案。请记住,我不是要求答案,只是一些指导。
问题: 设计一个在O(n)时间(线性)运行的算法,该算法可以在2D网格上定位单个可疑房屋(点)。如果消耗等于或大于其两个垂直和两个水平邻居的电力消耗是可疑的。注意:只想要一个可疑的房子被退回
解决方案: 甚至不确定如何实现这样的解决方案。如果你检查n个房子,你也可以检查周围的四个邻居。 4n / n ^ 2,简化为4 / n。这意味着随着网格的扩展,它不太可能找到可疑的房子。
我尝试过: - 不同的数据结构(大多数是nlogn) - 折叠网格(再次nlogn)
提前致谢。
编辑:
我的错误,网格是(n x n)使房屋数量n ^ 2,抱歉混淆。
EDIT2:
这是一个问题,也许我读错了?
警察正在寻找特别大的房子 三联消费。为了简化问题,想象一下 调查在n×n网格上布置的房屋。每个房子 电网有一些耗电量e(i,j)。警察考虑 如果电力消耗等于或大于此,房子可疑 比它的每个垂直和水平邻居。设计算法 在O(n)时间运行并返回可疑房屋的位置。
答案 0 :(得分:5)
你基本上是在寻找一个用电量最大的房子。你可以找到其中一个,从一个任意的房子开始,如果它的用电量更高,则踩到相邻的房子(重复直到没有相邻的房子更高)。
这将在n x n网格上花费O(n)时间。
编辑:评论者是对的,在最坏的情况下这可能需要O(n ^ 2)时间。
答案 1 :(得分:3)
Keith提出的局部最优解决方案实际上不会在线性时间内运行。问题是它不能保证路径长度是O(n)。
然而,考虑如果你看一下中间一行和一列的所有房屋会发生什么。特别考虑如何使用它来帮助您的本地最佳解决方案。
(没有提供完整的解决方案,因为,它是一个任务)然而,一个非常整洁的问题。感谢它的创造者。
[编辑:提示]
以前提供的解决方案在以下情况下失败:
X.XXX.XXX.X
X.X.X.X.X.X
X.X.X.X.X.X
X.X.X.X.X.X
XXX.XXX.XXX
在哪里。是一个非常小的电气使用,并且x正在慢慢增加用电量。
如果我们查询中间行会怎样?
X.XXX.XXX.X
X.X.X.X.X.X
&&&&&&&&&&&
X.X.X.X.X.X
XXX.XXX.XXX
&是我们看过的房子。我们已经成功地完成了这条道路。如果我们在我们发现的最佳点开始爬山,我们就能够避开漫长的道路。 (但我们仍然无法保证路径足够短)
[编辑:第二个提示]
如上所述扫描中间一行。取最大的价值。向上或向下移动到更大的值(如果你不能那么那个网格单元是一个局部的最佳值,你就完成了)。现在考虑增加价值的途径。路径无法再次穿过该中间行,因为该行中的所有值必须小于当前单元格。 (因为当前单元格必须大于行中最大的值)。这意味着我们已经将问题减少了一半。