📜  算法分析|组合3(渐近符号)

📅  最后修改于: 2021-05-08 17:20:23             🧑  作者: Mango

我们讨论了渐近分析以及算法的最差,平均和最佳情况。渐近分析的主要思想是对算法的效率进行度量,这些算法不依赖于特定于机器的常量,不需要实施算法,也不需要比较程序花费的时间。渐进符号是代表渐进分析算法时间复杂度的数学工具。以下3个渐近符号主要用于表示算法的时间复杂度。

定语

1)Θ符号: theta符号从上到下限制一个函数,因此它定义了精确的渐近行为。
获得表达式Theta表示法的一种简单方法是删除低阶项,并忽略前导常数。例如,考虑以下表达式。
3n 3 + 6n 2 + 6000 =Θ(n 3 )
丢弃低阶项总是很好的,因为总是有一个数字(n),其后Θ(n 3 )的值要比Θ(n 2 )高,而与所涉及的常数无关。
对于给定的函数g(n),我们表示Θ(g(n))在函数的后面。

Θ(g(n)) = {f(n): there exist positive constants c1, c2 and n0 such 
                 that 0 <= c1*g(n) <= f(n) <= c2*g(n) for all n >= n0}

上面的定义意味着,如果f(n)是g(n)的theta,那么对于大的n值(n> = n0)。 theta的定义还要求对于大于n0的n值,f(n)必须为非负数。

比格

2)Big O表示法: Big O表示法定义了算法的上限,它仅从上方限制函数。例如,考虑插入排序的情况。在最佳情况下,它需要线性时间,在最坏情况下,它需要二次时间。可以肯定地说,插入排序的时间复杂度为O(n ^ 2)。注意,O(n ^ 2)也涵盖了线性时间。
如果使用Θ表示法表示插入排序的时间复杂度,则在最佳和最差情况下,我们必须使用两个语句:
1.插入排序的最坏情况下时间复杂度为Θ(n ^ 2)。
2.插入排序的最佳情况下时间复杂度为Θ(n)。

当我们仅对算法的时间复杂度有上限时,Big O表示法很有用。很多时候,我们只需看一下算法就可以轻松找到上限。

O(g(n)) = { f(n): there exist positive constants c and 
                  n0 such that 0 <= f(n) <= c*g(n) for 
                  all n >= n0}

大欧米茄

3)Ω表示法:正如Big O表示法在函数上提供渐近上限,Ω表示法在函数提供渐近下限。
当我们对算法的时间复杂度有较低的限制时,Ω表示法可能会很有用。如前一篇文章所述,算法的最佳情况性能通常没有用,Omega表示法是这三种方法中使用最少的表示法。

对于给定的函数g(n),我们用Ω(g(n))表示函数集。

Ω (g(n)) = {f(n): there exist positive constants c and
                  n0 such that 0 <= c*g(n) <= f(n) for
                  all n >= n0}.

让我们在这里考虑相同的插入排序示例。插入排序的时间复杂度可以写成Ω(n),但它不是关于插入排序的非常有用的信息,因为我们通常对最坏的情况(有时在平均情况下)感兴趣。

渐近符号的性质:
当我们研究了这三种符号的定义时,现在让我们讨论这些符号的一些重要属性。

1.一般属性:

如果f(n)是O(g(n)),则a * f(n)也是O(g(n));其中a为常数。

例如:f(n)=2n²+ 5是O(n²)
那么7 * f(n)= 7(2n²+ 5)=14n²+ 35也是O(n²)。

同样,此属性同时满足Θ和Ω表示法。

我们可以说
如果f(n)是Θ(g(n)),则a * f(n)也是Θ(g(n));其中a为常数。
如果f(n)是Ω(g(n)),则a * f(n)也是Ω(g(n));其中a为常数。

2.传递特性:

如果f(n)为O(g(n))且g(n)为O(h(n)),则f(n)= O(h(n))。

例如:如果f(n)= n,g(n)=n²且h(n)=n³
n为O(n²),n²为O(n³)
则n为O(n³)

同样,此属性同时满足Θ和Ω表示法。

我们可以说
   如果f(n)为Θ(g(n))且g(n)为Θ(h(n)),则f(n)=Θ(h(n))。
如果f(n)为Ω(g(n)),且g(n)为Ω(h(n)),则f(n)=Ω(h(n))

3.反射性

反身性在传递之后总是很容易理解。

如果给定f(n),则f(n)为O(f(n))。由于f(n)的最大值将是f(n),所以它是ITSELF!

因此,x = f(n)和y = O(f(n)总是以自反关系联系起来。

例如: f(n)=n²; O(n²)即O(f(n))

同样,此属性同时满足Θ和Ω表示法。

我们可以这样说:

如果给出f(n),则f(n)为Θ(f(n))。

如果给出f(n),则f(n)为Ω(f(n))。

4.对称属性:

如果f(n)为Θ(g(n)),则g(n)为Θ(f(n))。

例如:f(n)=n²和g(n)=n²
那么f(n)=Θ(n²)和g(n)=Θ(n²)

此属性仅满足Θ表示法。

5.转置对称属性:

如果f(n)为O(g(n)),则g(n)为Ω(f(n))。

例如: f(n)= n,g(n)=n²
那么n是O(n²)和n²是Ω(n)

此属性仅满足O和Ω表示法

6.更多属性:

1.)如果f(n)= O(g(n))且f(n)=Ω(g(n)),则f(n)=Θ(g(n))

2.)如果f(n)= O(g(n))且d(n)= O(e(n))
那么f(n)+ d(n)= O(max(g(n),e(n)))
示例: f(n)= n即O(n)
d(n)=n²即O(n²)
则f(n)+ d(n)= n +n²即O(n²)

3.)如果f(n)= O(g(n))和d(n)= O(e(n))
然后f(n)* d(n)= O(g(n)* e(n))
示例: f(n)= n即O(n)
d(n)=n²即O(n²)
则f(n)* d(n)= n *n²=n³,即O(n³)

_________________________________________________________________________________

锻炼:
下列哪个陈述是有效的?
1. QuickSort的时间复杂度为Θ(n ^ 2)
2. QuickSort的时间复杂度为O(n ^ 2)
3.对于任意两个函数f(n)和g(n),当且仅当f(n)= O(g(n))和f(n )=Ω(g(n))。
4.所有计算机算法的时间复杂度可以写成Ω(1)

重要链接:

  • 还有另外两种表示法,分别是little o和little omega 。小o提供严格的上限(从大O中删除了相等条件),小omega提供了严格的下限(从大omega中删除了相等条件)
  • 算法分析|第四组(循环分析)
  • 关于算法分析的最新文章。

参考:
讲课1 | MIT(算法简介)