【问题标题】:What is O(log* N)?什么是 O(log* N)?
【发布时间】:2011-01-24 03:57:33
【问题描述】:

什么是 O(log* N),它与 ​​O(log N) 有何不同?

【问题讨论】:

  • 类似问题:stackoverflow.com/questions/2307283/… 不幸的是,O(log* N) 没有答案。
  • 这个问题是关于日志后的 * 还是关于一般的 O() 表示法?
  • 它在一些高级数据结构中,虽然我离开学校太久了,不记得它是从哪里来的!
  • 我猜不是那么先进,只是记住了 - 使用路径压缩的联合查找的初始下限设置为 O(n log* n),直到它降低到 O(A n),其中 A 是反阿克曼函数..
  • 嘿。在实践中,我认为我会对 O(n) 的估计感到满意。 :-)

标签: algorithm math complexity-theory logarithm iterated-logarithm


【解决方案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() 的次数就是答案。

无论如何,这是 Stackoverflow 上的一个五年前的问题,但没有代码?(!)让我们解决这个问题 - 这是递归和迭代函数的实现(它们都给出相同的结果):

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) 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 2012-05-09
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多