文章目录
数据结构篇 - Java
我觉得我这里面的内容还是非常粗浅的,我也没时间深入学咯,先干正事
文章目录 |
---|
《数据结构(C++语言版)》 |
《图解算法数据结构》 |
一、学习路线梳理
- 基础知识
- 基本数据结构
- 向量
- 列表
- 栈/队列
- 二叉树
- 图
- 搜索树
- 高级数据结构
- 高级搜索树
- 词典
- 优先队列
- 算法
- 串
- 排序
二、入门
2.1 复杂度的分析与度量
我认为主要是讲述在某些场景下的数据结构的一个效率问题,主要是从时间复杂度/空间复杂度展开,一般分为最好、最坏以及平均情况
以下摘录《图解算法数据结构》—— Krahets
时间复杂度
根据从小到大排列,常见的算法时间复杂度主要有
O(1) < O(logN) < O(N) < O(NlogN) < O(N2) < O(2N) < O(N!)
简单来说,使用算法进行问题解决的时候,输入的数据量恒定为 N,我们要操作 y 次才能得到我们最终想要的结果
- 最佳情况 Ω(1) : nums = [7, a, b, c, …] ,即当数组首个数字为 77 时,无论 nums 有多少元素,线性查找的循环次数都为 11 次;
- 最差情况 O(N) : nums = [a, b, c, …] 且 nums 中所有数字都不为 77 ,此时线性查找会遍历整个数组,循环 NN 次;
- 平均情况 Θ : 需要考虑输入数据的分布情况,计算所有数据情况下的平均时间复杂度;例如本题目,需要考虑数组长度、数组元素的取值范围等;
空间复杂度
空间复杂度涉及的空间类型有:
- 输入空间: 存储输入数据所需的空间大小;初始数据大小
- 暂存空间: 算法运行过程中,存储所有中间变量和对象等数据所需的空间大小;数据计算时占用空间
- 输出空间: 算法运行返回时,存储输出数据所需的空间大小;最终结果大小
根据从小到大排列,常见的算法空间复杂度有
O(1) < O(logN) < O(N) < O(N2) < O(2N)
复杂度分析
好难啊,我回来再看…
常数
对数
线性
多项式
指数
2.2 递归
简单理解,就是自己调用自己,然后写一个判断作为契机暂停这种递归
- 线性递归
- 递归模式
- 递归消除
- 二分递归
直接自闭了我靠…
2.3 ADT
抽象数据类型(Abstract Data Type,ADT)
我觉得上面的资料对于我来说很难理解,简单描述就是:一个数学模型+这个数学模型上的操作,例如
- 数学模型:HashMap
- 操作方式:get()、put()
用现代编程语言的说法,,定义一个全新的数据类型,第一,需要提供数据存储的方式;第二,需要提供数据的操作方式
三、基本数据结构
非常贴近我们的生活,例如我们乘坐地铁人多时需要排队(队列),一落凳子(栈)等等
3.1 数组
数组:元素的内存地址与下表之间呈连续线性关系,可通过对应下标访问内部元素
int[] ints = new int[]{
1, 2, 3};