算法分析中lg * N的含义
Posted
技术标签:
【中文标题】算法分析中lg * N的含义【英文标题】:Meaning of lg * N in Algorithmic Analysis 【发布时间】:2011-07-09 22:00:11 【问题描述】:我目前正在阅读有关算法分析的内容,并且我读到某个算法(带路径压缩的加权快速联合)的顺序为 N + M lg * N。显然这是线性的,因为 lg * N 在此是一个常数宇宙。这里指的是什么数学运算。我不熟悉符号 lg * N。
【问题讨论】:
你真的是指“log times N”吗? 不,是“日志之星”,日志必须迭代的次数才能达到一个常数。联合查找的特定变体的渐近紧上界是阿克曼的 m 次逆,但有一个更简单的分析可以引用较弱的界。 secure.wikimedia.org/wikipedia/en/wiki/Union_find#History 【参考方案1】:到目前为止,这里给出的答案都是错误的。 lg* n
(读作“对数星”)是迭代对数。它被定义为递归为
0 if n <= 1
lg* n =
1 + lg*(lg n) if n > 1
另一种思考方式是在结果小于或等于 1 之前必须迭代对数的次数。
它的生长极其缓慢。您可以在 Wikipedia 上阅读更多内容,其中包括一些在分析中弹出 lg* n
的算法示例。
【讨论】:
补充一点:它的增长速度如此之慢,以至于在实践中它可以被视为一个常数【参考方案2】:我假设您说的是本讲座幻灯片 44 中分析的算法: http://www.cs.princeton.edu/courses/archive/fall05/cos226/lectures/union-find.pdf
他们说“lg * N 在这个宇宙中是一个常数”我相信他们并不完全是字面意思。 根据幻灯片右侧的表格,lg*N 确实随着 N 的增加而增加;它恰好以如此缓慢的速度增长,以至于不能考虑太多其他因素(N = 2^65536 -> log*n = 5)。因此,他们似乎在说您可以忽略 log*N 作为常数,因为它永远不会增加到足以导致问题。
不过,我可能是错的。我就是这么读的。
编辑:请注意,对于这个等式,他们将“lg*N”定义为 2^(lg*(N-1))。例如,这意味着 2^(2^(65536)) [一个更大的数字] 的 N 值将给出 lg*N = 6。
【讨论】:
【参考方案3】:Jason 对 lg*n 的递归定义等价于 lg*n = m 当 2 II m 其中2 II m = 2^2^...^2(重复取幂,m 个 2 的副本) 是 Knuth 的双向上箭头符号。因此 lg*2= 1, lg*2^2= 2, lg*2^2^2= 3, lg*2^2^2^2 = 4, lg *2^2^2^2^2 = 5。 因此 2^16 为 lg*n=4。 lg*n 函数非常缓慢地接近无穷大。 (比阿克曼函数 A(n,n) 的逆函数更快,后者涉及 n-2 向上箭头。)
斯蒂芬
【讨论】:
【参考方案4】:lg 是“LOG”或反指数。 lg 通常指基数 2,但对于算法分析,基数通常无关紧要。
【讨论】:
在计算机科学中,lg 通常指的是基数 2。 不开玩笑..也许这就是我这么说的原因。但我想我在这个问题上还是错了,哈哈。 SO 不是论坛,而是问答网站。所以这里删除或更正错误答案是一种常见的做法。【参考方案5】:lg n 指对数基数 n。这是方程 2^x = n 的答案。在 Big O 复杂性分析中,记录的基数是无关紧要的。 CS中出现2的幂,所以如果我们必须选择一个基地,那就是基地2,这并不奇怪。
一个很好的例子是高度为 h 的完全二叉树,它有 2^h-1 个节点。如果我们让 n 为节点数,则此关系是树的高度为 lg n,具有 n 个节点。遍历这棵树的算法最多需要 lg n 来查看树中是否存储了一个值。
正如预期的那样,wiki 有很多额外的信息。
【讨论】:
lg*
是迭代对数。
学到了一些新东西。所以以同样的方式 sqrt* 像 lg* 一样。我很惊讶有一个真实世界的算法来演示它,因此我将查看带有路径压缩的加权快速联合和 wiki 文章。【参考方案6】:
Logarithm 用 log 或 lg 表示。在你的情况下,我猜正确的解释是 N + M * log(N)。
编辑:在进行渐近复杂度分析时,对数的底并不重要。
【讨论】:
不,lg*
是迭代对数。这是一个增长非常缓慢的功能。以上是关于算法分析中lg * N的含义的主要内容,如果未能解决你的问题,请参考以下文章