繁体   English   中英

以下代码的时间复杂度是多少?

[英]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

回答

假设Nlen(s)

外部循环具有O(N)复杂性,因为pc采用从0len(s) - 1所有值。 第二个循环具有相同的复杂性:虽然pdpc + 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]只有当pdpc持有相同的值并因此指向s中的相同元素时才会为真。

示例 1 - 唯一元素

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 永远不会执行。

示例 2 - 相同的元素

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM