Algorithm 棘手的时间复杂性

Algorithm 棘手的时间复杂性,algorithm,time-complexity,Algorithm,Time Complexity,我很擅长计算时间复杂度,但仍然对如何确定指数时间算法感到困惑。下面的算法具有最坏情况下的运行时间O(k^n)。他们是如何得到这个值的?第一个for循环需要n个时间,第二个for循环需要k个时间,第三个for循环需要q个时间。如果运行时间是n*k*q-something,那么它们是如何得到O(k^n)的 您给出的算法的复杂性不是O(k^n)。复杂性只是O(nk)。该算法计算的是nk您给出的算法的复杂性不是O(k^n)。复杂性只是O(nk)。该算法计算nk这个值 for q = 1 t

我很擅长计算时间复杂度,但仍然对如何确定指数时间算法感到困惑。下面的算法具有最坏情况下的运行时间O(k^n)。他们是如何得到这个值的?第一个for循环需要n个时间,第二个for循环需要k个时间,第三个for循环需要q个时间。如果运行时间是n*k*q-something,那么它们是如何得到O(k^n)的


您给出的算法的复杂性不是
O(k^n)
。复杂性只是
O(nk)
。该算法计算的是nk

您给出的算法的复杂性不是
O(k^n)
。复杂性只是
O(nk)
。该算法计算nk

这个值

       for q = 1 to power {
            newpower++
       }  
可以简化为

       newpower += power;
还有这个

    newpower = 0
    for j = 1 to k {
        for q = 1 to power {
            newpower++
        }  
    }
    power = newpower

所以它实际上是通过反复递增来计算k^n。这是
O(k^n)

这个

       for q = 1 to power {
            newpower++
       }  
可以简化为

       newpower += power;
还有这个

    newpower = 0
    for j = 1 to k {
        for q = 1 to power {
            newpower++
        }  
    }
    power = newpower


所以它实际上是通过反复递增来计算k^n。这是
O(k^n)

要解决这些棘手的问题,您必须仔细计算正在执行的指令数,这并不总是容易的(可能需要更高的数学水平)

在这个问题中,让我们尝试计算newpower++发生的次数(即最内部循环中的循环数),并在k循环的块中查看它。在第一次运行中,有k个块,每个块1次运行:

1…
=循环1*k次=k次

然后功率=k。然后我们有k块k: k…
=循环k*k次=k^2次

继续此模式,您将看到newpower++执行的次数是:
k+k^2+k^3+。。。k^n次


然而,k^n项占据了其余项的主导地位,因此剩下的是O(k^n)。

要解决这些棘手的问题,必须仔细计算正在执行的指令数,这并不总是容易的(可能需要更高的数学水平)

在这个问题中,让我们尝试计算newpower++发生的次数(即最内部循环中的循环数),并在k循环的块中查看它。在第一次运行中,有k个块,每个块1次运行:

1…
=循环1*k次=k次

然后功率=k。然后我们有k块k: k…
=循环k*k次=k^2次

继续此模式,您将看到newpower++执行的次数是:
k+k^2+k^3+。。。k^n次


然而,k^n项支配其余项,因此剩下O(k^n)。

第三个循环出现后,
O(k^n)
的复杂性是有意义的

首先,您必须看到算法计算
k^n

  • q回路将当前的
    功率
    添加到
    新功率
  • k循环运行q循环
    k
    次,因此此计算
    k*幂
  • 这是由i循环执行的
所以你得到
k*。。。。k*(k*(k*1))(n次)=k^n


现在我们知道算法只通过加1来计算
k^n
,所以他需要加
k^n
1
,所以复杂度是
O(k^n)
(k^n)确切地说)

在第三个循环出现之后,
O(k^n)
的复杂度是有意义的

首先,您必须看到算法计算
k^n

  • q回路将当前的
    功率
    添加到
    新功率
  • k循环运行q循环
    k
    次,因此此计算
    k*幂
  • 这是由i循环执行的
所以你得到
k*。。。。k*(k*(k*1))(n次)=k^n

现在我们知道算法只通过加1来计算k^n,所以他需要加上k^n,所以复杂度是O(k^n)
O(k^n)
O(k^n)

O(k^n)
对我来说似乎是正确的

j-
q-loop
具有总的
k*功率
迭代次数。但是
power
在每次
i-loop
迭代中都以指数方式更新

  • i=1
    时,
    j-
    q-loop
    具有
    k*1
    迭代
  • i=2
    时,
    j-
    q-loop
    具有
    k*k
    迭代
  • i=3
    时,
    j-
    q-loop
    具有
    k*(k*k)
    迭代
  • i=m
    时,
    j-
    q-loop
    具有
    k*(k^(m-1))
    迭代
k*(k^(m-1))
只是
k^m
,其中1
O(k^n)
对我来说似乎是正确的

j-
q-loop
具有总的
k*功率
迭代次数。但是
power
在每次
i-loop
迭代中都以指数方式更新

  • i=1
    时,
    j-
    q-loop
    具有
    k*1
    迭代
  • i=2
    时,
    j-
    q-loop
    具有
    k*k
    迭代
  • i=3
    时,
    j-
    q-loop
    具有
    k*(k*k)
    迭代
  • i=m
    时,
    j-
    q-loop
    具有
    k*(k^(m-1))
    迭代

k*(k^(m-1))
只是
k^m
,其中1第三个循环在哪里?“第三个循环在哪里?”他说这很棘手。当你非常累的时候千万不要发帖子。更新了代码。第三个for loop在哪里?“第三个for loop在哪里?”他说这很棘手。当你非常累的时候千万不要发帖子。更新了代码。实际上,它计算
k
n
次:)@deep您的答案仅针对问题的第一个(未完成)版本正确。实际上,它计算
k
n
次:)@Dee