时间复杂度转载自维基百科3

来源:互联网 发布:淘宝如何办理退货 编辑:程序博客网 时间:2024/06/16 17:19

时间复杂度

维基百科,自由的百科全书

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。举例,如果一个算法对于任何大小为{\displaystyle n}n的输入,它至多需要{\displaystyle 5n^{3}+3n}5n^{3}+3n的时间运行完毕,那么它的渐近时间复杂度是{\displaystyle O(n^{3})}O(n^{3})

计算时间复杂度的过程,常常需要分析一个算法运行过程中需要的基本操作,计量所有操作的数量。通常假设一个基本操作可在固定时间内完成,因此总运行时间和操作的总数量最多相差一个常量系数。

有时候,即使对于大小相同的输入,同一算法的效率也可能不同。因此,常对最坏时间复杂度进行分析。最坏时间复杂度定义为对于给定大小{\displaystyle n}n的任何输入,某个算法的最大运行时间,记为{\displaystyle T(n)}T(n)。通常根据{\displaystyle T(n)}T(n)对时间复杂度进行分类。比如,如果对某个算法有{\displaystyle T(n)=O(n)}T(n)=O(n),则称其具有线性时间。如有{\displaystyle T(n)=O(2^{n})}T(n)=O(2^{n}),则称其具有指数时间。

目录

  [隐藏] 
  • 1常见时间复杂度列表
  • 2常数时间
  • 3对数时间
  • 4幂对数时间
  • 5次线性时间
  • 6线性时间
  • 7线性对数(准线性)时间
  • 8多项式时间
    • 8.1强多项式时间与弱多项式时间
    • 8.2复杂度类
  • 9超越多项式(superpolynomial)时间
  • 10准多项式时间
    • 10.1与NP完全问题的关系
    • 10.2第一定义
    • 10.3第二定义
      • 10.3.1指数时间假设
  • 11指数时间
  • 12双重指数时间
  • 13参见
  • 14参考资料

常见时间复杂度列表

以下是一些常见时间复杂度的例子。

名称复杂度类运行时间({\displaystyle T(n)}T(n))运行时间举例算法举例常数时间 {\displaystyle O(1)}O(1)10判断一个二进制数的奇偶反阿克曼时间 {\displaystyle O(\alpha (n))}O(\alpha (n)) 并查集的单个操作的平摊时间迭代对数时间 {\displaystyle O(\log ^{*}n)}O(\log ^{{*}}n) en:Cole-Vishkin algorithm对数对数时间 {\displaystyle O(\log \log n)}O(\log \log n) 有界优先队列的单个操作[1]对数时间DLOGTIME{\displaystyle O(\log n)}O(\log n){\displaystyle \log n}\log n{\displaystyle \log n^{2}}\log n^{2}二分搜索幂对数时间 {\displaystyle (\log n)^{O(1)}}(\log n)^{{O(1)}}{\displaystyle (\log n)^{2}}(\log n)^{2} (小于1次)幂时间 {\displaystyle O(n^{c})}O(n^{c}),其中{\displaystyle 0<c<1}0<c<1{\displaystyle n^{\frac {1}{2}}}n^{{{\frac  {1}{2}}}}{\displaystyle n^{\frac {2}{3}}}n^{{{\frac  {2}{3}}}}K-d树的搜索操作线性时间 {\displaystyle O(n)}O(n){\displaystyle n}n无序数组的搜索线性迭代对数时间 {\displaystyle O(n\log ^{*}n)}O(n\log ^{{*}}n) Raimund Seidel三角分割多边形算法线性对数时间 {\displaystyle O(n\log n)}O(n\log n){\displaystyle n\log n}n\log n{\displaystyle \log n!}\log n!最快的比较排序二次时间 {\displaystyle O(n^{2})}O(n^{2}){\displaystyle n^{2}}n^{2}冒泡排序、插入排序三次时间 {\displaystyle O(n^{3})}O(n^{3}){\displaystyle n^{3}}n^{3}矩阵乘法的基本实现,计算部分相关性多项式时间P{\displaystyle 2^{O(\log n)}=n^{O(1)}}2^{{O(\log n)}}=n^{{O(1)}}{\displaystyle n}n{\displaystyle n\log n}n\log n{\displaystyle n^{10}}n^{{10}}线性规划中的en:Karmarkar's algorithm,AKS质数测试准多项式时间QP{\displaystyle 2^{(\log n)^{O(1)}}}2^{{(\log n)^{{O(1)}}}} 关于有向斯坦纳树问题最著名的{\displaystyle O(\log ^{2}n)}O(\log ^{2}n)近似算法次指数时间(第一定义)SUBEXP{\displaystyle O(2^{n^{\epsilon }})}O(2^{{n^{{\epsilon }}}}),对任意的ε > 0{\displaystyle O(2^{(\log n)^{\log \log n}})}O(2^{{(\log n)^{{\log \log n}}}})Assuming complexity theoretic conjectures, BPP is contained in SUBEXP.[2]次指数时间(第二定义) 2o(n2n1/3Best-known algorithm for integer factorization and graph isomorphism指数时间E2O(n)1.1n, 10n使用动态规划解决旅行推销员问题阶乘时间 O(n!)n!通过暴力搜索解决旅行推销员问题指数时间EXPTIME2poly(n)2n, 2n2 双重指数时间2-EXPTIME22poly(n)22nDeciding the truth of a given statement in Presburger arithmetic

