大数据最全数据结构--时间复杂度和空间复杂_select from 时间复杂度(1),正式加入阿里巴巴

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

N = 10 F(N) = 100

N = 100 F(N) = 10000

N = 1000 F(N) = 1000000

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

另外有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x

最好情况:1次找到

最坏情况:N次找到

平均情况:N/2次找到

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

常见时间复杂度计算举例

例题1

void Func2(int N){
    int count = 0; 
	for (int k = 0; k < 2 * N; ++k)
	 {       
		 ++count; 
	 }   
	int M = 10; 
	while (M--)
	{     
		++count;  
	}
	printf("%d\n", count); 
}

计算次数时间复杂度函数式:2*N+10

时间复杂度:O(N)

对于一个极大的数来说,乘一个常数与加一个常数都不能改变他的量级。比如一个亿万富翁,给他加几万或者在翻一倍,他变了好像又没有变,他还是亿万富翁。

例题2

void Func3(int N, int M){
	int count = 0; 
	for (int k = 0; k < M; ++k)
	{
		++count; 
	}
	for (int k = 0; k < N; ++k)
	{
		++count; 
	}
	printf("%d\n", count); 
}

时间复杂度:O(N+M)

如果M远大于N ,时间复杂度:0(M);  N远大于M ,时间复杂度:O(N); M与N一样大,时间复杂度O(M)或者O(N)

例题3

void Func4(int N)
{    int count = 0; 
	for (int k = 0; k < 100; ++k)
	{
		++count; 
	}
	printf("%d\n", count);
}

时间复杂度:O(1)

这里的1并不是1次,代表的是常数次

例题4

const char * strchr(const char * str, int character);                        ----查找字符串的字符

时间复杂度:O(N)

最好次数1次找到,最坏次数N次找到,平局次数N/2,在实际情况下我们一般关注的是最坏运行情况,所以数组中搜索数据的时间复杂度是O(N)。有这样一句比较有哲理的话:**用悲观的心态过积极的人生。**在生活中做最坏的打算也不一定有最坏的结果。

例题5

#include  <stdio.h>

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(N^2)

计算过程:N-1+N-2+…+2+1=N*(N-1)/2

例题6

int BinarySearch(int* a, int n, int x) //二分查找
{
	assert(a); 
	int begin = 0; 
	int end = n - 1; 
	// [begin, end]:begin和end是左闭右闭区间,因此有=号
	while (begin <= end)
	{
		int mid = begin + ((end-begin)>>1);
		if (a[mid] < x)
			begin = mid+1;
		else if (a[mid] > x)
			end = mid-1;
		else
			return mid;
	}
		return -1;
}

时间复杂度:O(logN)

计算过程:N/2/2…/2=1 —> N=2^x —>x=log(2)N

例题7

long long Fac(size_t N)
{
	if (0 == N)
		return 1;
	return Fac(N - 1)*N; 
}

时间复杂度:O(N)

计算过程:Fac(N)->Fac(N-1)->Fac(N-2)->…->Fac(2)->Fac(1)

例题8

long long Fib(size_t N)
{ 
	if (N < 3) 
	return 1;  

	return Fib(N - 1) + Fib(N - 2); 
}

时间复杂度:O(2^N)

我们发现递归有的时候并不是很好,时间复杂度比较大,如果这里传参比较大,跑的时间就会很久。所当我们不用递归实现如下:

long long Fib(size_t N)
{
	if (N < 3)
		return 1;
	long long f1 = 1, f2 = 1, f3 = 0;
	for (int i = 3; i <= N; i++)
	{
		f3 = f1 + f2;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}

时间复杂度:O(N)

空间复杂度

空间复杂度的概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

常见空间复杂度计算举例

例题1

#include <stdio.h>

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)

这里需要理解:算法在运行过程中临时占用存储空间(额外)大小的量度,这里这开辟exchange,end,i 三个零时变量,因为**大O渐进表示法,**3为常数所以为1 。

例题2

long long Fac(size_t N)//递归
{ 
    if(N == 0)

     return 1; 
     return Fac(N-1)*N;
}

空间复杂度:O(N)

例题3

#include <stdio.h>

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) 


![img](https://img-blog.csdnimg.cn/img_convert/1c3aa21e1c2a4e8886ccabc4a763dfa7.png)
![img](https://img-blog.csdnimg.cn/img_convert/ff23c7ffbc7def1e685c73e9e6460bb9.png)
![img](https://img-blog.csdnimg.cn/img_convert/8bcb103cc27c4e89ac1c4fed8d0022ee.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

 = 2; i <= n; ++i) 


[外链图片转存中...(img-0GOyD0UJ-1715432429827)]
[外链图片转存中...(img-GzMIgtSk-1715432429827)]
[外链图片转存中...(img-td69jHwO-1715432429828)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值