Algorithm 整数将循环计数器除以常数的循环的时间复杂度

Algorithm 整数将循环计数器除以常数的循环的时间复杂度,algorithm,big-o,time-complexity,bit-shift,logarithm,Algorithm,Big O,Time Complexity,Bit Shift,Logarithm,我试图用大O表示法计算一个简单算法的时间复杂度,但其中有一部分让我感到非常困惑。以下是该算法的简化版本: int a=n while(a>0) { //for loop with time complexity n^3 a = a/8 } 在本例中,它是整数除法,因此while循环将在a的值降至8以下后终止。我不知道如何用n来表示。我还想知道如何处理像这样的未来计算,其中循环的数量不太容易定义 我发现在这样的情况下,用另一种方法做比较容易。你正在做的事情(甚至大约)的反面是什么?比如:

我试图用大O表示法计算一个简单算法的时间复杂度,但其中有一部分让我感到非常困惑。以下是该算法的简化版本:

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

在本例中,它是整数除法,因此while循环将在a的值降至8以下后终止。我不知道如何用n来表示。我还想知道如何处理像这样的未来计算,其中循环的数量不太容易定义

我发现在这样的情况下,用另一种方法做比较容易。你正在做的事情(甚至大约)的反面是什么?比如:

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

因此,while循环执行
O(logn)
次。如果你有一个
O(n^3)
的东西在里面,那么你的整个序列将是
O(n^3 log n)
关键是它是整除,而不是Zeno悖论。重复除法采用
log(n)
步骤将
a
减少到下一步将变为零的值


另一种看待整数除以二次方的方法是位移位。根据
a
中最高设定位的位置,将
a向右移动3位将在多个步骤后产生零。i、 e.
(sizeof(a)*字符位-前导零计数(a))/3
。位位置与log_base2是一样的。

要完成这样的计算,需要显示整个代码
//对于时间复杂度为n^3
的循环,它是真的
n^3
还是真的
a^3
?这有很大的区别。通常,您需要做的是计算
期间每次迭代花费的时间以及发生的迭代次数。您是否看到循环执行O(log(n))次?因此,您反转了循环的条件,以便将其更改为更易于使用的格式,并且一旦您具有时间复杂性,为了得到原始循环的时间复杂度,你应用了一个反向运算?@Maria Andersado没有必要进行任何反向运算,因为我将你的循环更改为在运算数量上等效的循环,我只是反向进行,以便更容易地对步数进行推理。因此,它的时间复杂度对应于原始循环的时间复杂度。
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)