如何知道Big O何时是对数?

时间:2009-04-15 00:13:57

标签: algorithm math big-o recurrence logarithm

我的问题来自帖子"Plain English Explanation of Big O"。我不知道对数复杂性的确切含义。我知道我可以在时间和操作次数之间进行回归并计算X平方值,并确定复杂度。但是,我想知道一种在纸上快速确定它的方法。

您如何确定对数复杂度?有一些很好的基准吗?

5 个答案:

答案 0 :(得分:16)

不严谨,但是你有一个算法,它基本上将每次迭代需要完成的工作分成两半,然后你就具有对数的复杂性。经典的例子是二元搜索。

答案 1 :(得分:11)

不确定这是不是你的意思,但是......当你使用像平衡二叉树那样的扩展数据结构时,通常会出现对数复杂性,它在根上包含1个节点,2个孩子,4个孙子,8个曾孙等。基本上在每个级别节点的数量乘以某个因子(2)但仍然只有其中一个参与迭代。或者作为另一个例子,一个循环,其中索引在每一步加倍:

for (int i = 1; i < N; i *= 2) { ... }

这样的事情是对数复杂性的签名。

答案 2 :(得分:5)

Master theorem通常有效。

答案 3 :(得分:4)

如果您只是想了解对数Big Oh,请注意每次重复数据时将数据减少一半。

这是因为如果您处理的数据是前一步的1/2,那么它就是一个无限的系列。

答案 4 :(得分:4)

这是另一种说法。

假设您的算法在问题大小的位数上是线性的。所以,也许你有一个新的算法来计算一个大数字,你可以显示为数字的线性。因此,使用您的算法,20位数的因子需要两倍的倍数作为10位数。这将具有日志复杂性。 (这对发明者来说是值得的。)

Bisection具有相同的行为。将间隔长度减少大约10个二等分步长为1024 = 2 ^ 10,但只有20步将间隔减少2 ^ 20倍。

日志复杂性并不总是意味着算法在所有问题上都很快。 O(log(n))前面的线性因子可能很大。所以你的算法在小问题上可能会很糟糕,直到问题规模明显大到其他算法死于指数(或多项式)死亡时才会变得有用。