[英]What time complexity does the following code have?
我对以下代码的时间复杂度感到困惑,我需要我能得到的所有帮助,因为我很难弄清楚。
代码如下:
def herhalen(s,p):
pc = 0
while pc < len(s):
pd = pc + 1
while pd < len(s):
if s[pd] == s[pc]:
x = 0
while pd + x < len(s) and x < p and s[pc + x] == s[pd + x]:
x += 1
if x ==p:
return True
pd += 1
pc += 1
return False
假设N
是len(s)
外部循环具有O(N)
复杂性,因为pc
采用从0
到len(s) - 1
所有值。 第二个循环具有相同的复杂性:虽然pd
从pc + 1
开始,而不是从0
开始,但两个循环一起将具有复杂性O(N * N / 2) = O(N^2)
。 内部循环将具有O(min(N, P))
复杂度(其中P
是函数中的p
变量),因为循环将在pd + x
达到len(s)
或x
达到p
时结束
所以,假设P
不是太小,如果我没记错的话,整体复杂度是O(N^3)
如果您难以理解为什么内部循环(从外部循环迭代而不是0
开始)将复杂性乘以N
,而不是更小的东西,请看这个问题
顺便说一句,如果您使用for
循环而不是while
s,我想您自己理解复杂性会容易得多。 我会用以下方式重写代码(还包含一些小的样式改进):
def herhalen(s, p):
for pc in range(len(s)):
for pd in range(pc + 1, len(s)):
if s[pd] == s[pc]:
for x in range(p):
if pd + x < len(s) or s[pc + x] == s[pd + x]:
break
else:
return True
return False
使用你所写语言的所有力量:)
这取决于s
的元素。 例如,如果s
的所有元素都相等,那么您的条件if s[pd] == s[pc]
将始终为真,这反过来又会影响整体复杂性。 然而,如果s
的所有元素都是不同的,那么s[pd] == s[pc]
只有当pd
和pc
持有相同的值并因此指向s
中的相同元素时才会为真。
s = [i for i in range(20)] #[0,1,2,...,19]
pc = 0
while pc < len(s):
pd = pc + 1
while pd < len(s):
if s[pd] == s[pc]:
print(pd)
pd += 1
pc += 1
在这种情况下, print
function 永远不会执行。
s = [0 for i in range(20)] #[0,0,...,0]
pc = 0
print_counter = 1
while pc < len(s):
pd = pc + 1
while pd < len(s):
if s[pd] == s[pc]:
print(print_counter)
print_counter += 1
pd += 1
pc += 1
在这种情况下, print
function 执行了 190 次,即 O(n^2)。
s
的元素既不完全相同也不唯一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.