常数时间

若对于一个算法,{\displaystyle T(n)}T(n)的上界与输入大小无关,则称其具有常数时间,记作{\displaystyle O(1)}O(1)时间。一个例子是访问数组中的单个元素,因为访问它只需要一条指令。但是,找到无序数组中的最小元素则不是,因为这需要遍历所有元素来找出最小值。这是一项线性时间的操作,或称{\displaystyle O(n)}O(n)时间。但如果预先知道元素的数量并假设数量保持不变,则该操作也可被称为具有常数时间。

虽然被称为“常数时间”,运行时间本身并不必须与问题规模无关,但它的上界必须是与问题规模无关的确定值。举例,“如果a > b则交换a、b的值”这项操作,尽管具体时间会取决于条件“a > b”是否满足,但它依然是常数时间,因为存在一个常量t使得所需时间总不超过t。

以下是一个常数时间的代码片段:

int index = 5;int item = list[index];if (condition true) then   perform some operation that runs in constant timeelse   perform some other operation that runs in constant timefor i = 1 to 100   for j = 1 to 200      perform some operation that runs in constant time

如果{\displaystyle T(n)=O(c)}T(n)=O(c),其中{\displaystyle c}c是一个常数,这记法等价于标准记法{\displaystyle T(n)=O(1)}T(n)=O(1)

对数时间

若算法的T(n) = O(log n),则称其具有对数时间。由于计算机使用二进制的记数系统,对数常常以2为底(即log2 n,有时写作lg n)。然而,由对数的换底公式,loga n和logb n只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(log n),而不论对数的底是多少,是对数时间算法的标准记法。

常见的具有对数时间的算法有二叉树的相关操作和二分搜索。

对数时间的算法是非常有效的,因为每增加一个输入,其所需要的额外计算时间会变小。

递归地将字符串砍半并且输出是这个类别函数的一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。 这意味着,如果我们想增加输出的次数,我们需要将字符串长度加倍。

// 递归输出一个字符串的右半部分var right = function(str){    var length = str.length;    // 辅助函数    var help = function(index)    {        // 递归情况:输出右半部分        if(index < length){            // 输出从index到数组末尾的部分            console.log(str.substring(index, length));            // 递归调用:调用辅助函数,将右半部分作为参数传入            help(Math.ceil((length + index)/2));        }        // 基本情况:什么也不做    }    help(0);}

幂对数时间

对于某个常数k,若算法的T(n) = O((log n)k),则称其具有幂对数时间。例如,矩阵链排序可以通过一个PRAM模型.[3]被在幂对数时间内解决。

次线性时间

对于一个算法,若其符合T(n) = o(n),则其时间复杂度为次线性时间sub-linear timesublinear time)。实际上除了符合以上定义的算法,其他一些算法也拥有次线性时间的时间复杂度。例如有O(n½) Grover's search算法。

