数据结构学习笔记——算法分析

算法分析方法:
时间复杂度
空间复杂度

一个算法是由控制结构(顺序,分支和循环)和原操作构成的。

void fun(int a[],int n)
{
	int i; ·······································(1for (i = 0;i < n; i++)························(2{	
		a[i] = 2*i;·······························(3}
	for (i = 0; i < n; i++)·······················(4{	
		printf("a[%d] = %d", i,a[i]);·············(5}
}

算法的运行时间取决于控制结构和原操作的综合效果,如果for循环循环次数很多,哪怕原操作很快,时间也会比较长,即使只有一个顺序结构,如果原操作比较多,那么时间也会比较长。
很显然,如果运行一次算法的过程中,如果原操作被执行的次数越少,那么算法运行的速度也会更快,反之,速度就会越慢。

**问题规模:**需要处理的数据的个数。
比如如果要对10个数由小到大排序,那么相关算法的问题规模就是10。

**频度:**原操作执行的次数。他是问题规模的函数,用T(n)表示。

算法执行时间大致等于原操作所需时间*T(n),也就是说执行时间与T(n)成正比,因此我们用T(n)表示算法的执行时间。

在这里插入图片描述
本题中的问题规模是n。
如果不考虑定义语句,那么需要操作的语句就是定义语句下面的三个语句。
语句1:从i = 0开始运行,知道i=n,判断不成立后才运行结束,所以语句1执行力n+1次。
语句2:语句2是语句1的循环体里面的内容,每当语句1的循环体运行一次的时候,它就从i = 0开始,知道i=n,它还会执行判断,然后才结束,那么语句1的循环体每运行一次,语句2就运行n+1次,要注意的是,语句1的循环体只运行n次(i = n-1的时候是最后一次)所以语句2运行了n(n+1)次。
语句3:语句3是语句2的循环体里面的内容,语句1的循环体每运行一次,语句2里面的循环体就运行n次,语句1的循环体一共运行n次,那么语句3就运行n^2次。

所以这个算法的原操作的次数T(n) = n+1+n(n+1)+n^2

时间复杂度:
算法分析不是用绝对时间比较,是用原操作的数量级来表示。
就是取T(n)的最高阶,也就是说上面例题的时间复杂度是O(n^2).
如果一个算法没有循环,或者是循环次数与问题规模无关,那么把这样的算法的时间复杂度记作O(1),称之为常数阶。

常用时间复杂度之间的关系:
在这里插入图片描述
简化的算法时间复杂度分析:
用原操作的执行次数来代替T(n),也就是说上面的那个题目的T(n) = n^2,时间复杂度 = O(n^2)。以后计算T(n)时,仅仅只考虑原操作的执行次数。

平均时间复杂度,最好、最坏时间复杂度:
一个算法有时候对输入的数据敏感,可能会出现不同的数据,算法的时间复杂度不同,那么假设所有输入实例的集合为D,I∈D,输入I的概率 = P(I),输入I的时间复杂度为T(I),那么这个算法的平均时间复杂度为
概率✖时间复杂度 ,然后求和。在这里插入图片描述

空间复杂度:
算法在运行过程中临时占用得到内存大小。

时间和空间复杂度具有矛盾性:
时间越少,空间就会越大。
时间越大,空间就会越小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值