Data structure--时间复杂度--空间复杂度

本文介绍了数据结构中关键的概念,如时间复杂度和空间复杂度,通过实例演示如何使用大O表示法分析算法效率,并讲解了常见代码复杂度计算方法,如双重循环、冒泡排序和二分查找。重点讲解了常数运算、动态内存分配和递归调用的复杂度评估。
摘要由CSDN通过智能技术生成

Data structure

对于数据结构这个科目我们主要是对于内存主要的理解,因为在的时候,计算加的内存很小,我们对于代码的效率也要提升,才能用更加高效的代码来执行程序.在这里就分为时间复杂度和空间复杂度两种.

时间复杂度

时间复杂度:算法整体操作的执行次数,就是算法的时间复杂度
对于时间复杂度的理解,我下面直接通过一个立体进行引入,否则光将知识点可能比较枯燥,不容易理解:
在这里插入图片描述
对于这里的运算情况,我们引入大O渐进表示法简单的说就是我们对于复杂度的运算没必要那么精细,只要计算大概的就可以了:就如同上面的这个F(N)我们会发现随着N值慢慢的变大,我们这里N^2的会指数倍增长,而后面的N10的影响会越来越小,所以我们制定了大O的运用规则:
1.用O(1)表示所有加法的常数运算(常数为1)
2.在修改后的运行次数只保留最高项
3.最高项存在,只保留最高项并且去掉最高项的系数
则,上面的例题就为O(N^2)

对于一个代码的运行,我们通常分为三次种,最好情况,最坏情况,和平均情况,我们运用的是最坏情况表示时间复杂度这样我们才能,让代码很少出现错误!!!
eg1:

这段代码们存在两个循环,且相互独立,则为O(M+N)

for (int k = 0; k < M; ++ k) {
 ++count; }
for (int k = 0; k < N ; ++ k) {
 ++count; }

eg2:冒泡排序:利用数学的方式可以计算出其F(N)=n(n+1)/2则为O(N^2)
eg3:二分查找:为O(lgN)底数为2

空间复杂度

空间复杂度同样适用于;大O运算法:

void BubbleSort(int* a, int n) {
	 assert(a);
 	 for (size_t end = n; end > 0; --end) {
	 int exchange = 0;
		 for (size_t i = 1; i < end; ++i) {
		 if (a[i-1] > a[i]){
 		 Swap(&a[i-1], &a[i]);
		 exchange = 1;
		 }
	 }
	 if (exchange == 0)
	 break;
	 }
}

第一个例题是使用了常数个额外的空间,没有进行开辟空间,所以为常数,得O(1)

long long* Fibonacci(size_t n) {
 	 if(n==0)
	 return NULL;
 
 	 long long * fibArray =
    (long long *)malloc((n+1) * sizeof(long long));
     fibArray[0] = 0;
     
     fibArray[1] = 1;for (int i = 2; i <= n ; ++i) {
     fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];
 }
 return fibArray ;
}

第二个进行了动态内存的申请,申请了N个,故为O(N)

long long Factorial(size_t N) {
	 return N < 2 ? N : Factorial(N-1)*N;  
}

第三个是进行了函数递归的调用,最坏的情况是执行了N次,这里并不像斐波那契数列是二叉树式调用,所以比较简单为O(N)

数据结构的复杂度计算能简单一点,只是对于代码的一些基本理解,多敲代码,一起加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值