2.数据结构--空间复杂度

这篇具有很好参考价值的文章主要介绍了2.数据结构--空间复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2.数据结构--空间复杂度,数据结构,数据结构,算法,java


一、空间复杂度讲解

1.空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用额外的存储空间大小的量度
2.空间复杂度算的是变量的个数
3.函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间就已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定(栈帧里面保存的寄存器,形参都可算进空间复杂度,都算常数个)

二、计算下列经典例题的空间复杂度

1.冒泡排序的空间复杂度 O(1)

// 计算BubbleSort的空间复杂度?O(1)
void BubbleSort(int* a, int n)
{//a指向一个数组
	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;
	}
}

解析:
注意:用到数组,数组有n个空间,不算冒泡排序的消耗,并不是因为排序而开辟的空间,是本来就有,排序对数组的n个空间进行处理
函数里面开辟的空间end,exchange都是常数个,所以空间复杂度是O(1)

2.斐波那契递归的空间复杂度 O(N)

long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

解析:
2.数据结构--空间复杂度,数据结构,数据结构,算法,java
关于上面解析中提到的 栈帧销毁后,再调用函数,会复用栈帧的解释如下:
(1)问题:销毁了栈帧还怎么能够复用?
空间的销毁,栈帧的销毁,变量的销毁,malloc之后的free,他们都不是指把空间整没了,而是归还这块空间的使用权
(2) 内存空间属于操作系统的进程,而调用函数建立栈帧,或者malloc都是去对应的区域申请空间的使用权。
销毁指的是将这块空间的使用权还给进程,而这块空间还可以给别人用
(3)之所以会复用,首先是因为栈帧是向下建立的,上面是高地址,下面是低地址,而堆是向上生长的,malloc的空间就在堆。
结合本题解释: 调用该函数的时候建立栈帧,调用完毕销毁该栈帧,也就是归还使用权,在此之后紧接着调用函数,又建立栈帧,由于栈帧是向下建立的,所以申请的空间还是刚刚使用过并归还的那块空间,也就是说这个栈帧的重复使用。
注意:在堆上两次malloc分配的空间的地址可能是不一样的

关于堆;
1.堆被称为"向上生长"是指在内存地址空间中,堆的分配方向是从低地址向高地址逐渐增长的。这意味着,随着堆中内存块的分配,新分配的内存块通常会位于已分配内存块的上方。
2.在一般情况下,如果连续多次调用malloc分配内存块,这些内存块的起始地址通常是递增的,即后续分配的内存块的地址比前面分配的内存块的地址要大。
当使用连续的malloc调用时,堆管理器会在堆内存中寻找足够的空闲空间来满足每个分配请求。由于管理机制和内存对齐的考虑,以及其他可能的因素(如堆的碎片化),每次分配的起始地址可能会有所不同。这意味着在实际情况下,即使连续调用多次malloc,返回的内存块的起始地址也可能不同。
因此,一般情况下,连续的malloc调用返回的内存块起始地址有可能不同,但是它们通常是递增的。这是由于堆管理器的分配机制和内存对齐的要求所决定的

(4)进程—(类比)—>酒店
申请内存–> 开房
销毁内存–> 退房
越界 --> 开了一个房间,但通过一些手段比如挖洞还进入了另一个房间
野指针 --> 开房自己偷偷配置了钥匙,再把房卡退了之后,拿着自己配的钥匙去把 房间打开住进去不是你的房间,这时报警相当于系统崩溃
(5)进程地址空间分几个区域:
(局部变量)
(malloc的空间)
静态区 (全局数据和静态数据)
常量区 (常量)
(6)2.数据结构--空间复杂度,数据结构,数据结构,算法,java

3.计算阶乘递归的空间复杂度 O(N)

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
	if (N == 0)
		return 1;

	return Fac(N - 1) * N;
}

递归调用了N次,开辟了N个栈帧,每个栈帧里没有开辟额外的空间,每个栈帧里都是常数个空间
2.数据结构--空间复杂度,数据结构,数据结构,算法,java

三、时间复杂度和空间复杂度的对比

时间一去不复返,时间是累积计算的、
空间是可以重复利用的,不累积计算

四、常见的函数的时间复杂度和空间复杂度的总结

冒泡排序 时间复杂度 O(N^2) 空间复杂度O(1)
斐波那契递归 时间复杂度 O(2^N) 空间复杂度O(N)
二分查找 时间复杂度 O( log2(N) )
阶乘递归 时间复杂度 O(N) 空间复杂度O(N)文章来源地址https://www.toymoban.com/news/detail-595922.html

到了这里,关于2.数据结构--空间复杂度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法的时间复杂度和空间复杂度(数据结构)

    目录 1、算法效率 1如何衡量一个算法的好坏 2算法的复杂度 2、时间复杂度 1时间复杂度的概念 2大O的渐进表示法 2时间复杂度计算例题 1、计算Func2的时间复杂度 2、计算Func3的时间复杂度 3、计算Func4的时间复杂度 4、计算strchr的时间复杂度 5、计算BubbleSort的时间复杂度 6、计算

    2024年02月03日
    浏览(68)
  • 学习数据结构:算法的时间复杂度和空间复杂度

    衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 算法的

    2024年04月11日
    浏览(46)
  • 【数据结构与算法】1.时间复杂度和空间复杂度

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 算法效率分为两种:第一种是时间效率;第二种是空间效率。时间效率又称为时间

    2024年01月20日
    浏览(54)
  • 数据结构 | 算法的时间复杂度和空间复杂度【详解】

    数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转

    2024年02月08日
    浏览(57)
  • 【数据结构与算法篇】时间复杂度与空间复杂度

       目录 一、数据结构和算法 1.什么是数据结构?  2.什么是算法? 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度  6.常见复杂度对比 7.复杂度的OJ练习   👻内容专栏:《数据结

    2023年04月24日
    浏览(67)
  • 从头开始:数据结构和算法入门(时间复杂度、空间复杂度)

        目录 文章目录 前言 1.算法效率 1.1 如何衡量一个算法的好坏 1.2 算法的复杂度 2.时间复杂度  2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算 3.空间复杂度 4.常见复杂度对比 总结 前言         C语言的学习篇已经结束,今天开启新的篇章——数据结构

    2024年02月14日
    浏览(53)
  • 【数据结构与算法篇】之时间复杂度与空间复杂度

    ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞友友们暑假快乐,好久不见呀!!!💖💖💖 🍉 有人曾经问过我这样一个问题,“人终其一身,执着追求的东西究竟是什么?”我是这样回答的,”我们终其一生都在寻找着那个和我们灵魂极其契合

    2024年02月12日
    浏览(54)
  • 【数据结构初阶】算法的时间复杂度和空间复杂度

    1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢? 比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢? 1.2 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此

    2024年02月08日
    浏览(75)
  • 【数据结构】算法的时间复杂度和空间复杂度(含代码分析)

    如何衡量一个算法的好坏呢?比如对于以下斐波那契数列: 这里的时间复杂度为: 2^N ,计算方法请看下文。 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复

    2024年02月05日
    浏览(60)
  • 数据结构学习之路--算法的时间复杂度与空间复杂度(精讲)

         嗨嗨大家!本期带来的内容是:算法的时间复杂度与空间复杂度。 目录 前言 一、算法效率 算法效率的衡量标准 二、时间复杂度 1 时间复杂度的定义 2 求解时间复杂度的步骤 2.1 找出算法中的基本语句:  2.2计算基本语句执行次数的数量级: 2.3大O阶的渐进表示法:

    2024年04月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包