【问题标题】:Complexity of palindrome test回文测试的复杂性
【发布时间】:2014-06-11 01:44:08
【问题描述】:
def is_palindrome(s):
    if len(s) <= 1:
        return True
    return s[0] == s[-1] and is_palindrome(s[1:-1])

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

但后来我想到了切片的复杂性。根据https://wiki.python.org/moin/TimeComplexity,获取切片的复杂度为 O(k),其中 k = 切片中的元素数。在is_palindrome 中,k = n - 2,然后 k = n - 4,然后是 n - 6,等等。所以我认为复杂度会是 O(n^2),因为每个调用都有一个(最坏的情况下)O(n ) 切片,有 n 次调用。

哪个是正确的?

【问题讨论】:

    标签: python time-complexity slice


    【解决方案1】:

    假设你有经典的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
    

    【讨论】:

    • 您的最后一笔金额是O(n^2),而不是O(n)
    • 你是说它是 O(n^2) 吗?谢谢!
    • @arshajii - 谢谢 - 对我来说,总结它甚至没有意义。
    • space 中也是 O(n),这对于回文检查器来说是非常不必要的。此外,您的答案中的链接是一个比简单地检查字符串是否为回文(该问题询问查找所有回文子字符串)稍微复杂的问题。
    • 好眼光。添加了我自己的 O(1) 算法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多