我如何判断我的代码是在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)时间吗?我只遍历整个列表一次,但也有一个较小的循环...
答案 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)运行时间。