【问题标题】:Time Complexity of a loop that integer divides the loop counter by a constant整数将循环计数器除以常数的循环的时间复杂度
【发布时间】:2015-09-09 22:31:34
【问题描述】:

我试图用大 O 表示法计算一个简单算法的时间复杂度,但其中的一部分让我大吃一惊。这是该算法的简化版本:

int a=n
while(a>0)
{
//for loop with time complexity n^3
a = a/8
}

在这种情况下,它是整数除法,所以 while 循环将在 a 的值低于 8 后终止。我不知道如何用 n 来表达它。我还想知道如何处理这样的未来计算,其中循环的数量不太容易定义。

【问题讨论】:

  • 您需要显示整个代码才能完成这样的计算。 //for loop with time complexity n^3 真的是n^3 还是真的a^3?有一个很大的不同。一般来说,您需要做的是计算while 的每次迭代花费了多少时间,以及发生了多少次迭代。
  • 你看到循环执行 O(log(n)) 次了吗?

标签: algorithm big-o time-complexity bit-shift logarithm


【解决方案1】:

在这种情况下,我发现反过来做起来更容易。与您正在做的事情(甚至是大约)相反的事情是什么?比如:

for (a = 1; a <= n; a = a * 8)
{
    ...
}

现在,我们将while 更改为for,它具有固定的步数,并且从递减到递增,这样更易​​于使用。

我们有:

1, 8, 8^2, ..., 8^k <= n

8^k <= n | apply logarithm

log (8^k) <= log n

k log 8 <= log n

=> k = O(log n)

所以你的 while 循环会执行 O(log n) 次。如果里面有O(n^3),那么整个序列就是O(n^3 log n)

【讨论】:

  • 因此,您反转了循环的条件,以便将其更改为您可以更轻松地使用的格式,并且一旦您有了时间复杂度,您就可以应用逆运算以获得原始循环的时间复杂度?
  • @Maria-Andersado 不需要任何逆运算,因为我将您更改为的循环在操作数方面是等效的,我只是将它们反向进行以更容易地推断出脚步。所以它的时间复杂度对应于原始循环的时间复杂度。
【解决方案2】:

关键在于它是整数除法,而不是芝诺悖论。重复除法需要log(n) 步骤将a 减少到下一步将变为零的值。

查看整数除以 2 的幂的另一种方法是位移。根据a 中最高设置位的位置,将a 向右移动3 位将在若干步之后产生零。即(sizeof(a)*CHAR_BIT - leading_zero_count(a)) / 3。位位置与 log_base2 相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多