简单anagram函数的大O表示法

时间:2017-04-09 13:51:06

标签: python time-complexity big-o

我已经编写了以下代码来查找字谜。我曾经认为这个大O符号是O(n)但是我的导师告知我不正确。我很困惑为什么这不正确但是,有人能提出任何建议吗?

# Define an anagram.
def anagram(s1, s2):
    return sorted(s1) == sorted(s2)

# Main function.
def Question1(t, s):
    # use built in any function to check any anagram of t is substring of s
    return any(anagram(s[i: i+len(t)], t)
                 for i in range(len(s)-len(t)+ 1))

功能调用:

# Simple test case.
print Question1("app", "paple")
# True

2 个答案:

答案 0 :(得分:2)

  

t的任何anagram都是s

的子串

这不是你的代码所说的。

你有“s的任何子串都是t的字谜”,这可能是等价的,但这样更容易理解。

至于复杂性,你需要定义你正在调用的内容N ......它是len(s)-len(t)+ 1吗?

函数any()具有复杂度N,在这种情况下,是的。

但是,你还在T长度的输入上调用anagram,你似乎忽略了它。

anagram两次致电sorted。假设合并排序,对sorted的每次调用都接近O(T * log(T))。您还要执行列表切片,因此可能略高一些。

假设你的复杂性大约为(S-T) * 2 * (T * log(T)),其中T和S是字符串的长度。

答案取决于您输入的字符串更大。

最好的情况是它们的长度相同,因为那时你的范围只有一个元素。

Big O表示法是最糟糕的情况,因此您需要确定哪些条件在总操作方面产生最大的复杂性。例如,如果T> S'那么len(s)-len(t)+ 1将是非正数,那么代码运行多少或等于相等长度的字符串?那么S< T或S = 0?

答案 1 :(得分:1)

由于一些因素,这不是N的复杂性。第一个sorted具有O(n log n)复杂度。如果T足够长,你可以多次调用它(并对T和S进行排序)。