基础篇—— 数据结构与算法
一、数据结构
个人理解:数据结构的释义,我觉得重点是在结构上,单纯的数据当然也只是数据,但是,如果按照结构内的规则去构造这些数据,并且根据其结构所衍生的算法对数据进行操作,这些数据就会呈现更多形态。有时候我会考虑,数据结构是通过数据填充结构,还是使用数据构造结构,我想应该是后者,因为每一个结构都可能是根据某种规则无限延伸的,并不能事先建造好供数据填充。
时间复杂度递增:
复杂度 | 量级 |
---|---|
常量阶 | O(1) |
对数阶 | O(logn) |
线性阶 | O(n) |
线性对数阶 | O(nlogn) |
平方阶 | O(n的平方) |
k次方阶 | O(n的k次方) |
指数阶 | O(2的n次方) |
阶乘阶 | O(n!) |
二、数据结构-- 算法
1、内容
基本的数据结构和算法有哪些?如下图:
10个基本的数据结构和算法包括:
- 数据结构:数组,链表,栈,队列,散列表,二叉树,堆,跳表,图,Trie树;
- 算法:递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法。
2、数据结构-- 数组
1、数组具有随机访问的特性,这种特性是由计算机为数组开辟的内存连续性决定的,也正是为了维持这种内存连续性,使得数组的添加删除操作的时间复杂度增加。这种通过内存地址+索引直接进行随机访问的模式,是CPU缓存机制的体现。
2、数组内存地址是一块连续的内存空间:数组内存 = 计算机分配的base_地址 + 索引i * 数据所占内存。
3、数组越界问题,在C语言中需要开发者维护,java中由JVM维护。
3、数据结构-- 链表
1、链表所申请的内存空间不一定是连续的,可以是分散的。
2、链表也可以是有序的,每个结点存储下个结点的指针来串联链表分散的结点。
4、数据结构-- 栈
1、栈结构的特性是先进后出,函数调用时创建的临时变量就是存储在栈中。
2、函数调用中,如果有子函数,出栈顺序先进后出,能够安全的先出栈子函数变量。
3、栈结构很容易出现在对称场景中。
5、数据结构-- 队列
1、队列的先进先出的特性,多用于资源受限的池化等场景。
6、算法-- 递归
1、当一个问题可以分解成相同思路的单个或多个子问题时,可以考虑使用递归算法;根据思路写出递推公式,然后确定递出去的终止结果,反推到当前问题。
2、递归代码要重点考虑堆栈内存溢出和重复计算问题。
3、通过栈内存结构实现递归,空间复杂度高。所以一般递归都可以使用非递归实现。
7、算法-- 排序
1、常用排序算法:冒泡排序,插入排序,选择排序,归并排序,快速排序,计数排序,基数排序,桶排序。
2、核心思想:
- 冒泡排序:比较交换,稳定排序,时间复杂度O(n^2)
- 插入排序:比较插入,稳定排序,时间复杂度O(n^2)
- 选择排序:比较交换,不稳定排序,时间复杂度O(n^2)
- 归并排序:递归分治,稳定排序,时间复杂度O(nlogn)
- 快速排序:递归分治,不稳定排序,时间复杂度O(nlogn)
数据结构 | 衍生算法 | 结构特性 |
---|---|---|
数组 | 1、二分查找法 | 1、具有随机访问的特点 |