O(m log(log * n))和O(m log * n)之间的差异与迭代对数函数

时间:2014-05-06 07:51:56

标签: algorithm complexity-theory minimum-spanning-tree

当我参加算法课时谈论最小生成树时,我的教授介绍了Fredman和Tarjan从O(m log * n)到O(m log(log * n))的性能增强。

我对这个记录迭代日志感到非常困惑。似乎log * n基本上占用了无数的日志,所以对我而言,这就像将无穷大与无穷大+ 1进行比较。

任何人都可以给出一个解释?类比也是受欢迎的。


更新

感谢您快速解答我的错误!

进一步的问题:

似乎这种复杂性来自迭代算法。

如果我们可以再记录一次迭代日志,为什么我们不能再拿一个来获得O(m log(log(log * n)))以进一步降低复杂度?


谢谢amit

我需要改进概念哈哈!

2 个答案:

答案 0 :(得分:2)

log*是您需要log取消该值的次数。

这不是无限时间日志。采用无限时间日志只会导致最后的负数,然后它将是未定义的,这在这里没有意义。

例如:

log*(2^1024) = 1 + log*(log(2^1024)) = 1 + log*(1024) = 1 + 1 + log*(log(1024) = 2 + log*(10)
             = 2 + 1 + log*(log(10)) = 3 + log*(3) = 3 + 1 + log*(log(3)) = 4 + log*(2)
             = 4 + 1 + log*(log(2)) = 5 + log*(1) = 5

现在,另一方面

 log(log*(2^1024)) = log(5) = 3

(在上面,所有日志都是基数2,我总是取非整数的ceil值,这些假设不改变这里解释的原理)

更新(对相关更新的回复):

您不能只创建一个额外的日志,因为您需要为您的算法引入额外的改进,以实现它。

O(m log*(n))O(m log(log*(n))的改进并非突然出现,而是来自对算法的一些改进。如果您可以找到具有类似行为的其他改进,则可以获得O(m log(log(log*(n))))

答案 1 :(得分:1)

log * n的值是 log 的数量,需要将n减少到1.对于基数2:
log * 16 = 1 + log * 4 = 2+ log * 2 = 3.而log(log * 16)为log 3。

请参阅此定义:http://en.wikipedia.org/wiki/Iterated_logarithm