第五课:算法的时间复杂度

本文学习自 狄泰软件学院 唐佐林老师的 数据结构课程


问题:我们已经有了估算算法复杂性的方法,那么如何用符号定性的判断算法的效率呢?

算法复杂度的概念:算法的复杂度

  • 时间复杂度:算法运行后对时间需求量的定性描述
  • 空间复杂度:算法运行后对空间需求量的定性描述

注意:数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中于讨论算法的“时间复杂度”,但是使用的方法完全可以用于空间复杂度的判断

大O表示法

  • 算法效率严重依赖于操作(Operation)数量!!!0(n)
  • 操作数量的估算可以作为时间复杂度的估算
  • 在判断时首先关注操作数量的最高次项

如下表示同一数量级的操作数量

O(5) = O(1)
O(2n+1) = O(2n) = (n)
O(n*n+n+1) = O(n*n)
O(3n*n*n+1) = O(3n*n*n) = O(n*n*n)

常见的时间复杂度:

线性阶时间复杂度:O(n)
	for(int i=0; i<n; i++){
		//复杂度为O(1)的程序语句
	}
	循环次数:n

对数阶时间复杂度:O(log n)
	int i=1;
	while(i < n){
		//复杂度为O(1)的程序语句
		i*=2;
	}
	循环次数:log(2)(n)

平方阶时间复杂度:O(n*n)
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++){
			//复杂度为O(1)的程序语句
		}		
	}
	循环次数:n*n

时间复杂度计算练习举例:

练习 1

	for(int i=0; i<n; i++){
		for(int j=i; j<n; j++){
			//复杂度为O(1)的程序语句
		}
	}
	当 i=0,做了n次操作
	当 i=1,做了n-1次操作
	当 i=2,做了n-2次操作
	...
	最终作了 n+(n-1)+(n-2)+(n-3)+....1 = (n*(n+1))/2,所以时间复杂度是  O(n*n)

练习2

void func1(int n)
{
	int i=0;
	while(i<n){ //此处 while 每次执行都需要操作n+1次,所以执行n次的操作数量为:(n+1)*n,所以时间复杂度为 :O(n*n+n) = O(n*n)
		m(n);//由操作数量(n)计算可知,此处需要操作 n次
		i++; //操作1次
	}
}

void m(int n)
{
	int i=0;
	while(i<n){{
		cout << i <<endl;
	}
}

小结:

  • 时间复杂度是算法运行时对时间的需求量
  • 大O表示法用于描述算法的时间复杂度
  • 大O表示法只关注操作数量的最高次项
  • 常见的时间复杂度为:线性阶,平方阶,对数阶
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值