什么是O(log * N)?


80

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


类似的问题:stackoverflow.com/questions/2307283/…O(log* N)不幸的是,没有答案。
BalusC 2010年

1
这个问题是关于log之后的*还是关于O()表示法的一般问题?
Bart van Heukelom

1
它处于某些高级数据结构中,尽管我离开学校太久了,无法回忆起它的来源!
拉里

1
我想不会这么发达,只记得-联盟与查找路径压缩最初的下限设定在O(N日志* N),直到它被降低至O(A n),其中A是反阿克曼功能..
拉里·

1
嘿。在实践中,我认为对此感到满意的是O(n)。:-)
RBarryYoung 2010年

Answers:


84

O( log* N )是“迭代对数”:

在计算机科学中,n的对数迭代数,写为log * n(通常读为“ log star”),是在结果小于或等于1之前必须迭代应用对数函数的次数。


9
我没听说过,这真的很有趣。Q + A +1。我猜想O(log * N)是所有意图和目的O(1)。凉。
格雷格2010年

1
@greg,没有log(n)表示随着元素数量的增加,时间变慢。例如。10倍的元素只会使功能花费2倍的时间
Martin Beckett 2010年

2
我想我是在对Union-Find算法的分析中首次遇到它的,当时它是O( N log* N )在改进为之前的O( A N ),其中A是逆阿克曼函数。我仍然不了解后者的证明,但是该O( N log* N )算法是一个相对不错的阅读方法。
拉里2010年

13
@Martin,但这是log *(n)缓慢上升,因此log *(2 ^ 65536 -1)=5。您也可以调用该常数。
格雷格2010年

4
对不起,没有欣赏到原木星的区别,谢谢-学习新知识!
马丁·贝克特

25

log* N位是一种迭代算法,其增长非常缓慢,比just慢得多log N。您基本上只是不断地反复“记录”答案,直到答案低于一个(例如:)log(log(log(...log(N))),而您必须log()回答的次数才是答案。

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

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;
}

2
这如何回答这个问题?
Maroun 2015年

3
@MarounMaroun:我已经编辑了答案的开头,以提供更多的背景信息。该代码是他所要求的描述/定义。
丹·W

9

log *(n)- “ log Star n”,称为“迭代对数”

用简单的话可以假设log *(n)= log(log(log(.....(log *(n))))

log *(n)非常强大。

例:

1) Log *(n)= 5其中n =宇宙中的原子数

2)可以在log *(n)中使用3种颜色对树进行着色,而对树2种颜色进行着色就足够了,但是复杂度将为O(n)。

3)找出已知欧几里得最小生成树的一组点的Delaunay三角剖分:随机O(n log * n)时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.