Algorithm 如何将我对O(logn)的理解应用于此特定函数?

Algorithm 如何将我对O(logn)的理解应用于此特定函数?,algorithm,big-o,Algorithm,Big O,所以,我对O(logn)的理解是,时间线性增加,而n指数增加。我试图将这种理解应用到interviewbit中的以下函数: int a = 0, i = N; while (i > 0) { a += i; i /= 2; } 我似乎无法理解为什么时间复杂性是O(logn)。有人能把它分解并解释一下原因吗?在本例中,您需要计算循环迭代次数,因为这些迭代次数决定了算法所需的总时间 由于在每次迭代中,i被2除,我们有循环的logn迭代(使用lo

所以,我对O(logn)的理解是,时间线性增加,而n指数增加。我试图将这种理解应用到interviewbit中的以下函数:

int a = 0, i = N;
    while (i > 0) {
        a += i;
        i /= 2;
    }

我似乎无法理解为什么时间复杂性是O(logn)。有人能把它分解并解释一下原因吗?

在本例中,您需要计算循环迭代次数,因为这些迭代次数决定了算法所需的总时间

由于在每次迭代中,
i
被2除,我们有循环的
logn
迭代(使用logbase 2更容易理解,但这并不重要)


例如:对于N=64,您有7次迭代,第一次迭代i=64,第二次迭代i=32,然后是16、8、4、2、1,最后循环在除以
i=1/2
得到0(整数算术)后停止。如果将N加倍到128,则有8次迭代。如果将N再次加倍到256,则有9次迭代。在这里,您可以看到N的指数增长,同时循环迭代次数(即时间)呈线性增长。

在本例中,值a不会影响循环次数,因此它与该算法的Big-O评估无关。您可以删除它并获得相同的评估。是的。如果
i>=1
,这个例子会更容易理解,因为这符合直觉。对于导致4/2/1/0.5/0.25/…的非整数除法。。。显然,该算法运行的时间更长(如果不知道使用的除法的细节,我无法准确地说出运行了多长时间)。在复杂性理论中,您并不真正关心只影响常数因子的实现细节。使用通常的语义(类型
int
作为整数的模型,整数除法执行下一个最低整数的截断)对于
N
的所有值,迭代次数都是相同的,可以分别用
int
表示。非常好的消歧!而且,在这种情况下,base 2更容易理解,那么为什么它不重要呢?我试着接受这个解释,并理解如何对任何O(logn)算法得出这个结论。
log_b(n)=log_a(n)/log_a(b)
,换句话说,你只需要一个常数因子(只包含a和b,但不包含n)。我不理解@Codor的评论,因为更高的N值也会导致更多的循环迭代。PS:log_2(64)=6!=7,但在这里你也可以使用一些常量因子(例如2)来欺骗。@C-Otto我上面的评论有点模棱两可;当然,对于不同的
N
,迭代次数不同;对于固定的
N
,迭代次数相同。该评论是对另一条评论的评论,该评论已消失在两条评论之间。