携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
前言
- 面临着当前不太乐观的就业环境,更凸显出个人硬实力的重要。而评判个人硬实力主要在于是否能解决问题,但是随着越来越多的面经的出现,好像解决的问题都成为了所谓的算法题,个人认为是不完全正确的。算法只是一方面,还有一方面就是数据结构,数据结构和算法是相辅相成的,算法是解决问题的方法和思路,而数据结构是承载算法的基础,某些算法只能用在特定的数据结构之上。而且有时候问题的解决仅仅是选对数据结构据就可以实现,因此,作为承载算法的基础,先大体梳理一下数据结构。
分类
- 数据结构怎么分?见仁见智,我倾向于的分类是线性和非线性
PS:什么是线性? 线性和非线性是来自数学领域的术语,如果两个不同因素的组合作用只是两个因素单独作用的叠加,这种关系或特性就是线性的,如果一个微小的因素能够导致无法衡量的结果,这种关系或特性就是非线性的。
非受限线性表
顺序结构
- 数组
- 支持O(1)的随机访问
- 平均O(n)的插入和删除
链式结构
- 单链表
- 不支持随机访问,如果要访问某个结点需要遍历
- O(1)的插入和删除,因为插入和删除的时候,只需要移动指针
- 每个结点需要额外的空间存指针,因此花费的内存比数组大
受限线性表
栈
- FILO
- 顺序或者链式都可以实现
- 常见问题:括号匹配
堆
- 最大堆
- 堆顶结点的值最大
- 最小堆
- 经过排序的堆
- 不是叶子结点的结点的值,不大于其左子结点和右子结点的值
- 常见问题:k个元素中,找第N大的元素
队列
- 普通队列
- FIFO
- 顺序或者链式都可以实现
- 双边队列
- 入口和出口都可以进队出队
- 优先级队列
- 根据优先级出队
- 常见问题:LRU Cache
树
二叉树
- 二叉树
- 每个父节点有不超过2个子结点
- 遍历方式
- 广度优先
- 深度优先
- 前序
- 中序
- 后序
- 完全二叉树
- 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
- 是二叉树的一种特殊形态
- 满二叉树
- 二叉树的结点要么是叶子结点,要么它有两个子结点,是完全二叉树的特殊形态
- 二叉搜索树
- 左子树结点的值小于根结点的值,当右子树不为空时,右子树结点的值均大于根节点的值
- 平衡二叉搜索树
- 任何结点的左子树和右子树高度最多相差1
- 红黑树
- 自平衡二叉查找树
- 平衡二叉搜索树的特殊形态,左子树和右子树的高度差可能大于1
哈夫曼树
- 是带权路径长度最短的树,权值较大的结点离根较近
- 常见问题:计算机内编码
字典树
- 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较
总结
- 通过梳理数据结构,我们可以选择使用更合适的数据结构,更小的时间复杂度和空间复杂度来更好的解决问题,这个可能也能解决部分优化问题
- 今天也是有收获的一天