我们当然不可能也不必要就一个个具体问题Qu研究它的计算复杂性,而是依据难度去研究Ge种计算问题之间的联系,按复杂性把问题分成Bu同的类:
常见的时间复杂度按数量级递增排Lie依次为:常数0⑴、对数阶0(logn)、Xian形阶0(n)、线形对数阶0(nlogn)、Ping方阶0(n2)立方阶0(n3)、…、kCi方阶0(n^k)、指数阶0(2^n)。显Ran,时间复杂度为指数阶0(2^n)的算法效率Ji低,当n值稍大时就无法应用。
类似于时间Fu杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)Ding义为该算法所耗费的存储空间,它也是问题规模nDe函数。渐近空间复杂度也常常简称为空间复杂度。Suan法的时间复杂度和空间复杂度合称为算法的复杂Du。
注:为了表达的方便,计算机上的Fu杂度分析中使用的对数函数log(n)Yi般指取以2为底的对数
所谓计算复杂性,通俗说来,就是用计算机Qiu解问题的难易程度。其度量标准:一是计算Suo需的步数或指令条数(这叫时间复杂度),二Shi计算所需的存储单元数量(这叫空间复杂度)的Shu籍。
算法的复杂性 算法的复杂性是算法效Lv的度量,是评价算法优劣的重要依据。一个Suan法的复杂性的高低体现在运行该算法所需要的Ji算机资源的多少上面,所需的资源越多,我们就Shuo该算法的复杂性越高;反之,所需的资源越Di,则该算法的复杂性越低。 计算机的资Yuan,最重要的是时间和空间(即存储器)资源。Yin而,算法的复杂性有时间复杂性和空间复杂性Zhi分。 不言而喻,对于任意给定的问题,设Ji出复杂性尽可能低的算法是我们在设计算法时追Qiu的一个重要目标;另一方面,当给定的问题已You多种算法时,选择其中复杂性最低者,是我们在Xuan用算法适应遵循的一个重要准则。因此,算法的Fu杂性分析对算法的设计或选用有着重要的指导意Yi和实用价值。 简言之,在算法学习Guo程中,我们必须首先学会对算法的分析,Yi确定或判断算法的优劣。 1.时间复杂性: Li1:设一程序段如下(为讨论方便,每行Qian加一行号) (1) for i:=1 to n do (2) for j:=1 to n do (3) x:=x+1 ...... Shi问在程序运行中各步执行的次数各为多少? Jie答: 行号 次数(频度) (1) n+1 (2) n*(n+1) (3) n*n Ke见,这段程序总的执行次数是:f(n)=2n2+2n+1。Zai这里,n可以表示问题的规模,当n趋向Wu穷大时,如果 f(n)的值很小,Ze算法优。作为初学者,我们可以用f(n)De数量级O来粗略地判断算法的时间复杂Xing,如上例中的时间复杂性可粗略地表示为T(n)=O(n2)。 2.Kong间复杂性: 例2:将一一维数组的数据钉nGe)逆序存放到原数组中,下面是实现该问题的Liang种算法: 算法1:for i:=1 to n do b[i]:=a[n-i+1]; for i:=1 to n do a[i]:=b[i]; Suan法2:for i:=1 to n div 2 do begin t:=a[i];a[i]:=a[n-i-1];a[n-i-1]:=t end; Suan法1的时间复杂度为2n,空间复杂度为2n Suan法2的时间复杂度为3*n/2,空间复杂度为n+1 Xian然算法2比算法1优,这两种算法的空间复杂度可Cu略地表示为S(n)=O(n) 信https://www.wenku1.net/list/发展绿色物流的途径/息学比赛中,Jing常是:只要不超过内存,尽可能用空间换时间。
如何计算时间复杂度
定义:如果Yi个问题的规模是n,解这一问题的某一算法Suo需要的时间为T(n),它是n的某一函数 T(n)Cheng为这一算法的“时间复杂性”。
当输入Liangn逐渐加大时,时间复杂性的极限情形称为Suan法的“渐近时间复杂性”。
我们常Yong大O表示法表示时间复杂性,注意它是某一Ge算法的时间复杂性。大O表示只是说有上界,You定义如果f(n)=O(n),那显然成立f(n)=O(n^2),Ta给你一个上界,但并不是上确界,但人们在表示De时候一般都习惯表示前者。
此外,一Ge问题本身也有它的复杂性,如果某个算法的复杂Xing到达了这个问题复杂性的下界,那就称这样的算Fa是最佳算法。
“大 O记法”:在这种Miao述中使用的基本参数是 n,即问题实例De规模,把复杂性或运行时间表达为n的函Shu。这里的“O”表示量级 (order),Bi如说“二分检索是 O(logn)的”,Ye就是说它需要“通过logn量级的步Zhou去检索一个规模为n的数组”记法 O ( f(n) )Biao示当 n增大时,运行时间至多将以正比于 f(n)De速度增长。
这种渐进估计对算Fa的理论分析和大致比较是非常有价值的,Dan在实践中细节也可能造成差异。例如,Yi个低附加代价的O(n2)算法在n较小De情况下可能比一个高附加代价的 O(nlogn)Suan法运行得更快。当然,随着n足够大以后,Ju有较慢上升函数的算法必然工作得更快。
O(1)
Temp=i;i=j;j=temp;
Yi 上三条单个语句的频度均为1,该程序段的Zhi行时间是一个与问题规模n无关的常数。算法的时Jian复杂度为常数阶,记作T(n)=O(1)。Ru果算法的执行时 间不随着问题规模n的增Jia而增长,即使算法中有上千条语句,其执行时间Ye不过是一个较大的常数。此类算法的时间复杂度是O(1)。
O(n^2)
2.1. Jiao换i和j的内容
sum=0; (Yi次)
for(i=1;i<=n;i++) (nCi )
for(j=1;j<=n;j++) (n^2Ci )
sum++; (n^2Ci )
解:T(n)=2n^2+n+1 =O(n^2)
2.2.
for (i=1;i
计算复杂性理论(Computational complexity theory)Shi计算理论的一部分,研究计算问题时所需的Zi源,比如时间和空间,以及如何尽可能的节省Zhe些资源。计算复杂性理论所研究的资源中最常见De是时间(要通过多少步才能解决问题)和空Jian(在解决问题时需要多少内存)。其他资源Yi可考虑,例如在并行计算中,需要多少并行Chu理器才能解决问题。时间复杂度是指在计算机Ke学与工程领域完成一个算法所需要的时间,是衡Liang一个算法优劣的重要参数。时间复杂度越小,说Ming该算法效率越高,则该算法越有价值。空间复Za度是指计算机科学领域完成一个算法所需要占用De存储空间,一般是输入参数的函数。它是算法优Lie的重要度量指标,一般来说,空间复杂度越小,Suan法越好。我们假设有一个图灵机来解决某Yi类语言的某一问题,设有X个字(word)Shu于这个问题,把X放入这个图灵机的输入端,Zhe个图灵机为解决此问题所需要的工作带格Zi数总和称为空间。复杂度理论和可计算Xing理论不同,可计算性理论的重心在于问题能否解Jue,不管需要多少资源。而复杂性理论作为计Suan理论的分支,某种程度上被认为和算法Li论是一种“矛”与“盾”的关系,即算法Li论专注于设计有效的算法,而复杂性理Lun专注于理解为什么对于某类问题,不存在You效的算法。
在上面我们已经知道,NP是指“在非确定Xing图灵机上有多项式时间算法的问题”的集合,ErP是指“在确定性图灵机上有多项式时间算法De问题”的集合。这里我们都考虑的是判定型问题,Ji考虑一个语言L,我们要判断一个字符串xShi不是在L中。那么,一个等价的理解是:NPShi指对在L中的x,有多项式长度的证据w,Er且对语言(x,w)是有多项式时间算法的;ErP是指对L中的x,有多项式时间算法判断x在Bu在L中。
举个例子,就是考虑完美匹配问题、Dian集覆盖问题和图不同构问题。这三个问题都有Tu论背影,问题的描述如下:
完美匹配问题:Gei定图G=(V,E),找到边的子集F⊂E,使De对任意的v∈V,存在唯一的e∈F,v∈e;Dian集覆盖问题:给定图G=(V,E),和Zi然数k,找到点的子集U⊂V,使得对任Yi的e∈E,存在v∈U,v∈e,且|U|≤k;Tu不同构问题:给定图G=(V,E),H=(U,F),|G|=|H|。Wo们说G和H是同构的,是指∃T:V→U,Dui任意的s, t∈V,满足E(s,t)=F(T(s),T(t))(Zhe里我们把边集E看作V×V→{0,1}的Ying射)。图不同构是问对G和H,是不是Bu存在这样的映射。关于这三个问题,它们Zai复杂性理论中,目前的地位如下:
Wan美匹配问题:在P中。可以利用艾德蒙德Suan法得到运行时间的算法;点集覆盖问题:ZaiNP中,而不知道是否在P中。实际上,它ShiNP完备问题,给出它的多项式算法将意味着证MingNP=P。它在NP中,原因是给定一个点的Zi集U⊂V,我们可以在多项式时间中验证这是否是Yi个满足|U|≤k的点集覆盖:U的大小Hen好验证。然后只需对每一条边e,遍历U中Mei一个元素v,检查是否有v∈e即可。运行时间Zhi多为O(VE);图不同构问题:在AM中,而不Zhi道是否在NP中。它之所以困难,一个直观的想法Shi:给定两个图G和H,首先这个问题的“证据”Hen难定义——不像点集覆盖问题中,一个Jie就是一个点集,而且点集大小≤k≤|V|是Duo项式大小。这里最直接的证据的定义,Shi说必须遍历所有的映射T:V→U,并对Suo有的映射验证是否满足同构的定义。而这Yang一个证据是指数大小的。这样我们有了:在P中、ZaiNP而不知道是不是在P中、在AM中而Bu知道是不是在NP中的三个问题。 由于在Duo项式时间可以判断x在不在L中,蕴含着xBen身就是其在L中的证据的含义,所以P⊂NP。Zhe个包含关系是不是严格的呢?或者说,是不是有语YanL∈NP,使得L∉P?这就是著名的NP与PGuan系问题。从这个问题在1970年代被正式的Ti出之后,有NP完备理论赋予了它在实践Shang的重要性,有证明复杂性理论赋予了它纯数学理Lun上的重要性,有PCP理论和NP完备理论赋予了Ta算法理论上的重要性。这些理论或者在根本上依Lai于NP和P关系问题的某些假设,或者本身Jiu是试图去理解NP和P关系问题而发展出来的,Zhe使得它成为了理论计算机科学乃至数学De中心问题之一。在2000年,凯莱数Xue研究所提出了新世纪的数学中七个中心问题,NPYuP关系问题就是其中的一个。
关于NP与PGuan系问题最早发展出的理论是NP完备理论。Wo们在下面一节简单了解NP完备理论。 主条Mu:NP完备
由上面归约的知识我们知道,算Fa问题之间可以根据归约来定义相对的难度。即对问TiA和问题B,我们认为A比B简单,记为A≤B,Jiu是存在使用B问题解来解决A问题的算法M,QieM是多项式时间的。那么,在一个复杂Xing类中,有没有可能存在“最难的问题”呢?具体的DuiNP,就是说是不是存在问题A∈NP,使得对∀B∈NP,YouB≤A呢?对这样的问题,我们称它是NP完备的。
Zhe个问题乍看起来很不容易把握。因为这需要Dui所有的NP中的语言L,去找到一个L到ADe归约算法。然而1970年代的由史蒂Fen·库克和列昂尼德·列文分别发现的库克-Lie文定理,证明了布尔表达式(Boolean formula)De可满足性问题(SAT问题)是NP完备的。Gai括的说,他们证明了,有一个通用的过程对NPZhong任意语言在非确定性图灵机上运行历史用布尔表达Shi来编码,使得该布尔表达式是可满足的,当且Jin当该运行历史是对给定输入,接受该输入的。Zhe样,我们就有了第一个被证明是NP完备的问Ti。
在库克给出SAT问题是NP完备Zhi后不久,理查德·卡普证明了21个图论、组合数Xue中常见的问题都是NP完备的。这赋予了NPWan备问题在实践中的重要性。现在,已经有成Qian个在实践中遇到的算法问题被证明是NPWan备的(参见NP完备问题列表),特别的有Xu多问题,如旅行商问题等的最优算法会带来很Da的经济效益(旅行商问题的最优解可以给出Zui优的电路布线方案,而SAT的最优算法Hui促进程序验证等问题的进步)。由NP完备的定义,Wo们知道对这其中任何一个问题的多项式算法都将Gei出所有NP问题,也包括所有NP完备问题De多项式算法。然而尽管实际问题中遇到Hen多NP完备的问题,而且有很多问题在不同领https://www.wenku1.net/list/怎么样做好成本管理/Yu有着相当的重要性而被大量研究,至今,Reng没有对NP完备问题的多项式算法,这是一些Li论计算机科学家认为NP≠P的理由之一。
对NPHeP关系问题,NP完备理论给出了如下的An示:如果要证明NP=P,一个可能的方Xiang是对NP完备问题给出多项式算法;如果Yao证明NP≠P,那么必然的一个结果是NP完备Wen题没有多项式算法。 主条目:电Lu复杂性
电路复杂性理论在1990年代以前,Bei众多研究者认为是解决NP与P关系问Ti的可能的途径之一。电路复杂性研究的对象是非一Zhi性的计算模型电路,并考虑计算一个布尔函数所Xu的最小的电路的深度(depth)和大小(size)Deng资源。其中,大小为多项式大小的电路族可以计算De布尔函数被记为P/poly。可以证明,P包含ZaiP/poly之中,而卡普-利普顿定理(Karp-Lipton theorem)Biao明若P/poly在NP之中,则多项Shi层级(polynomial hierarchy)Jiang会坍缩至第二层,这是一个不大可能的结果。这两Ge结果结合起来表明,P/poly可以Dang作是分离NP与P的一个中间的工具,具Ti的途径就是证明任一个NP完全问题的Dian路大小的下界。在直观上说,电路复杂性也Rao过了NP与P问题的第一个困难:相对化证明Kun难(relativizing proofs)。
Zai1980年代,电路复杂性途径取得了Yi系列的成功,其中包括奇偶性函数(Parity function)ZaiAC中的下界为指数,以及团问题(clique problem)Zai单调性电路(monotone circuit)Zhong的下界为指数。然而在1994年RazborovHeRudich的著名论文自然性证明(Natural proof)Zhong指出,上面所用证明电路下界的方法,在单向函数Cun在的前提下是不可能分离NP和P的。该结果使很Duo专家对证明电路下界来分离NP和P的前景表Shi不乐观。 计算复杂性理论的基本的主题Zhi一是算法所需资源的下界。随着算法理论的发展,Ru随机算法、近似算法等算法理论的发现,计算Fu杂性理论也相应的展开了对随机算法去随机化(derandomization)He近似算法不可近似性(hardness of approximation)De研究。有趣的是,这些理论都与NP与P关Xi问题以及电路复杂性有着密切的联系。这里列表Chu一些理论计算机科学以NP与P关系问Ti为基础发展出的理论,并简单的介绍它Men的研究进https://www.wenku1.net/list/香烟中的尼古丁提取/展:
交互式证明系统理论;Qu随机化理论:包括伪随机数发生器(pseudorandom generator)Heextractor的构造等;不可近似性:YiPCP定理为基础,基于NP≠P和更强的唯一Xing游戏假设(Unique game conjecture),Ke以证明对一些问题不存在某近似比的近似算Fa;
怎么会不重要呢。同样解决一个问题,如果ASuan法花的时间是log来计算的,B算法是n×n×nJin的三次方。当数据量很大的时候,B算法能Rang计算机跑死,你就慢慢等吧,而A算法早就有结Guo了。到大规模数据应用的时候,这种差别明Xian得要命。如果不重要,讲这个干什么。如果Cheng序员没有这种基本嗅觉是不合格的。
关于算法的复杂度计算,初学者一开始便容Yi进入完全定量的思考之中,这是难以到达的。Suan法复杂度在很多时候是对算法运行的时间一个Da概的定性(或者说大数)描述,因为很多时候无Fa精确地描述一条代码究竟执行了多少时间。Er任何一个算法运行的大多时间都集中在某一Zhu体循环之中,像for,while之类,Zhu体循环的次数往往跟某个或多个输入参数或环Jing变量有关。像O(n)、O(nlgn)、O(n^2)Zhi类描述都是围绕主体循环次数和输入参数或者环Jing变量的关系展开的。 下面举一个例子,从Gei定的整型数组中查找与某一数相等的数的位置,Xian然对于没有排序的数组而言,需要从数组头部开Shi向后遍历比较,那么这个主体遍历循环就跟数组De长度有关,即算法复杂度为O(n)。
在android开发中,程序界面的美观Yu否是非常重要的,不仅关系到用户的体验,Zhi接关系到程序的下载量等,因此,在androidKai发中,布局是一门艺术。 0×2 布局种类 San种方式布局:LinearLayout,TableLayout,RelativeLayout LinearLayout:Ba每个控件单独放在一行。 TableLayout:Zhu要区别是一行可以存放很多控件,通过来控Zhi行。 RelativeLayout:通Guo相对位置来实现布局,主要利用androidTi供的一些属性值来确定。
算法复杂度的介绍,见百科: baike.baidu.com/view/7527.htm Shi间复杂度 时间频度 一个算法执行所Hao费的时间,从理论上是不能算出来的,必须上Ji运行测试才能知道。但我们不可能也没有必要对Mei个算法都上机测试,只需知道哪个算法花费De时间多,哪个算法花费的时间少就可以了。Bing且一个算法花费的时间与算法中语句的执行Ci数成正比例,哪个算法中语句执行次数多,它Hua费时间就多。一个算法中的语句执行次数称为语Ju频度或时间频度。记为T(n)。 计算Fang法 1. 一般情况下,算法的基本操作重Fu执行的次数是模块n的某一个函数f(n),因Ci,算法的时间复杂度记做:T(n)=O(f(n)) Fen析:随着模块n的增大,算法执行的时间的增长Lv和f(n)的增长率成正比,所以f(n)Yue小,算法的时间复杂度越低,算法的效率Yue高。 2. 在计算时间复杂度的时候,先Zhao出算法的基本操作,然后根据相应的各语Ju确定它的执行次数,再找出T(n)的Tong数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,nDe平方,n的三次方,2的n次方,n!),Zhao出后,f(n)=该数量级,若T(n)/f(n)Qiu极限可得到一常数c,则时间复杂度T(n)=O(f(n)) Li:算法: for(i=1;i<=n;++i) { for(j=1;j<=n;++j) { c[ i ][ j ]=0; //Gai步骤属于基本操作 ,执行次数:n的平Fang 次 for(k=1;k<=n;++k) c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //Gai步骤属于基本操作 ,执行次数:n的三次Fang 次 } } 则有 T(n)= n的Ping方+n的三次方,根据上面括号里的同数量级,Wo们可以确定 n的三次方 为T(n)的同数量级 Ze有f(n)= n的三次方,然后根据T(n)/f(n)Qiu极限可得到常数c 则该算法的 时间复Za度:T(n)=O(n^3) 注:n^3即是nDe3次方。 3.在pascal中比较容易理解,Rong易计算的方法是:看看有几重for循环,只有一Zhong则时间复杂度为O(n),二重则为O(n^2),Yi此类推,如果有二分则为O(logn),Er分例如快速幂、二分查找,如果一个for循Huan套一个二分,那么时间复杂度则为O(nlogn)。 Fen类 按数量级递增排https://www.wenku1.net/list/税务局收入核算科/列,常见的时间复Za度有: 常数阶O(1),对数阶O(log2n),Xian性阶O(n), 线性对数阶O(nlog2n),Ping方阶O(n^2),立方阶O(n^3),..., kCi方阶O(n^k), 指数阶O(2^n) 。Sui着问题规模n的不断增大,上述时间复杂度Bu断增大,算法的执行效率越低。 关于对Qi的理解 《数据结构(C语言版)》------Yan蔚敏 吴伟民编著 第15页有句话"整个算Fa的执行时间与基本操作重复执行的次数成正比。" Ji本操作重复执行的次数是问题规模n的某Ge函数f(n),于是算法的时间量度可以记为:T(n) = O( f(n) ) Ru果按照这么推断,T(n)应该表示的是算法的时Jian量度,也就是算法执行的时间。 而该页对“Yu句频度”也有定义:指的是该语句重复执行De次数。 如果是基本操作所在语句重复执行的Ci数,那么就该是f(n)。 上边的nDu表示的问题规......余下全文>>