已经太久没用更新了,由于各种原因,导致很久没用更新了,但是停更期间我也是一直在很努力的学习与复习之前学过的知识,读了两本C语言的数据,初学者也是可以看的,推荐给大家,如果需要pdf,可以私信我
第一本:《C陷阱与缺陷》
第二本:《C语言深度剖析》
回归正题,今天开始正式学习数据结构,我将带领大家由浅入深的学习,不用害怕,因为我会把我认为比较难懂的知识学习好几遍,然后再给大家写出来。今天所讲的算法复杂度难度还好,不是很难,大家放心,不用担心学不会。
正式开始学习:
目录
1、算法复杂度
数据结构与算法介绍:
数据结构:数据结构的内存中存储数据的格式,指的是相互之间存在一种或多种特定关系的数据元素集合与数据元素之间的集合,一种数据结构不会适用于全部的用途,所以我们要学习数据结构,数据结构包括:数组、链表、线性表、哈希值等等。
算法:算法是指数据输入与输出时,在底层中是如何实现,有的算法对于程序运行快,有的慢,但实现的功能都是一样的。
总结:数据结构管理在内存中是如何放置的,算法是如何在内存中计算的
数据结构与算法的概念是不是特别的简单,所以大家不要听到数据结构这门课的名字就害怕自己学不会,我们把这些拗口的语言给打回原形,让它们看起来也没用这么高大尚。
2、如何学好数据结构
有小伙伴问了,我们应该如何学习数据结构呢,我这里给出两点的建议:
秘诀1:死磕代码!!!
秘诀2:画图画图画图+思考!!!
3、算法效率
3.1、什么是算法效率?
算法效率就是我们所写的代码运行的速度快慢,比如:有两个人一起学习,学习的时间地点都是一样的,第一个人学的很快,第二个人学的很慢,很明显,第一个人学习效率高,第二个人学习效率低,这就是因为学习方法不一样导致的,虽然这两个人都可以学会相同的知识。
我们所写的代码也是如此,两个人写同一道算法题目时候,一个人写的代码运行效率快,一个人写的代码运行效率慢,但是最终实现的结构都是相同的。
如何衡量⼀个算法的好坏呢?
案例:旋转数组https://leetcode.cn/problems/rotate-array/description/
思路:循环K次将数组所有元素向后移动⼀位
void rotate(int* nums, int numsSize, int k) {
while (k--) {
int end = nums[numsSize - 1];
for (int i = numsSize - 1; i > 0; i--) {
nums[i] = nums[i - 1];
}
nums[0] = end;
}
}
在我们刚学完C语言的同学们,肯定第一时间想到的是使用两个for循环进行嵌套到达交换,我也是第一时间想到的是两个for循环进行嵌套,那么这个写法到底对不对呢?有没有通过测试?
我们看见了,这个题目一共会验证38个输入数据,我们通过了0-36个输入数据,在进行第37个输入数据时候,显示超出计算时间,显然,我们算法实现的功能是没用问题的,主要的问题在于在进行很大数计算的时候,我们所写的代码运行时间超出了题目给定的时间限制,这时候我们就需要优化我们的算法了。
3.2、复杂度的计算
一般我们衡量一个算法的好坏是从时间与空间两个维度进行衡量的,分别成为时间复杂度与空间复杂度
时间复杂度是一个衡量算法运行快慢的
空间复杂度是衡量是指一个算法在运行时所需要的额外空间。
4、时间复杂度
定义:在计算机科学中,算法的时间复杂度是一个函数T(N),他定量描述了算法的运行时间,时间复杂度是该程序运行的时间快慢,那么我们为什么不直接计算程序的运行时间呢?
- 在相同的机器上,相同的代码分别放入新编译器与老编译器中,程序所执行的运行时间快慢是不一样的。
- 不同配