Algorithm 如何知道大O是对数的?

Algorithm 如何知道大O是对数的?,algorithm,math,big-o,recurrence,logarithm,Algorithm,Math,Big O,Recurrence,Logarithm,我的问题来自于这篇文章。我不知道对数复杂性的确切含义。我知道我可以在时间和运算次数之间进行回归,并计算X平方值,从而确定复杂性。然而,我想知道一种在纸上快速测定的方法 如何确定对数复杂度?有一些好的基准吗?通常是有效的。不严格,但如果你有一个算法,基本上是将每次迭代需要完成的工作量减半,那么你就有对数复杂度。经典的例子是二进制搜索。如果你只想知道对数大哦,那么在重复的每一步中,都要注意你的数据何时被切成两半 这是因为,如果处理的数据是前一步的1/2,则它是一个无限系列。不确定这是否是您的意思,但

我的问题来自于这篇文章。我不知道对数复杂性的确切含义。我知道我可以在时间和运算次数之间进行回归,并计算X平方值,从而确定复杂性。然而,我想知道一种在纸上快速测定的方法


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

通常是有效的。

不严格,但如果你有一个算法,基本上是将每次迭代需要完成的工作量减半,那么你就有对数复杂度。经典的例子是二进制搜索。

如果你只想知道对数大哦,那么在重复的每一步中,都要注意你的数据何时被切成两半


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

不确定这是否是您的意思,但是。。。对数复杂度通常在处理分散的数据结构(如平衡二叉树)时出现。平衡二叉树的根包含1个节点、2个子节点、4个孙子节点、8个曾孙节点等。基本上,在每个级别,节点的数量都乘以某个因子(2)但迭代中仍然只涉及其中一个。或者,作为另一个示例,索引在每一步加倍的循环:

for (int i = 1; i < N; i *= 2) { ... }
(inti=1;i
这类事情是对数复杂性的特征。

这里是另一种说法

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

二分法也有同样的行为。将间隔长度缩短1024=2^10倍大约需要10个等分步骤,但只有20个步骤将间隔缩短2^20倍


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

有些难以思考,但一旦您掌握了它,它就会非常好。+1非常有趣。我正在寻找一些像你的例子更多。算法的对数形式是:for(inti=BIG_number;i>N;i*=1/2){…}1/2在整数除法中为零,但如果使用“i/=2”,则为。(如果这是你想知道的特定算法,在你的问题中加入它可能是一个好主意。)通常当谈到大O时,log表示logbase 2。@samoz,对数与基数无关。log_a(x)=log_b(x)/log_b(a)从基数a转换为基数b。@George同意,但通常是基数2。用大问题大小解释得很好。不一定。我理解你的意思,但仅仅因为你把工作一分为二并不意味着你得到了对数复杂度,你甚至可以得到指数时间。您必须注意解决方案是如何被重新组合的,以及被分割的问题是如何被解决的。在很多情况下,重组步骤占主导地位。请参阅主定理或更好地解决无需该定理的递推问题。在一个简单的重复背后有很多惊喜。@unjaan:我想你误解我了。我并不是说把工作分成两半,我说的是“在每次迭代中,工作需要分成两半”。我的意思是,如果与前一步相比,每一步还有一半的工作要做,那么你就有对数复杂性(对于工作,阅读计算)。