繁体   English   中英

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

What time complexity does the following code have?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我对以下代码的时间复杂度感到困惑,我需要所有可以获得的帮助,因为我正在努力弄清楚。

代码如下:

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
2 个回复

回答

假设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功能。

示例 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函数执行了 190 次,即 O(n^2)。

注意

  • 请注意,对于您的代码,您必须考虑一个额外的循环。
  • 另请注意,存在更多场景,其中s的元素既不完全相等也不完全唯一。
5 以下代码段的时间复杂度是多少?

对于下面的代码段,请使用big-oh表示法估算时间复杂度。 我认为它们是嵌套循环,但我不确定100%。 从我可以看出,第一个循环的最差时间是O(n),第二个循环是O(sqrt(n)),第三个循环是O(log n)。 那是对的吗? 我是否可以将这些值相乘以获得整个循环的时间复杂度? ...

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

我需要帮助来确定代码段的时间复杂度。 我试图了解如何添加所有内容,但我不确定它是否正确。 第一个循环和第二个循环是我理解的对数,最后一个是线性的,或者至少是我的想法。 但我不明白如何最终确定问题并提供时间复杂性。 我的猜测是:(logN * logN)+(logN * N) - ...

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

以下代码的时间复杂度是多少? 我在外部的while循环中苦苦挣扎,这是loglogn ,我不明白为什么。 如果最后一行是a = a * a * a * a;那么时间复杂度将如何变化a = a * a * a * a; ? for循环为O(n) ,内部为O(logn) 。 ...

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

我编写了以下代码片段来查找范围摘要,即,当给定一个没有任何重复项的排序整数数组时,它将摘要返回为: 我想知道上面的代码片段的时间复杂性。 在我看来,我正在为数组中的每个元素做一些“任务”(执行内部while循环)(使用外部for循环)。 因此,在最坏的情况下,我认为复杂度应为O(n ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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