Python 简单字谜函数的大O表示法
我已经编写了下面的代码来查找字谜。我原以为这个大O符号是Python 简单字谜函数的大O表示法,python,time-complexity,big-o,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 i
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
t的任何一个字谜都是s的子串
你的代码不是这么说的
你有“s的任何子串都是t的一个字谜”,这可能是等价的,但这样更容易理解
至于复杂性,你需要定义你所称的N。。。是不是
len(s)-len(t)+1
函数any()
的复杂性为N,在这种情况下,是的
然而,您在T长度的输入上额外调用了字谜
,您似乎忽略了这一点
anagram
调用sorted
两次。对sorted
的每次调用都更接近O(T*log(T))
本身,假设使用合并排序。您还执行了一个列表切片,因此它可能会稍微高一点
假设您的复杂性在(s-T)*2*(T*log(T))
的顺序上,其中T和s是字符串的长度
答案取决于输入的哪个字符串更大
最好的情况是它们的长度相同,因为这样您的范围只有一个元素
不过,大O表示法是最糟糕的情况,所以您需要找出哪些条件在总操作方面产生的复杂性最大。例如,如果T>S怎么办?那么len(s)-len(t)+1将是非正的,那么代码运行的长度是大于还是小于等长字符串?那么S
t的任何一个字谜都是s的子串
你的代码不是这么说的
你有“s的任何子串都是t的一个字谜”,这可能是等价的,但这样更容易理解
至于复杂性,你需要定义你所称的N。。。是不是len(s)-len(t)+1
函数any()
的复杂性为N,在这种情况下,是的
然而,您在T长度的输入上额外调用了字谜
,您似乎忽略了这一点
anagram
调用sorted
两次。对sorted
的每次调用都更接近O(T*log(T))
本身,假设使用合并排序。您还执行了一个列表切片,因此它可能会稍微高一点
假设您的复杂性在(s-T)*2*(T*log(T))
的顺序上,其中T和s是字符串的长度
答案取决于输入的哪个字符串更大
最好的情况是它们的长度相同,因为这样您的范围只有一个元素
不过,大O表示法是最糟糕的情况,所以您需要找出哪些条件在总操作方面产生的复杂性最大。例如,如果T>S怎么办?那么len(s)-len(t)+1将是非正的,那么代码运行的长度是大于还是小于等长字符串?那么S这不是N的复杂性,因为有几个因素。第一个具有O(n logn)复杂性。如果T足够长,您可能会调用它几次(并对T和S进行排序)。由于一些因素,这不是N的复杂性。第一个具有O(n logn)复杂性。如果时间足够长,您可能会调用它几次(并对T和S排序)。在评估问题1的成本时,您不能忽略字谜的成本。
您能提供如何调用函数吗?从现在看来,复杂性是len(s)-len(t)+1
,但我不确定在这种情况下它应该做什么。它看起来不像是一个假定可以正常工作的东西。我不是有意忽略字谜的成本。考虑到大O符号需要简化,我认为我已经将其简化为正确的公式,我猜我的简化不正确。我还将函数调用添加到原始问题中,多次调用anagram
sortt
(这是非常低效的),并且对它进行一次排序已经是O(klog(k))
-(其中k=len(t)
)总体复杂性怎么可能是O(n)
?(如果n=len(t)+len(s)
)这并不是说你可以随意简化东西<代码>问题1
迭代len(s)-len(t)+1次
,每次迭代都是O(len(t)×log(len(t))
,因为调用了sorted
。你是如何决定这是O(n)(其中n是什么?)的,这是任何人都能猜到的。在评估问题1的成本时,你不能忽略字谜的成本。你能提供函数是如何调用的吗?从现在看来,复杂性是len(s)-len(t)+1
,但我不确定在这种情况下它应该做什么。它看起来不像是一个假定可以正常工作的东西。我不是有意忽略字谜的成本。考虑到大O符号需要简化,我认为我已经将其简化为正确的公式,我猜我的简化不正确。我还将函数调用添加到原始问题中,多次调用anagram
sortt
(这是非常低效的),并且对它进行一次排序已经是O(klog(k))
-(其中k=len(t)
)总体复杂性怎么可能是O(n)
?(如果n=len(t)+len(s)
)这并不是说你可以随意简化东西<代码>问题1
迭代len(s)-len(t)+1次
,每次迭代都是O(len(t)×log(len(t))
,因为调用了sorted
。你是如何决定这是O(n)(其中n是什么?)的,这是任何人的猜测。