Python脚本:如何判断是否在O(N)或O(N ^ 2)时间内?

时间:2013-07-21 18:40:35

标签: python performance big-o palindrome

我如何判断我的代码是在O(N)时间(线性时间?)还是O(N ^ 2)时间或其他时间运行?练习测试在线停靠点以获取需要很长时间计算的代码。

据我所知,最好有一个脚本,其中运行所花费的时间仅与输入数据的长度成正比(O(N)时间),我想知道这是否是我的代码正在做的。怎么能说出代码运行的速度有多快?

下面我写了一篇我写的脚本,我很担心。这是一个练习考试问题,你会得到一系列的'a'和'b',你要计算回文。因此,如果给你s =“baababa”,则有6个回文:'aa','baab','aba','bab','ababa',& 'ABA'。

def palindrome(s):
  length = len(s)
  last = len(s)-1
  count = 0

  for index, i in enumerate(s):
    left=1
    right=1
    left2=1
    right2=1

    for j in range(0,index+1): #+1 because exclusive
      if index-left2+1>=0 and index+right2<=last and s[index-left2+1]==s[index+right2]:
        print s[index-left2+1:index+right2+1] #+1 because exclusive
        left2 +=1
        right2 +=1
        count +=1

      elif index-left>=0 and index+right<=last and s[index-left] == s[index+right]:
        print s[index-left:index+right+1] #+1 because exclusive
        left += 1
        right +=1
        count += 1

  return count

这是O(N)时间吗?我只遍历整个列表一次,但也有一个较小的循环...

3 个答案:

答案 0 :(得分:3)

它是O(N ^ 2)。 你有一个从0到N的循环,第二个循环从0到i。让我们看看您需要执行多少操作。对于每个'i',我们查看j从0到i + 1的列表大小(让我们取N = 7):

i = 0 | x x _ _ _ _ _ _  -
i = 1 | x x x _ _ _ _ _  |
i = 2 | x x x x _ _ _ _  |
i = 3 | x x x x x _ _ _  N
i = 4 | x x x x x x _ _  |
i = 5 | x x x x x x x _  |
i = 6 | x x x x x x x x  _
       |-----N + 1-----|

整个矩形的面积是~N * N(实际上是N *(N + 1),但这里没那么重要),所以我们看到有~N ^ 2/2的操作。它是O(N ^ 2)。

答案 1 :(得分:3)

好吧,让我们考虑一下。输入的大小为n = len(s)。对于每个字符,从0循环到索引。所以我们可以得到以下

for i = 0 to n
    for j = 0 to i + 1
        1

可以减少到

for i = 0 to n
    (i + 1)(i + 2)

然后给我们

for i = 0 to n
    i^2 + 3i + 2

我们可以将其拆分并减少它,我们知道 3i + 2将减少到3(n)(n + 1) + 2n = 3n^2 + 5n,它立即不是线性的,因为它是O(n ^ 2)。 通过第二个for循环,我也不明白你在做什么,你可以通过比较最后一个和第一个字符来计算线性时间的回文。

如果您想知道如何:http://rosettacode.org/wiki/Palindrome_detection#Python

答案 2 :(得分:1)

这不是O(N)时间。虽然您只需遍历enumerate(s)数组一次。在每个循环中,你做一些额外的工作。让我们假设数组的长度是N.所以重复的总数大约是1 + 2 + 3 + .. + N,即N *(N + 1)/ 2,这简化为O(N ^ 2)运行时间。