算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。
计算机的资源,最重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性之分。
不言而喻,对于任意给定的问题,设计出复杂性尽可能低的或手算法是我们在设计算法时追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。
简言之,在算法学习过程中,我们必须首先学会对算法的分析,以确定或判断算法的优劣。
1.时间复杂性:
例1:设一程序段如下(为讨论方便,每行前加一行号)
(1) for i:=1 to n do
(2) for j:=1 to n do
(3) x:=x+1
......
试问在程序运行中各步执行的次数各为多少?
解答:
行号 次数(频度)
(1) n+1
(2) n*(n+1)
(3) n*n
可见,这段程序总的执行次数是:f(n)=2n2+2n+1。在这里,n可以表示问题的规模,当n趋向无穷大时,如果 f(n)的值很小,则算法优。作历差为初学者,我们可以用f(n)的数量级O来粗略地判断算法的时间复杂性,如上例中的时间复杂性可粗略地表示为T(n)=O(n2)。
2.空间复杂性:
例2:将一一维数组的数据(n个)逆序存放到原数组中,下面是实现该问题的两种算法:
算法1:for i:=1 to n do
b[i]:=a[n-i+1]
for i:=1 to n do
a[i]:=b[i]
算法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
算法1的时间复杂度为2n,空间复杂度为2n
算衫烂嫌法2的时间复杂度为3*n/2,空间复杂度为n+1
显然算法2比算法1优,7a64e78988e69d8331333262383561这两种算法的空间复杂度可粗略地表示为S(n)=O(n)
信息学比赛中,经常是:只要不超过内存,尽可能用空间换时间。
从代码行数估算测试用例数并不是一个精确的过程,因为代码行数和测试用例数之间并没有明确的定量关系。但是,可以通过以下几个因素来估算测试用例数:
功能点数量:首先,你需要确定应用程序中包含的举坦功能点数量。如果你已经知道了这个数量,那么你可以根据每个功正灶桐能点需要测试的不同方面,估算出每个功能点需要的测试用例数。
模块数量:如果你已经将代码分成了不同的模块,那么可以根据每个模块需要测试的不同方面,估算出每个模块需要的测试用例数。
代码复杂度:代码的复杂度越高,就需要更多的测试用例来覆盖各种情况。你可以使用代码复杂度度量工具(如Cyclomatic Complexity)来估算代码复杂度,然后根据复杂度来估算测试用例数。
代码覆盖率要求:如果你有一个特定的代码覆盖率要求(如语句覆盖率或分支覆盖率),那么你需要编写足够的测试用例来达到这个要求。
总之,要从代码行数估算测试用例数,需要考虑多个因素,包括功能点数量、模块数量、代码复杂度和代码覆盖率要求等,以获得更准确的估算。辩巧
一般来说,圈复杂度大于10的方法存在很大的出错风险。
在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,即合理笑高的预防错误所需测试的最少路径条数。
圈复杂度大说明程键悄序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系。
圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。
如果一段源码中不包含控制流语句(条件或决策点),那么这段代码的圈复杂度为1,因为这段代码中只会有一条路径。
如果一段代码中仅包含一个if语句,且if语句仅有一个条件,那么这段代码的圈复杂度为2;包含两个嵌套的if语句,或是一个if语句有两个条件的代码块的圈复杂度为3。
计算公式:V(G)=e-n+2p。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量,p图的连接组件数目(图的组件数是相连节点的最稿升渣大集合)。因为控制流图都是连通的,所以p为1。
对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)