大Ө符号代表什么?

我对大O,大欧米茄和大西塔符号之间的差异感到困惑。

我明白,大O是上界,大Omega是下界,但大Ө(θ)究竟代表什么?

我已经读过这意味着紧张的限制 ,但这意味着什么?


这意味着该算法在给定函数中既是大O又是大Omega。

例如,如果它是Ө(n) ,那么存在一些常数k ,使得你的函数(运行时间,无论什么)大于n*k对于足够大的n以及其他常数K ,使得你的函数对于足够大的n小于n*K

换句话说,对于足够大的n ,它夹在两个线性函数之间:

对于k < Kn足够大, n*k < f(n) < n*K


首先让我们了解什么是大O,大西塔和大欧米茄。 它们都是一套功能。

大O给出了上限渐近界,而大欧米茄给出了一个下界。 Big Theta给出了两个。

一切都是Ө(f(n))也是O(f(n)) ,但不是相反。
如果它在O(f(n))Omega(f(n))则称T(n)Ө(f(n)) Omega(f(n))
在集合术语中, Ө(f(n))O(f(n))Omega(f(n))的交集。

例如,合并排序最坏的情况是O(n*log(n))Omega(n*log(n)) - 因此也是Ө(n*log(n)) ,但它也是O(n^2) ,因为n^2比它渐近地“大”。 然而,它不是 Ө(n^2) ,因为该算法不是Omega(n^2)

有点更深入的数学解释

O(n)是渐近上界。 如果T(n)O(f(n)) ,这意味着从某个n0 ,存在一个常数C ,使得T(n) <= C * f(n) 。 另一方面,大欧米茄说,有一个常数C2使得T(n) >= C2 * f(n)) )。

不要混淆!

不要与最差,最好和平均情况分析混淆:所有三个(欧米茄,O,西塔)符号是相关的算法最好,最差,平均情况分析。 这些中的每一个都可以应用于每个分析。

我们通常使用它来分析算法的复杂性 (如上面的合并排序示例)。 当我们说“算法A是O(f(n)) ”时,我们真正的意思是“最坏情况下分析的算法复杂度为O(f(n)) ” - 意思是它缩放“相似”(或正式,不逊于)函数f(n)

为什么我们关心算法的渐近界?

