我已经编写了以下代码来查找字谜。我曾经认为这个大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
答案 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进行排序)。