🚩 WRITE IN FRONT 🚩
- 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎
- 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博主、华为云享专家、阿里云专家博主、掘金优秀创作者、腾讯云年度进取作者、全网粉丝量8w+、个人社区人数累计5w+、全网访问量100w+ 🏅
- 🆔 本文章内容由 謓泽 原创 如需相关转载请提前告知博主 ⚠
- 📑 创作时间:2022 年 11 月 18 日 📅
- 📝 个人主页:謓泽的博客 📃
- 📣 专栏系列:📃
- 🙌 Gitee:謓泽 (wsxsx) - Gitee.com ⭐️
- 🎁 点赞👍+ 收藏⭐️+ 留言📝
✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 📩
前言
说明⇢如果你对数据类型以及时间复杂度不是很了解的话可以看看博主写的这两篇文章⇲
✨【数据结构】何为数据结构。-CSDN博客
✨【数据结构】时间复杂度-CSDN博客
Who 空间「复杂度」
📑空间效率。
概述⇢空间效率被称之为是空间复杂度。空间复杂度主要是衡量的是一个算法所需要的额外的空间,在计算机发展的早期时代,计算机的存储容量已经到达了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
说明⇢空间复杂度是对一个算法在运行过程当中临时占用存储空间的大小的量度、空间复杂度不是程序占用了多少个byte位的空间,因为这个也没有太大的意义。所以空间复杂度计算的是变量所占的个数。
说明⇢空间复杂度计算规则和基本很实践的复杂度类似,也是使用大O渐进的表示法,类似于时间复杂度的方式去计算变量当中的个数。
注意⇢现如今在实际情况时间复杂度比空间复杂度要重要的多。
大O的渐进表示法
🉑解释⇢大O符号(Big O notation)⇢用于描述函数渐进的行为数字符号。
🎓总结⇢时间复杂度它是一个估算,是去看表达式当中影响值最大的那一项、也可以说是保留最高阶项。
🕹推导大O阶的方法。
⒈用常数1取代运行时间中的所有加法常数,即使这个常数再大,算法的时间复杂度还是O(1)
⒉修改后的运行次数函数当中,只保留最高阶项。
⒊如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
- 以上三点请牢牢记住!
示例代码①
说明⇢计算下述函数当中的空间复杂度。
void sort(int* arr, int n) {assert(arr);for (int end = n; end > 0; --end){int exchange = 0;for (int i = 1; i < end; ++i){if (arr[i - 1] > arr[i]){Swap(&arr[i - 1], &arr[i]);//交换exchange = 1;}}if (exchange == 0)break;} }
题目的分析如下⇲
概述⇢在上述的题目当中一共使用了三个空间,也就是三个变量。
end exchange i
说明⇢在这里影响最大的也就是这三个变量,那么它的空间复杂度为O(1),因为③是常数。
注意⇢在这里形参也算是变量,它也是需要开辟空间的,会建立栈帧,栈帧就是一块空间。上述代码当中的变量就是存储在栈帧上面的。算上形参当中的两个变量,数组名是首元素的地址,也是一个变量。但是,它的空间复杂度还是O(1)
重点⇢时间是累计的,而空间是不累计的。循环走了N次,重复利用的是一个空间。在上述代码exchange出了作用域变量就会销毁了,再上来还是要使用exchange还是用的是同一个空间,不累计的,而是出了作用域就会被销毁的。
递归的情况
示例情况如下⇣
↓face(5)↑↓5+face(4)↑↓4+face(3)↑↓3+face(2)↑↓2+face(1)↑return 1 ↑
说明⇢空间是累计最多的用了多少的空间、调用的时候建立栈帧,返回的时候销毁栈帧。