在 Big-O 术语中,如果 O(n-1) 与 O(n) 相同,那么为啥在主定理中 T(n-1) 不等于 T(n)?

Posted

技术标签:

【中文标题】在 Big-O 术语中,如果 O(n-1) 与 O(n) 相同,那么为啥在主定理中 T(n-1) 不等于 T(n)?【英文标题】:In Big-O terms if O(n-1) is the same thing as O(n) then why in the master theorem is T(n-1) not equal T(n)?在 Big-O 术语中,如果 O(n-1) 与 O(n) 相同,那么为什么在主定理中 T(n-1) 不等于 T(n)? 【发布时间】:2020-10-19 04:07:33 【问题描述】:

好的,所以我对 CS 很陌生,最近正在学习 Big-O、Theta 和 Omega 以及主定理,在讲座中我看到由于某种原因并非如此,我想知道为什么会这样那个?

【问题讨论】:

一个 O(whatever) 计算可以指定一个最小值 n 为性能界限成立。因此,对于退化情况,例如尝试在 N 为 1(但 lgN 为零)时执行 NlgN 排序时,不存在预测不可能的低时间的问题。 此外,Big-O 是关于算法行为的极限,因为数量接近无穷大。 Infinity = infinity -1 = infinity/2 所以 O(n) = O(n-1) = O(n/2) 但主定理是关于如何为算法完成的工作量建立递推关系 -它与接近无穷大的极限无关,因此您不能使用无穷大允许的简化。 哦,这很有道理。谢谢! 【参考方案1】:

虽然 O(n) 和 T(n) 都在外面使用大写字母,在中间使用小写 n,但它们代表的概念完全不同。

如果您使用递归关系分析算法,通常让 T(n) 表示算法在大小为 n 的输入上完成所需的时间量。因此,我们不希望 T(n) 与 T(n-1) 相同,因为在大多数情况下,当您提供更大的输入时,算法运行时间会更长。

更一般地说,对于 any 函数 f,如果你想声明 f(n) = f(n-1),你需要解释为什么你可以假设这个,因为这通常不是这样的。

这里的棘手之处在于,当我们编写 O(n) 时,看起来我们正在编写一个名为 O 的函数并传入参数 n,但符号的含义完全不同。符号 O(n) 是“某个函数,当输入变得非常大时,从上面以 n 的倍数为界”的占位符。类似地,O(n-1) 的意思是“某个函数,当输入变得非常大时,从上面以 n-1 的倍数为界。”碰巧任何以 n 的倍数为界的函数也以 n-1 的倍数为界,这就是为什么 O(n) 和 O(n-1) 表示同一事物的原因。

希望这会有所帮助!

【讨论】:

以上是关于在 Big-O 术语中,如果 O(n-1) 与 O(n) 相同,那么为啥在主定理中 T(n-1) 不等于 T(n)?的主要内容,如果未能解决你的问题,请参考以下文章

是 C++ 语句的 Big-O 'delete [] Q;' O(1) 还是 O(n)?

Big-O 表示法和编码

数据库索引及其 Big-O 表示法

带有嵌套 if 语句的 while 循环的 Big-O 运行时

二分查找

寻找 Big-O、Omega 和 theta