是否每个算法都有一个 Big Omega?
是的。 Big Omega 是一个下界。可以说任何算法都需要至少恒定时间,所以任何算法都是Ω(1)。
每个算法都有大 O 吗?
没有。大 O 是上限。不(可靠)终止的算法没有大 O。
如果我们可以说,在绝对最坏的情况下,算法不会花费比这更长的时间,那么算法就有上限。我很确定 O(∞) 不是有效的表示法。
算法的 Big O 和 Big Omega 什么时候会相等?
实际上有一个特殊的符号表示它们可以相等:Big Theta (Θ)。
如果算法与输入的大小完美地缩放,它们将是相等的(这意味着没有输入大小使算法突然变得更有效)。
这是假设我们将 Big O 视为可能的最小上限,并将 Big Omega 视为可能的最大下限。定义实际上并不要求这样做,但它们通常被非正式地对待。如果你放弃这个假设,你会发现对于 any 算法不相等的 Big O 和 Big Omega。
暴力素数检查(我们只是循环遍历所有较小的数字并尝试将它们划分为目标数字)也许是一个很好的例子,说明最小上界和最大下界何时是不相等。
假设你有一些号码n。让我们暂时忽略一个事实,即更大的数字需要更长的时间来划分(当我们考虑到这一点时,类似的论点也成立,尽管实际的复杂性会有所不同)。而且我还根据数字本身而不是数字的 size 来计算复杂度(可以是位数,并且可能会改变这里的分析)。
如果n 可以被 2(或其他一些小的素数)整除,我们可以非常快速地检查它是否是 1 除法(或恒定除法数)的素数。所以最大的下限是Ω(1)。
现在如果n 是质数,我们需要尝试将n 除以sqrt(n) 之前的每个数字(我会留下我们不需要比这更高的原因练习)。这将采用O(sqrt(n)),这也是我们最小的上限。
所以算法将是Ω(1) 和O(sqrt(n))。
对于一些特别复杂的算法,精确的复杂度也可能难以计算。在这种情况下,简单地计算一些合理接近的下限和上限并保持不变可能会更容易和可以接受。但是,我手头没有这方面的示例。
这与最佳情况和最坏情况有何关系?
不要混淆最佳和最坏情况的上限和下限。这是一个常见的错误,有点令人困惑,但they're not the same。这是一个完全不同的话题,但作为一个简短的解释:
可以针对每个输入大小计算最佳和最差(和平均)情况。然后可以将上限和下限用于这 3 种情况中的每一种(分别)。您可以将每种情况视为图表上的一条线,x 轴为输入大小,y 轴为时间,然后,对于每条线,上限和下限是需要严格遵守的线高于或低于该线,因为输入大小趋于无穷大(这不是 100% 准确,但这是一个很好的基本想法)。
快速排序的最坏情况为Θ(n<sup>2</sup>)(当我们在每一步都选择最差的支点时)和最佳情况为Θ(n log n)(当我们选择好的支点时) .请注意 Big Theta 的使用,这意味着它们中的每一个都是下限和上限。
让我们比较一下快速排序和上面的素数检查算法:
- 假设你有一个给定的数字
n,而n 是53。因为它是素数,它会(总是)采取sqrt(53) 左右的步骤来确定它是否是素数。所以最好和最坏的情况都是一样的。
- 假设您要对某个大小为
n 的数组进行排序,而n 为53。现在可以排列这53 个元素,以便快速排序最终选择非常糟糕的枢轴并在53<sup>2</sup> 步骤左右运行(最坏的情况)或非常好的枢轴并以53 log 53 步数运行(最好的情况)。所以最好和最坏的情况是不同的。
- 现在将
n 设为 54 用于上述各项:
- 对于素数检查,只需大约
1 步即可确定54 是素数。最好和最坏的情况再次相同,但它们与 53 的情况不同。
- 对于快速排序,您将再次遇到大约
54<sup>2</sup> 步的最坏情况和大约54 log 54 步的最佳情况。
因此,对于快速排序,最坏的情况总是需要大约 n<sup>2</sup> 步,而最好的情况总是需要大约 n log n 步。所以最坏情况的下限和上限(或“紧”)是Θ(n<sup>2</sup>),最好情况的紧限是Θ(n log n)。
对于我们的主要检查,有时最坏的情况大约需要sqrt(n) 步,有时需要大约1 步。所以最坏情况的下限是Ω(1),上限是O(sqrt(n))。最好的情况也是一样。
请注意,上面我只是说“算法将是Ω(1) 和O(sqrt(n))”。这有点模棱两可,因为不清楚算法是否总是对某些输入大小花费相同的时间,或者该语句指的是最好、平均或最坏的情况之一。
如何计算?
很难对此给出一般性建议,因为边界证明很大程度上取决于算法。您需要分析类似于我上面所做的算法,以找出最坏和最好的情况。