回文测试的复杂性

时间:2014-06-11 01:44:09

标签: python time-complexity slice

def is_palindrome(s):
    if len(s) <= 1:
        return True
    return s[0] == s[-1] and is_palindrome(s[1:-1])

我的第一个想法是复杂度为O(n),因为每次递归调用都会删除2个字符。

但后来我想到了切片的复杂性。根据{{​​3}},获得切片的复杂度是O(k),其中k =切片中元素的数量。在is_palindrome中,k = n - 2,然后k = n - 4,然后是n - 6,等等,所以我认为复杂度为O(n ^ 2),因为每次调用都有(最差)O (n)切片,有n个电话。

哪一个是正确的?

1 个答案:

答案 0 :(得分:2)

想象一下,你有经典的O(n^2)算法:双嵌套for循环

for i in range(n):
    for j in range(n):
        #do_something

对于外循环的每次迭代,必须执行内循环O(n)的整个迭代。这会导致O(n^2)运行时。

现在让我们来看看你的算法 - 对于每个递归级别,必须调用另一个O(n)算法(你的切片) - 你的递归函数类似于外部循环和你的切片函数类似于内循环。

你的递归函数是

O(n/2) => O(n)

你的切片功能是

O(t) where t < n 

确定字符串是否为回文的另一种O(n)方法是简单地迭代字符串一次,并在每次迭代中检查列表的两端。请记住索引访问是O(1)

for i in xrange(len(s)/2):
  if s[i] != s[(len(s)-1)-i]:
    return False
return True