当我参加算法课时谈论最小生成树时,我的教授介绍了Fredman和Tarjan从O(m log * n)到O(m log(log * n))的性能增强。
我对这个记录迭代日志感到非常困惑。似乎log * n基本上占用了无数的日志,所以对我而言,这就像将无穷大与无穷大+ 1进行比较。
任何人都可以给出一个解释?类比也是受欢迎的。
更新
感谢您快速解答我的错误!
进一步的问题:
似乎这种复杂性来自迭代算法。
如果我们可以再记录一次迭代日志,为什么我们不能再拿一个来获得O(m log(log(log * n)))以进一步降低复杂度?
谢谢amit!
我需要改进概念哈哈!
答案 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。