常见的非合次线性时间算法都采用了诸如平行处理(parallel processing) (就像NC1 matrix行列式计算那样),量子算法(non-classical processing) (有如Grover's search算法),又或者选择性地对有保证的输入结构作出假设(如幂对数时间的二进制搜索binary search)。不过,一些情况,例如在头log(n)位元中每个字串有一个位元作为索引的字串组就可能依赖于输入的每个位元,但又符合次线性时间的条件。

次线性时间算法(sublinear time algorithm)通常指那些不符合前一段的描述的算法。它们通常运行于传统电脑架构系列并且不容许任何对输入的事先假设。[4]但是它们可以是随机化算法,而且必须是真随机算法除了特殊情况(the most trivial of tasks)。

As such an algorithm must provide an answer without reading the entire input, its particulars heavily depend on the access allowed to the input. Usually for an input that is represented as a binary string b1,...,bk it is assumed that the algorithm can in time O(1) request and obtain the value of bi for any i.

Sub-linear time algorithms are typically randomized, and provide only approximate solutions. In fact, the property of a binary string having only zeros (and no ones) can be easily proved not to be decidable by a (non-approximate) sub-linear time algorithm. Sub-linear time algorithms arise naturally in the investigation of property testing.

线性时间

如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。例如,一个计算列表所有元素的和的程序,需要的时间与列表的长度成正比。这个描述是稍微不准确的,因为运行时间可能显著偏离一个精确的比例,尤其是对于较小的n。

线性对数(准线性)时间

若一个算法时间复杂度T(n) = O(nlog n),则称这个算法具有线性对数时间。因此,从其表达式我们也可以看到,线性对数时间增长得比线性时间要快,但是对于任何含有n,且n的幂指数大于1的多项式时间来说,线性对数时间却增长得慢。

多项式时间

强多项式时间与弱多项式时间[

复杂度类

从多项式时间的概念出发,在计算复杂度理论中可以得到一些复杂度类。以下是一些重要的例子。

  • P:包含可以使用确定型图灵机在多项式时间内解决的决定性问题。
  • NP:包含可以使用非确定型图灵机在多项式时间内解决的决定性问题。
  • ZPP:包含可以使用概率图灵机在多项式时间内零错误解决的决定性问题。
  • RP:包含可以使用概率图灵机在多项式时间内解决的决定性问题,但它给出的两种答案中(是或否)只有一种答案是一定正确的,另一种则有几率不正确。
  • BPP:包含可以使用概率图灵机在多项式时间内解决的决定性问题,它给出的答案有错误的概率在某个小于0.5的常数之内。
  • BQP:包含可以使用量子图灵机在多项式时间内解决的决定性问题,它给出的答案有错误的概率在某个小于0.5的常数之内。

在机器模型可变的情况下,P在确定性机器上是最小的时间复杂度类。例如,将单带图灵机换成多带图灵机可以使算法运行速度以二次阶提升,但所有具有多项式时间的算法依然会以多项式时间运行。一种特定的抽象机器会有自己特定的复杂度类分类。

超越多项式(superpolynomial)时间

如果一个算法的时间 T(n) 没有任何多项式上界,则称这个算法具有超越多项式时间。在这种情况下,对于所有常数 c 我们都有 T(n) = ω(nc),其中 n 是输入参数,通常是输入的数据量(比特数)。指数时间显然属于超越多项式时间,但是有些算法仅仅是很弱的超越多项式算法。例如,Adleman-Pomerance-Rumely 质数测试对于 n 比特的输入需要运行 nO(log log n) 时间;对于足够大的 n,这时间比任何多项式都快;但是输入要大得不切实际,时间才能真正超过低阶的多项式。

准多项式时间

与NP完全问题的关系

第一定义

第二定义

指数时间假设

指数时间

双重指数时间

参见

  • L-notation

参考资料

  1. ^ Mehlhorn, Kurt; Naher, Stefan. Bounded ordered dictionaries in O(log log N) time and O(n) space. Information Processing Letters. 1990, 35 (4): 183.doi:10.1016/0020-0190(90)90022-P.
  2. ^ 引用错误:没有为名为bpp的参考文献提供内容
  3. ^ Bradford, Phillip G.; Rawlins, Gregory J. E.; Shannon, Gregory E. Efficient Matrix Chain Ordering in Polylog Time. SIAM Journal on Computing (Philadelphia: Society for Industrial and Applied Mathematics). 1998, 27 (2): 466–490.doi:10.1137/S0097539794270698. ISSN 1095-7111.
  4. ^ Kumar, Ravi; Rubinfeld, Ronitt. Sublinear time algorithms (PDF). SIGACT News. 2003, 34 (4): 57–67.

0 0
原创粉丝点击