1.4 算法性能评价

1.4 算法性能评价

有了解决问题的算法,如何评价解决同一问题不同算法的性能优劣?
其标准涉及算法的执行时间占用空间两个方面。
性能评价】应是问题规模的函数,以刻画表征问题规模的大小。
问题规模】对于不同的问题其含义不同:
如矩阵的阶、多项式的项数、图的顶点数、集合的个数等,是反映问题大小的本质数目。

【时间数量关系的计算方法】

算法实际执行时间与机器硬件和软件环境相关(比如两个机器的性能指标不同,就不便比较算法执行的快慢),舍弃机器环境差异影响,语句执行时间本质就是语句执行次数,与机器环境无关。

因此算法的执行时间就是算法所有语句的执行次数之和。
例如:求两个 n 阶方阵的乘积 c=a×b。

#define n 100 /* n 可根据需要定义,这里假定为 100*/
void MatrixMulti(int a[n][n]int b [n][n]int c[n][n])
                                     该算法每一语句的语句频度为
(1) for(i=0;i< n;i++)                     n+1
(2) for (j=0;j<n;j++n(n+1)
(3) { c[i][j]=0;(4) for (k=0;k< n; k++)(n+1)
        c[i][j]=c[i][j]+a[i][k]*b[k][j];}
}

分析
语句(1)的循环控制变量 i 从 0 增加到 n,测试到 i=n 成立才会终止,故它
的频度是 n+1,但是它的循环体却只能执行 n 次。

语句(2)作为语句(1)循环体内的语句应该执行 n 次,但语句(2)本身要执行 n+1 次,所以语句(2)的频度是 n(n+1)。

同理可得语句(3),(4)和(5)的频度分别是 n2,n2(n+1)和 n3。
该算法中所有语句的频度之和(即算法的时间耗费)为:f(n)=2n3+3n2+2n+1
该算法的时间耗费是矩阵阶数 n 的函数。

【算法的时间复杂度T(n)】

一个算法的时间复杂度T(n)是该算法的时间度量,计作:
T(n)=O(f(n))
它表示随问题规模 n 的增大,算法的执行时间的增长率和 f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

【常用算法时间复杂度】

数据结构中常用的时间复杂度频率计数有 7 个:

  • O(1) 常数型
  • O(n)线性型
  • O(n²)平方型
  • O(n³)立方型
  • O(2n)指数型
  • O(log2n)对数型
  • O(nlog2n)二维型

按时间复杂度由小到大递增排列成表 1-3(当 n 充分大时)。
不同数量级的时间复杂度的形状如图 1.6 所示,表 1-3 与图 1.6 是同一问题的不同表示形式。一般情况下,随 n 的增大,T(n)的增长较慢的算法为最优的算法。从中我们应该选择使用多项式阶 O(nk)的算法,而避免使用指数阶的算法。
在这里插入图片描述

由图 1.8 可知,随着问题规模 n 的增大,
算法 A 所耗费的时间 O(log2n)的增大
趋于平缓,算法 B 所耗费的时间复杂度
迅速增大。显然在同一个问题解决方案
中,算法 A 的运行效率高,可认为算
法 A 优于算法 B。
在这里插入图片描述

数据结构常用时间复杂度有 7 种,分析按大小排列的频度表,前 3 种增加速度
平缓,后 3 种增加速度过快,随着 N 的增大实现困难。

【最坏时间复杂度】

是指执行基本操作的最大次数。基本操作时指算法中基本运算的操作。

例如,在数值 A[0…n-1]中查找给定值 K 的算法大致如下:

(1)i=n-1;
(2)while(i>=0&&(A[i]!=k))
(3) i--;
(4)return i;

给出算法分析:查找成功时,最坏情况是从 A 中最后一直找到第一个元素,共查找 n 次,最好情况是最后一个元素就是 K,只查找一次查找失败会查 n+1 次,查完都找不到因此算法最坏时间复杂度就取了最多次数上界为 0(n)

【算法的空间性能分析】

类似于时间复杂度的讨论,一个算法的空间复杂度 S(n)定义为该算法所耗费的存储空间的数量级,它也是问题规模 n 的函数。记做:
S(n)=O(f (n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据以外,还需要一些对数据进行操作的辅助存储空间。其中对于输入数据所占的具体存储量只取决于问题本身,与算法无关,这样我们只需要分析该算法在实现时所需要的辅助空间单元个数就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数,则称这个算法为原地工作,辅助空间为O(1)。

例如,将一维数组 a 中的 n 个数据逆序存放到原数组中,下面是实现该问题的两
种算法:
算法 1:

for (i=0;<n;i++)
b[i]=a[n-i-1];
for (i=0;<n;i++)
a[i]=b[i];

算法 2:

 for (i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}

算法 1 的空间复杂度为 O(n),需要一个大小为 n 的数组 b。
算法 2 的空间复杂度为 O(1),需要一个变量 t,与问题规模没有关系。
算法的时间复杂度和空间复杂度合称为算法的复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值