在一组树中找到正方形

时间:2014-08-14 21:35:04

标签: arrays algorithm list find time-complexity

假设我们是一个有N树的森林中的猎人。为了捕捉最好的鹿,我们打算从树到树建立围栏,这样我们最终得到一个精确的方形。进一步假设我们给出了森林中每棵树的(x,y)坐标列表。我们想找到最大可能的正方形和任何大小的可能正方形的总数?目标是O(N ^ 2)。

例如,列表(4,10),(3,13),(2,10),(1,13),(3,11),(5,11),(4,14), (1,11),(9,15),(9,11),(5,15)包含三个可能的正方形,其中最大正方形由(5,11),(9,15),( 9,11),(5,15)。


我的基本尝试是编写一个遍历整个点列表(从1到N)的for循环,然后包含第二个for循环,它再次遍历所有点,从i到N,其中i是第一个for循环的当前增量。这两点现在唯一地确定剩下的两点。因此,我们还需要一个for循环(从j开始,其中j是第二个for循环的当前增量),它检查这两个剩余的点是否存在。如果它们存在,那么我们找到了一个正方形。在找到所有方块之后找到最大的方块是微不足道的。

然而,这个想法需要三个for循环,即O(N ^ 3)。所以我想知道如何优化这个代码来实现O(N ^ 2)。

1 个答案:

答案 0 :(得分:1)

  

这两点现在唯一地决定了剩下的两点。

你的想法是正确的:迭代每一边,并尝试在它周围建立两个方格(一个方格将是另一方的镜像)。

  

然而,这个想法需要三个for循环,即O(N ^ 3)。所以我想知道如何优化这个代码来实现O(N ^ 2)。

您可以使用哈希表查找替换第三个循环,即O(1)。构建哈希表需要  O(N),因此算法的总时间将为O(N ^ 2)。