Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单字谜函数的大O表示法_Python_Time Complexity_Big O - Fatal编程技术网

Python 简单字谜函数的大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符号是
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
sort
t
(这是非常低效的),并且对它进行一次排序已经是
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
sort
t
(这是非常低效的),并且对它进行一次排序已经是
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是什么?)的,这是任何人的猜测。