什么是 O(log* N)?
Posted
技术标签:
【中文标题】什么是 O(log* N)?【英文标题】:What is O(log* N)? 【发布时间】:2011-01-24 03:57:33 【问题描述】:什么是 O(log* N),它与 O(log N) 有何不同?
【问题讨论】:
类似问题:***.com/questions/2307283/… 不幸的是,O(log* N)
没有答案。
这个问题是关于日志后的 * 还是关于一般的 O() 表示法?
它在一些高级数据结构中,虽然我离开学校太久了,不记得它是从哪里来的!
我猜不是那么先进,只是记住了 - 使用路径压缩的联合查找的初始下限设置为 O(n log* n),直到它降低到 O(A n),其中 A 是反阿克曼函数..
嘿。在实践中,我认为我会对 O(n) 的估计感到满意。 :-)
【参考方案1】:
O( log* N )
是“iterated logarithm”:
在计算机科学中,n的迭代对数,写成log*n(通常读作“对数星”),是在结果小于或等于1之前必须迭代应用对数函数的次数。
【讨论】:
这真的很有趣,我没听说过。问+答+1。我猜 O(log*N) 是万能的 O(1)。酷。 @greg, no log(n) 意味着随着元素数量的增加,时间会变慢。例如。 10 倍的元素只使函数花费 2 倍的时间 我想我是在分析Union-Find算法时第一次遇到它,当时是O( N log* N )
,后来改进为O( A N )
,其中A是反阿克曼函数。后面的证明我还是没看懂,不过O( N log* N )
这个算法还是比较好读的。
@Martin,但这是 log*(n),它疯狂地缓慢上升,因此 log*(2^65536 -1) = 5。你不妨称之为常量。
抱歉,没有意识到日志星的差异,谢谢 - 学习新东西!【参考方案2】:
log* N
位是一种迭代算法,它的增长非常缓慢,比 log N
慢得多。您基本上只是反复“记录”答案,直到它低于 1(例如:log(log(log(...log(N)))
),而您必须log()
的次数就是答案。
无论如何,这是 *** 上的一个五年前的问题,但没有代码?(!)让我们解决这个问题 - 这是递归和迭代函数的实现(它们都给出相同的结果):
public double iteratedLogRecursive(double n, double b)
if (n > 1.0)
return 1.0 + iteratedLogRecursive( Math.Log(n, b),b );
else return 0;
public int iteratedLogIterative(double n, double b)
int count=0;
while (n >= 1)
n = Math.Log(n,b);
count++;
return count;
【讨论】:
这如何回答这个问题? @MarounMaroun:我已经编辑了答案的开头以提供更多上下文。代码是他要求的描述/定义。【参考方案3】:log* (n)- "log Star n" 也称为 "Iterated logarithm"
简单来说,你可以假设 log* (n)= log(log(log(.....(log* (n))))
log* (n) 非常强大。
示例:
1) Log* (n)=5 其中 n= 宇宙中的原子数
2) 使用 3 种颜色的树着色可以在 log*(n) 中完成,而着色树 2 种颜色就足够了,但复杂度将是 O(n)。
3) 找出已知欧几里得最小生成树的一组点的 Delaunay 三角剖分:随机 O(n log* n) 时间。
【讨论】:
以上是关于什么是 O(log* N)?的主要内容,如果未能解决你的问题,请参考以下文章