那么,这有很多原因,但我相信其中最重要的是:

  • 要确定确切的复杂度函数是非常困难的,因此我们在大O /大-Theta符号上“妥协”,这些符号在理论上足够丰富。
  • 操作的确切数量也取决于平台。 例如,如果我们有一个包含16个数字的向量(列表)。 需要多少操作? 答案是:这取决于。 一些CPU允许向量添加,而另一些则不允许,因此不同的实现和不同的机器之间的答案会有所不同,这是不受欢迎的属性。 然而,大O符号在机器和实现之间更加稳定。
  • 为了演示这个问题,请看下面的图表: 在这里输入图像描述

    很明显, f(n) = 2*nf(n) = n “更差”。 但差异并不像其他功能那样激烈。 我们可以看到f(n)=logn很快就比其他函数低很多,并且f(n) = n^2很快就比其他函数高很多。
    因此,由于上述原因,我们“忽略”常数因素(图表示例中的2 *),并且只采用大O符号。

    在上面的例子中, f(n)=n, f(n)=2*n都将在O(n)Omega(n) - 因此也将在Theta(n)
    另一方面, f(n)=logn将在O(n) (它比f(n)=n ),但不会在Omega(n) - 因此也不会在Theta(n)
    对称地, f(n)=n^2将在Omega(n) ,但不在O(n) ,因此 - 也不是Theta(n)


    1通常,尽管并非总是如此。 当分析类别(最差,最好和最差)缺失时,我们确实意味着最坏的情况。


    为了回答你的问题,渐近符号中的渐近符号和函数也需要解释。 如果你有耐心阅读所有内容,最终情况会非常清楚。

    1.渐近符号

    想想算法,您可以使用2个主要思想:

  • 确定算法在输入方面需要多长时间。
  • 关注功能随输入大小增长的速度; 也就是运行时间的增长速度。 例子:假设一个运算在大小为n的输入上的算法需要6n ^ 2 + 100n + 300条机器指令。 一旦n变得足够大,6n ^ 2项变得大于剩余项,100n + 300,在这种情况下为20。 在这里输入图像描述
  • 我们可以说这个算法的运行时间增长为n ^ 2,系数为6,剩余项为100n + 300。这与我们使用的系数无关。 只要运行时间是^ 2 + bn + c,对于某些数字a> 0,b和c,总会有一个n的值,其中^ 2大于bn + c,并且这个差值随着n的增加而增加。 通过删除常数系数和不显着的项,我们使用渐近表示法。

    2. Big-Theta

    这是一个线性搜索的简单实现

    var doLinearSearch = function(array) {
      for (var guess = 0; guess < array.length; guess++) {
        if (array[guess] === targetValue) { 
            return guess;  // found it!
        }
      }
      return -1;  // didn't find it
    };
    
  • 每次这些小计算每次执行时都会持续一段时间。 如果for循环迭代n次,则所有n次迭代的时间为c1 * n,其中c 1是一次循环迭代中计算次数的总和。 这段代码有一点额外开销,用于设置for循环(包括将猜测初始化为0),并可能在最后返回-1。 让我们来调用这个开销c 2的时间,这也是一个常量。 因此,最坏情况下线性搜索的总时间为c 1 * n + c 2。
  • 常数因子c 1和低阶项c 2没有告诉我们关于运行时间的增长率。 重要的是,线性搜索的最坏情况运行时间会像数组大小n一样增长。 我们用于这个运行时间的符号是Θ(n)。 这就是希腊字母“theta”,我们说“n的big-theta”或者“n的Theta”。
  • 当我们说一个特定的运行时间是Θ(n)时,我们说,一旦n变得足够大,运行时间至少为k 1 * n,而对于某些运行时间至多为k 2 * n常数k 1和k 2。 以下是如何考虑Θ(n) 在这里输入图像描述

  • 对于n的小值,我们不关心运行时间与k 1 * n或k 2 * n的比较。 但是,一旦n变得足够大 - 在虚线右侧或右侧 - 运行时间必须夹在k 1 * n和k 2 * n之间。 只要这些常数k 1和k 2存在,我们就说运行时间是Θ(n)。

  • 当我们使用big-Θ表示法时,我们说我们在运行时间上有一个渐近的紧束缚 。 “渐近地”,因为它只对n的大数值很重要。 “紧张的限制”是因为我们已经将运行时间固定在一个恒定的因子上下。
  • 3.渐近表示法中的函数

  • 假设一个算法花费了一定的时间,而不管输入大小如何。 例如,如果给定的数组已经按照递增顺序排序,并且必须找到最小元素,则需要一定的时间,因为最小元素必须位于索引0处。因为我们喜欢使用函数n在渐近表示法中,可以说这个算法运行在Θ(n ^ 0)时间。 为什么? 因为n ^ 0 = 1,并且算法的运行时间在某个常数因子1内。实际上,我们不写Θ(n ^ 0),但是; 我们写Θ(1)
  • 以下列出了我们在分析算法时经常遇到的渐近表示法中的函数,列出了从最慢到最快的增长。 这份清单并非详尽无遗; 有很多算法的运行时间不会出现在这里:
  • Θ(1)(又名常量搜索)
  • Θ(lg n)(又名二进制搜索)
  • Θ(n)(又名线性搜索)
  • Θ(n * lg n)
  • Θ(N ^ 2)
  • Θ(n ^ 2 * lg n)
  • Θ(N ^ 3)
  • Θ(2 ^ n)的

  • 请注意,指数函数a ^ n(其中a> 1)比任何多项式函数n ^ b增长更快,其中b是任何常数。

  • 4.大O符号

  • 我们使用big-Θ表示渐近地将运行时间的增长限制在上下的常量因子之内。 有时我们只想从上面绑定。 有一种渐近符号的形式会很方便,即“运行时间至多增长了很多,但增长速度可能会更慢”。 我们在这种场合使用“大O”符号。
  • 如果运行时间是O(f(n)),那么对于足够大的n,对于某个常数k,运行时间最多为k * f(n)。 以下是如何考虑O(f(n))的运行时间: 在这里输入图像描述
  • 如果您回到big-Θ表示法的定义,您会注意到它看起来很像大O符号,除了big-Θ符号限制从上面和下面的运行而不是从上面运行。 如果我们说在特定情况下运行时间是Θ(f(n)),那么它也是O(f(n))。 例如,我们可以说因为二元搜索的最坏情况运行时间是Θ(lg n),所以它也是O(lg n)。 反过来不一定是正确的:正如我们所看到的,我们可以说二分搜索总是以O(lg n)时间运行,但并不总是以Θ(lg n)时间运行。
  • 假设你的口袋里有10美元。 你去找你的朋友说:“我的口袋里有一笔钱,我保证它不会超过一百万美元。” 你的陈述绝对是真实的,尽管不是非常精确。 一百万美元是10美元的上限,正如O(n)是二进制搜索运行时间的上限。
  • 其他不精确的二进制搜索的上界将是O(n ^ 2),O(n ^ 3)和O(2 ^ n)。 但是,在任何情况下,Θ(n),Θ(n ^ 2),Θ(n ^ 3)和Θ(2 ^ n)都不能正确描述二进制搜索的运行时间。
  • 5.大Ω(大欧米茄)符号

  • 有时候,我们想说一个算法至少需要一定的时间,而没有提供上限。 我们使用大Ω符号; 那是希腊字母“欧米茄”。
  • 如果运行时间是Ω(f(n)),那么对于足够大的n,对于某个常数k,运行时间至少为k * f(n)。 以下是如何考虑Ω(f(n))的运行时间: 在这里输入图像描述
  • 我们说运行时间是“f(n)的大Ω”。 我们使用big-Ω符号作为渐近下界,因为它限制了足够大的输入大小从下面运行时间的增长。
  • 正如Θ(f(n))自动暗示O(f(n)),它也自动暗示Ω(f(n))。 所以我们可以说二进制搜索的最坏情况运行时间是Ω(lg n)。 我们也可以使用big-Ω符号做出正确但不精确的陈述。 例如,就好像你的口袋里真的有一百万美元一样,你可以如实地说“我口袋里有很多钱,而且至少10美元”,你也可以说最坏的情况下运行二进制搜索的时间是Ω(1),因为它至少需要一个固定的时间。
  • 参考:https://www.khanacademy.org

    链接地址: http://www.djcxy.com/p/6795.html

    上一篇: What exactly does big Ө notation represent?

    下一篇: What is the difference between a Generative and Discriminative Algorithm?