【问题标题】:does every algorithm have Big Omega?每个算法都有Big Omega吗?
【发布时间】:2013-03-07 16:20:03
【问题描述】:

每个算法都有Big Omega吗?

算法是否有可能同时具有大 O 和大欧米茄(但不等于彼此 - 不是大 Theta)?

例如 Quicksort 的 Big O - O(n log n) 但它有 Big Omega 吗?如果是,我该如何计算?

【问题讨论】:

  • 我很确定快速排序是 O(n^2)。
  • 任何算法都可以说是Omega(1) :)
  • @Dukeling 我认为正确的说法是快速排序在平均情况下是 O(n log n),在最坏情况下是 O(n^2)。有关 case 和 bound 之间区别的讨论,请参阅我的回答,我认为这与这个问题有关。

标签: time-complexity big-o


【解决方案1】:

首先,最重要的是不要将 boundcase 混淆。 bound - 如 Big-Oh、Big-Omega、Big-Theta 等 - 说明了增长率。 case 说明了您目前正在考虑由算法处理的输入类型。

让我们考虑一个非常简单的例子来说明上面的区别。考虑规范的“线性搜索”算法:

LinearSearch(list[1...n], target)
1. for i := 1 to n do
2.    if list[i] = target then return i
3. return -1

人们可以考虑三种广泛的情况:大小为n 的输入的最佳情况、最差情况和平均情况。在最好的情况下,您要查找的是列表中的第一个元素(实际上,在列表开头的任何固定数量内)。在这种情况下,查找元素并从函数返回只需要一些恒定的时间。因此,对于最佳情况,Big-Oh 和 Big-Omega 恰好是相同的:O(1)Omega(1)。当OOmega 都适用时,我们也说Theta,所以这也是Theta(1)

在最坏的情况下,元素不在列表中,算法必须遍历所有n 条目。由于f(n) = n 恰好是由同一类函数(线性函数)从上方和下方绑定的函数,因此这是Theta(n)

平均案例分析通常有点棘手。我们需要为长度为n 的可行输入定义一个概率空间。有人可能会说所有有效输入(例如,整数可以在无符号模式下使用 32 位表示)都是同样可能的。由此可以得出算法的平均性能如下:

  1. 找出target 不在列表中的概率。乘以n
  2. 鉴于target 至少出现在列表中一次,求它出现在每个1 <= k <= n 位置k 的概率。将每个P(k) 乘以k
  3. 将以上所有内容相加得到n 的函数。

请注意,在上面的步骤 1 中,如果概率不为零,我们肯定会得到至少一个线性函数(练习:我们永远不会得到超过一个线性函数)。但是,如果第 1 步中的概率确实为零,那么第 2 步中的概率分配在确定复杂性时会产生重大影响:对于某些分配,您可以有最佳情况的行为,对其他分配有最坏的情况,并可能最终具有与最佳(恒定)或最差(线性)不同的行为。

有时,我们可能会松散地谈论“一般”或“通用”案例,它考虑了所有类型的输入(不仅仅是最好的或最差的),但这并没有给输入赋予任何特定权重,也没有' t取平均值。换句话说,您根据最坏情况下的上限和最佳情况下的下限来考虑算法的性能。这似乎是你正在做的。

呸。现在,回到你的问题。

是否存在具有不同OOmega 界限的函数?确实。考虑以下函数:

f(n) = 1 if n is odd, n if n is even.

最好的情况是“n是奇数”,此时f就是Theta(1);最坏的情况是“n是偶数”,在这种情况下fTheta(n);如果我们假设我们谈论的是 32 位无符号整数的平均情况,那么在平均情况下,f 也是 Theta(n)。但是,如果我们谈论“通用”情况,那么fO(n)Omega(1),而不是Theta。运行时行为符合f 的算法可能如下:

Strange(list[1...n], target)
1. if n is odd then return target
2. else return LinearSearch(list, target)

现在,一个更有趣的问题可能是,是否有算法无法为某些情况(“通用”情况除外)分配一些有效的Theta 界限。这很有趣,但并不过分。原因是您在分析期间可以选择构成最佳和最坏情况行为的情况。如果您对该案例的第一选择结果没有Theta 绑定,您可以简单地排除出于您的目的“异常”的输入。从这个意义上说,案例和界限并不是完全独立的:您通常可以选择一个案例,使其具有“良好”界限。

但你能做到吗?

我不知道,但这是一个有趣的问题。

【讨论】:

    【解决方案2】:

    是否每个算法都有一个 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))”。这有点模棱两可,因为不清楚算法是否总是对某些输入大小花费相同的时间,或者该语句指的是最好、平均或最坏的情况之一。

    如何计算?

    很难对此给出一般性建议,因为边界证明很大程度上取决于算法。您需要分析类似于我上面所做的算法,以找出最坏和最好的情况。

    【讨论】:

      【解决方案3】:

      Big O 和 Big Omega 可以为您在Big-oh vs big-theta 中看到的每种算法进行计算

      【讨论】:

      • 作为评论更合适。
      猜你喜欢
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2018-03-18
      • 2020-01-23
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多