想知道我的脚本的大O符号值?

时间:2013-10-11 17:31:25

标签: algorithm big-o

已经有一段时间了,因为我估计了某些东西的大O符号,我似乎无法掌握这个。基本上我的脚本通过美国纬度/经度的点列表运行,并找到覆盖国家的集合,如果这些点是半径100英里的圆的中心。像这样:

  • 开始循环遍历列表,索引i = 0。
  • 找到列表中第i个点与列表中所有点之间的距离。
  • 删除100英里内的所有点
  • 重新索引数组
  • 将索引增加一个
  • 如果i =列表长度,则结束,否则,循环

3 个答案:

答案 0 :(得分:1)

您的算法为O(N^2),其中n。如果我正确理解你的描述,它就是这样的:

for point A in array:
  for point B in array:
      d = dist(A,B)
      //optionally remove from list

在最坏的情况下,每对点相距超过100英里,因此您最终会检查每对点之间的距离,因此O(N^2)

请注意,您最多只进行n + (n-1) + (n-2) + ... + 2 + 1 = (n(n+1))/2距离计算,但仍为O(N^2)

答案 1 :(得分:1)

算法的运行时间为O(n^2),因为在最坏的情况下,您遍历数组并检查数组中所有以下点的每个点,因此n(n-1)/2比较,{{1 }}

我必须告诉你,我不认为这个算法能为你的问题提供正确的解决方案。

答案 2 :(得分:0)

假设n是您输入的点数。

  

开始循环遍历列表,索引i = 0.

     

...

     

如果i =列表长度,则结束,否则,循环

这就是n次迭代。

  

找到列表中第i个点与列表中所有点之间的距离。

每次迭代的n次操作。如果它只是这两个,它最终成为n^2/2(每个点与其他每一点,除了顺序无关紧要,所以你做了一半的比较)。

  

删除100英里内的所有点

     

重新索引数组

听起来,你将那些在100英里范围内的元素归零,然后移动阵列。这两项操作都是O(n)次操作,因为您O(n^2)次操作重复O(n)次,所以n结果为O(n^2)

所以你最终得到{{1}}。