什么是 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)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QuickSort 使用 O(log(n)) 额外空间?

什么会导致算法具有 O(log n) 复杂度?

平衡二叉搜索树查找的时间复杂度为什么是O(log n)?

为啥要对字符串进行排序 O(n log n)? [复制]

归并排序,快速排序为什么快

Codility峰的O(N * log(log(N)))算法?