def1:时间复杂度(计算复杂性)
设M是一个处处停机的DTM(确定性图灵机),定义函数(N是非负整数集合)。
=M在长度为n的输入上的最大运行步数,把此函数叫做M的时间复杂度。
(时间复杂度:是一个自变量为输入长度n,因变量是最大运行步数的函数。)
注:这里考虑的是最大运行步数,如果考虑的是平均运行步数则对应着“平均时间复杂度”
概念:输入长度与输入规模
以一个图G=来说,输入规模就是问题中的自然参数,这里指的是顶点数和边数。
而输入长度是指图灵机将输入对象编码成串的串的长度,所以输入长度会与编码有关。
1:将图以顶点表,边表形式编码(顶点本身一个集合,每条边用两个顶点表示)
n=|V|,m=|E|=
I|=O(|V|log|V|+|E|2log|V|) 每一个顶点二进制编码要log|v|,每条边用两个点表示
=O(nlogn+2mlogn)=O(
)
2:以邻接矩阵来表示,则输入长度:O()
一般而言:输入长度与输入规模是多项式相关的。
下面给出实例具体分析算法的时间复杂性。
识别:
①:采用单带图灵机
算法1:
="对于输入串w:
1):扫描一遍带,若在1的右边发现0则拒绝;(输入合法性)
2):若0和1都在带上则重复下一步;(这里通常是循环操作的条件)
3):扫描带子,删除一个1和一个0;
4):若所有的1删除后还有0,或所有0删除后还有1,就拒绝;否则,带子上没有0和1,接受。"
分析最大运行步数
第一次来回扫描输入合法性:2n
每次删除一个0和一个1,由于最多需要带子输入长度的一半n\2:n*n/2
最后检查带子是否剩0和1:n
采用大O记法:O(2n+n*n\2+n)=
算法2:
="对于输入串w:
1):扫描带,若在1右边发现0就拒绝;
2):若带上还有0和1就重复下一步;
3):扫描带,检查剩余的0和1的总数,若总数为奇数则拒绝;
4):再次扫描带,删除最开头的0然后隔一个删一个0,同样的删除第一个1然后隔一个删除一个1;
5):若带子上没有留下1和0,接受;否则拒绝。
"
![]()
如图,经过操作4,每次使得0和1的个数减半,要是0和1的个数一样多,2m(m表示带子目前0的个数)一定为偶数,所有有了判断3.
分析最大步数:
第一次合理性检查:O(n)
每次隔一个删0或1,长度减半,最多:
+1次,每次运行n,故:O(nlogn)
最后检查带子是否剩0和1:O(n)
总之:本算法的时间复杂度为:O(nlogn)
②多带图灵机
是有两个带子的多带图灵机。
=“对输入串w:
1):扫描带,在1右边发现0就拒绝;
2):扫描带1上的0把每个0复制到带2上,直到带一出现第一个1;
3):扫描带1上的1直到输入结尾,每次从带1上读到一个1就在带2上删除1个0,如果读完带1的1之前,已经删完了带2上所有的0,拒绝。
4):带2所有的0被删除则接收,否则拒绝。
”
这个方法很简单,把带1的0复制到呆上,然后带1每读一个1就删带2一个0,。
运行步数:
输入合法性检查为O(n),把带一的0复制到带二上为O(n),同时比较两个带子的1与0的匹配O(n),最后扫描剩不剩0:O(n). 本算法时间复杂度:O(n)线性时间
结论:模型的选择会影响时间复杂度的计算
时间复杂性类(一类能被O(t(n))判定的语言的集合)
如:
- 模型间的时间复杂度的关系
- 多带TM与单带TM:平方
- 非确定性NTM与确定性DTM:指数
TH1:设函数(由于输入至少为n,运行步数必须大于等于输入长度),则每个t(n)时间的多带TM都与某个
时间的单带TM等价。
证明思路:前文提过了,将单带图灵机分段来模拟多带图灵机,开始时,把多带图灵机各个带子内容复制到单带图灵,耗时:O(n),接下来多带图灵机一次操作,单带图灵机需要两步:1:扫描带子确定当前虚拟读写头位置。2:更新内容与读写头移动。故而模拟一次操作,单带图灵机最多耗费O(t(n))(每个带头都要右移空出一格最费时间)。由于多带图灵机的运行步数是t(n),所以单带图灵机要模拟t(n)次,即:
Def:非确定图灵机(NTM)而且必须是个判定机的时间复杂度:
函数f:NN,f(n):任何长度为n的输入上,N的所有计算分支的最大步长。
说白了:从所有可能分支中,选一个最长的运行步数,作为处处停机的NTM的时间复杂度。
TH2:设函数(由于输入至少为n,运行步数必须大于等于输入长度),则每个t(n)时间的单带NTM都与某个
时间的单带TM等价。
证明思路:每模拟一个分支需要O(t(n))时间,一共要模拟的分枝数相当于求树叶的个数,设结点最多b个子女,则t(n)长度的树最多:个叶子。故: