php 时间复杂度计算,时间复杂度

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

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

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

==常数时间==

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

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

==对数时间==

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

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

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

递归地将字符串砍半并且输出是这个类别函数的一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。

这意味着,如果我们想增加输出的次数,我们需要将字符串长度加倍。

==幂对数时间==

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

==次线性时间==

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

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

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

==线性时间==

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

===复杂度类===

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

* P (复杂度):包含可以使用确定型图灵机在多项式时间内解决的决定性问题。

* NP (复杂度):包含可以使用非确定型图灵机在多项式时间内解决的决定性问题。

* ZPP (复杂度):包含可以使用概率图灵机在多项式时间内零错误解决的决定性问题。

* RP (复杂度):包含可以使用概率图灵机在多项式时间内解决的决定性问题,但它给出的两种答案中(是或否)只有一种答案是一定正确的,另一种则有几率不正确。

* BPP (复杂度):包含可以使用概率图灵机在多项式时间内解决的决定性问题,它给出的答案有错误的概率在某个小于 0.5 的常数之内。

* BQP (复杂度):包含可以使用量子图灵机在多项式时间内解决的决定性问题,它给出的答案有错误的概率在某个小于 0.5 的常数之内。

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

====指数时间假设====

Exponential time hypothesis

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值