![69347384e5ac953ca809c5f074df2566.png](https://i-blog.csdnimg.cn/blog_migrate/6afd9cf3fa95f90c646a5430824802fe.jpeg)
作者:张人大
代码效率优化
复杂度 -- 一个关于输入数据量n的函数
- 时间复杂度 -- 昂贵
- 与代码的结构设计有着紧密关系
- 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关
- 空间复杂度 -- 廉价
- 与数据结构设计有关
数据结构 -- 考虑如何去组织计算机中一定量的数据。
数据结构连接时空,用空间换取时间。
数据处理 -- 了解问题,明确数据操作方法,设计出更加高效的数据结构类型
- 找到需要处理的数据,计算结果,再把结果保存下来
- 把结果存到新的内存空间中
- 把结果存到已使用的内存空间中
- 基本操作只有三个:增,删,查
- 增和删可以细分为数据结构的中间以及最后的增和删
- 查找可以细分为按照位置条件查找和数据数值特征查找
- 所有数据处理都是这些基本操着的组合和叠加
- 只有字典类型数据结构能在 O(1) 的时间复杂度内完成查找动作
- 回归问题本源,明确数据被处理的动作,来解决数据结构的问题
想了解更多,欢迎关注我的微信公众号:Renda_Zhang
线性表
n 个具有相同特性的元素的有限序列,Linear List
数据元素之间的关系是一对一的关系
- 即除了头尾元素外,其它数据元素都是首尾相接的
- 这句话只适用大部分线性表,而不是全部
- 比如,循环链表尾的指针指向首位结点
实现方式
- 最常用的是链式表达,也叫线性链表或链表
- 每个结点包括具体的数据值和指向下一个结点的指针
- 单向链表,循环链表,双向链表,双向循环链表
- 新增和删除为 O(1) 时间复杂度,而查找为 O(n)
- 适合数据元素个数不确定,且经常进行新增和删除
- 链表的翻转,快慢指针的方法,是必须掌握的内容
- 使用数组实现,也叫顺序存储,顺序表
类别
- 一般线性表,可以自由的删除和添加结点
- 受限线性表,主要包含栈和队列
栈和队列是特殊的线性表,本质上他们都可以被看作是一类基本结构
线性表案例
- 链表的翻转
- 快慢指针
- 查找奇数个数的链表的中间位置结点的数值
- 判断链表是否有环
栈
后进先出的(限制后的)线性表,Last In First Out, Stack.
新增和删除操作只能在这个线性表的表尾进行,即在线性表基础上加了限制
- 新增: 压栈 push, which adds an element to the collection
- 删除: 出栈 pop, which removes the most recently added element
功能上,数组或者链表可以代替栈,但它们灵活性过高,数据量大时有风险
栈顶和栈底是用来表示这个栈的两个指针
- 栈顶 (top) 是表尾,用来输入数据
- 栈底 (bottom) 是表头
栈有顺序表示和链式表示,分别称作顺序栈和链栈
- 顺序栈
- 可以借助数组来实现
- 数组的首元素存在栈底,尾元素放在栈顶
- 定义指针 top 来指示栈顶元素在数组的位置
- 栈中只有一个元素,则 top = 0
- 以 top 是否为
- 可以借助数组来实现