数据结构-时间复杂度(C语言)

一、什么是时间复杂度

时间复杂度:又称时间效率,指的是程序执行的次数,用“大O渐进表示法”表示(注意不是运行程序所花的时间!)

大O渐进表示法:O(),()内放程序执行的次数,常见表示有:O(1),O(N),O(N+M),O(N^2),O(logN)

推导大O阶方法:

  1. 用常数1代表执行了常数次(ps:常数指的是有具体法阿拉伯数字)
  2. 当执行次数有表达式时,只保留最高阶项
  3. 如果最高阶存在且不是1,则去除与这个最高阶项相乘的常数,得到的结果就是大O阶。

二、如何计算常见的时间复杂度?

//大O的渐进表示法
//请计算一下Func1基本操作执行了多少次?
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++j) 
		count++;
		
	}

	for(int k=0;k<2N;++k)
		count++;
	int M = 10;
	while (M--) 
	{
		count++;
	}
}

解:第一个for中内嵌了一个for,所以这里的基本操作++count被执行了N*N次;第三个for中的基本操作++count被执行了2N次;最后一个while循环中,由于M=10,当M--不等于0时执行count++,所以这里的基本操作执行了10次。所以一共执行次数是N^2+2N+10次。

Func1执行的基本操作次数:

F(N)=N^2+2N+10 

F(10)=130

F(100)=10210

F(1000)=1002010

由此我们可以看到,随着N的增大,这个表达是中,N^2对结果的影响是最大的,因此Func1的时间复杂度是O(N^2)

注意!时间复杂度是个估值!是去看表达式中影响最大的那一项

//计算Func2的时间复杂度
void Func2(int N) {
	int count = 0;

	for (int k = 0; k < 2*N; ++k)
		count++;

	int M = 10;
	while (M--)
	{
		count++;
	}
}

解:由上一条解析可知,该函数基本操作的执行次数表达式为2*N+10,最高次项为2*N,去除系数,得该函数时间复杂度为O(N)。

//计算Func3的时间复杂度
void Func3(int M,int N)
{

	int count = 0;
	for (int i = 0; i < M; i++)
		count++;

	for (int j = 0; j < N; j++)
		count++;
	printf("%d\n", count);
}

解:由于不知道M和N的具体大小,无法判断哪一项对空间复杂度的影响更大,因此时间复杂度为O(N+M)。若题目说N远大于M,则为O(N);若题目说N和M接近,则表达式M+N可以写成2*N或2*M,因此时间复杂度为O(M)或O(N)。

//计算Func4的空间复杂度
void Func4(int N)
{

	int count = 0;

	for (int j = 0; j < 100; j++)
		count++;
	printf("%d\n", count);
}

解:由于该函数的基本操作count++执行了100次(具体的阿拉伯数字or常数次)因此时间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值