algorithm - 在 O(nlog*n) 和 O(n) 之间?

标签 algorithm time-complexity big-o complexity-theory asymptotic-complexity

O(n logstar(n) ) 和 O(n) 之间是否存在真正的复杂性? 我知道 O(n sqrt(logstar(n))) 和其他类似函数介于这两者之间,但我的意思是不是由 logstar(n) 组成的原始函数。

最佳答案

是的,有。最著名的例子是 Ackermann inverse function α(n),其增长速度比 log* n 慢得多。它出现在像不相交集森林数据结构这样的上下文中,其中每个操作的摊销成本为 O(α(n))。

您可以将 log* n 视为您需要将 log 应用于 n 以将值降至某个固定常数(例如,2)的次数。然后您可以将其概括为 log** n,这是您需要将 log* 应用于 n 以将值降至 2 的次数。然后您可以定义 log*** n、log**** n , log***** n 等类似的方式。 α(n) 的值通常作为您需要放入 log**...* n 中的星数给出,以使该值降至 2,因此它的增长速度比迭代对数函数。

直观上,你可以把log n看成求幂的倒数(重复乘法),log* n看成tetration的倒数。 (重复取幂),log** n 作为 pentation 的倒数(重复四次运算)等。阿克曼函数有效地将求幂的 n 阶泛化应用于数字 n,因此它的倒数对应于您需要应用多高的求幂级别才能达到它。这导致了一个令人难以置信的缓慢增长的函数。

我见过在严肃的环境中使用的最滑稽的缓慢增长函数是 α*(n),您需要将阿克曼反函数应用于数字 n 以将其降至某个固定值的次数持续的。几乎无法想象您必须向此函数输入多大的输入才能返回接近于 10 的任何值。如果您好奇,the paper that introduced it is available here .

关于algorithm - 在 O(nlog*n) 和 O(n) 之间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36827406/

相关文章:

python - 估计两个词之间的音素相似度

java - 时间复杂度: While loop with nested for Loop[java]

algorithm - 选择要使用的算法

algorithm - 使用随机元素进行二分查找

JavaScript:为什么推送对循环中的这些对象不起作用?

c++ - 在 C++ 中对版本号数组进行排序

c# - C# 中的 strstr() 等价物

algorithm - 是否存在复杂度为 O(log n) 而 power(2, f) 不在 O(n) 中的函数

java - 计算(而不是设计!)Java 中堆栈的最小值

algorithm - 这个算法的 Big oh 是 n^3 而不是 n^2