📅  最后修改于: 2021-01-12 03:30:41             🧑  作者: Mango
在算法设计中,算法复杂度分析是必不可少的方面。主要地,算法复杂度关注其性能,其运行速度是多少。
算法的复杂性根据处理数据所需的内存量和处理时间来描述算法的效率。
从两个角度分析了算法的复杂性:时间和空间。
该函数根据输入的大小来描述运行算法所需的时间。 “时间”可以表示执行的内存访问次数,整数之间的比较次数,某些内部循环执行的次数或与算法将占用的实时量相关的其他自然单位。
该函数根据算法的输入大小来描述算法占用的内存量。我们经常说需要的“额外”内存,而不是计算存储输入本身所需的内存。同样,我们使用自然的(但固定长度)单位来度量。
有时会因为使用的空间极小和/或明显而忽略了空间复杂性,但是有时它与时间一样重要。
算法的执行时间取决于指令集,处理器速度,磁盘I / O速度等。因此,我们渐近估计算法的效率。
算法的时间函数由T(n)表示,其中n是输入大小。
使用不同类型的渐近符号来表示算法的复杂性。以下渐近符号用于计算算法的运行时间复杂度。
O-大哦
Ω -大欧米加
θ-大θ
o-小哦
ω-小欧米茄
“ O”(大哦)是最常用的表示法。如果存在一个正整数n为n 0和一个正常数c ,则函数f(n)可以表示为g(n)的阶数为O(g(n)) ,从而-
$ f(n)\ leqslant cg(n)$在所有情况下均大于$ n> n_ {0} $
因此,函数g(n)是函数f(n)的上限,因为g(n)的增长快于f(n) 。
让我们考虑一个给定的函数$ f(n)= 4.n ^ 3 + 10.n ^ 2 + 5.n + 1 $
考虑$ g(n)= n ^ 3 $,
$ f(n)\ leqslant 5.g(n)$对于$ n> 2 $的所有值
因此, f(n)的复杂度可以表示为$ O(g(n))$,即$ O(n ^ 3)$
我们说$ f(n)= \ Omega(g(n))$当存在常数c时,对于所有足够大的n值,$ f(n)\ geqslant cg(n)$都存在。这里n是一个正整数。这意味着函数g是函数f的下限;在某个n值之后,f永远不会低于g 。
让我们考虑一个给定的函数$ f(n)= 4.n ^ 3 + 10.n ^ 2 + 5.n + 1 $。
考虑$ g(n)= n ^ 3 $,对于$ n> 0 $的所有值,$ f(n)\ geqslant 4.g(n)$。
因此, f(n)的复杂度可以表示为$ \ Omega(g(n))$,即$ \ Omega(n ^ 3)$
我们说$ f(n)= \ theta(g(n))$当存在常数c 1和c 2时,$ c_ {1} .g(n)\ leqslant f(n)\ leqslant c_ {2} .g(n)$对于所有足够大的n值。这里n是一个正整数。
这意味着函数g是函数f的紧密边界。
让我们考虑一个给定的函数$ f(n)= 4.n ^ 3 + 10.n ^ 2 + 5.n + 1 $
考虑$ g(n)= n ^ 3 $,对于所有大的n值,$ 4.g(n)\ leqslant f(n)\ leqslant 5.g(n)$。
因此, f(n)的复杂度可以表示为$ \ theta(g(n))$,即$ \ theta(n ^ 3)$。
由O标记提供的渐近上限可能会也可能不会渐近。边界$ 2.n ^ 2 = O(n ^ 2)$渐近严格,但边界$ 2.n = O(n ^ 2)$并非渐近。
我们使用o表示法表示一个渐近不紧的上限。
对于任何正常数$ c> 0 $,我们正式定义o(g(n))(n的g的小数点)为集合f(n)= o(g(n)) ,并且存在值$ n_ {0}> 0 $,这样$ 0 \ leqslant f(n)\ leqslant cg(n)$。
直观地,在o表示中,当n接近无穷大时,函数f(n)相对于g(n)变得微不足道;那是,
$$ \ lim_ {n \ rightarrow \ infty} \ left(\ frac {f(n)} {g(n)} \ right)= 0 $$
让我们考虑相同的函数$ f(n)= 4.n ^ 3 + 10.n ^ 2 + 5.n + 1 $
考虑到$ g(n)= n ^ {4} $,
$$ \ lim_ {n \ rightarrow \ infty} \ left(\ frac {4.n ^ 3 + 10.n ^ 2 + 5.n + 1} {n ^ 4} \ right)= 0 $$
因此, f(n)的复杂度可以表示为$ o(g(n))$,即$ o(n ^ 4)$。
我们使用ω表示法来表示不是渐近严格的下界。但是,形式上,对于任何正常数C> 0 ,我们将ω(g(n))(n的g的小Ω)定义为集合f(n)=ω(g(n)) ,并且存在值$ n_ {0}> 0 $,因此$ 0 \ leqslant cg(n) 例如,$ \ frac {n ^ 2} {2} = \ omega(n)$,但是$ \ frac {n ^ 2} {2} \ neq \ omega(n ^ 2)$。关系$ f(n)= \ omega(g(n))$表示存在以下限制 $$ \ lim_ {n \ rightarrow \ infty} \ left(\ frac {f(n)} {g(n)} \ right)= \ infty $$ 即,随着n接近无穷大,相对于g(n) , f(n)变得任意大。 让我们考虑相同的函数,$ f(n)= 4.n ^ 3 + 10.n ^ 2 + 5.n + 1 $ 考虑$ g(n)= n ^ 2 $, $$ \ lim_ {n \ rightarrow \ infty} \ left(\ frac {4.n ^ 3 + 10.n ^ 2 + 5.n + 1} {n ^ 2} \ right)= \ infty $$ 因此, f(n)的复杂度可以表示为$ o(g(n))$,即$ \ omega(n ^ 2)$。 先验分析是指在特定系统上运行之前进行分析。该分析是使用某些理论模型定义函数的阶段。因此,我们仅通过查看算法而不是在具有不同内存,处理器和编译器的特定系统上运行即可确定算法的时间和空间复杂度。 对算法的后验分析意味着我们仅在系统上运行后才对算法进行分析。它直接取决于系统,并随系统而变化。 在一个行业中,我们无法执行Apostiari分析,因为该软件通常是为匿名用户制作的,该软件在与该行业现有系统不同的系统上运行。 在Apriori中,这是我们使用渐近符号来确定时间和空间复杂度的原因,因为它们在计算机之间变化。但是,渐近地它们是相同的。例
Apriori和Apostiari分析