常用的数据结构
线性数据结构
数组、链表、栈、队列。
数组:
链表:
- 单链表
- 循环链表
- 双向链表
- 双向循环链表
栈:
队列:
图
图的一些概念:顶点、边、入度和出度、无向图和有向图、无权图和带权图、自环图。
图的存储:邻接矩阵存储、邻接表存储。
树
树的一些概念:节点、根节点、父节点、子节点、兄弟节点、叶子节点
- 节点的高度 :该节点到叶子节点的最长路径所包含的边数。
- 节点的深度 :根节点到该节点的路径所包含的边数
- 节点的层数 :节点的深度+1。
- 树的高度 :根节点的高度。
树的种类:
- 二叉树
- 满二叉树,2^n-1 个
- 完全二叉树,最后一层可以有空余
- 平衡二叉树、二叉排序树
树的存储:链式存储,数组顺序存储
树的遍历:先序遍历、中序遍历、后序遍历。
红黑树
红黑树特点 :
- 每个节点非红即黑;
- 根节点总是黑色的;
- 每个叶子节点都是黑色的空节点(NIL 节点);
- 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
- 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。
红黑树的应用 :TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。
相关阅读 :《红黑树深入剖析及 Java 实现》(美团点评技术团队)
B 树
B 树、B+树、B*树、LSM 树
堆
最大堆、最小堆。
堆的存储:(二叉)堆可以用数组的方式来存储。
堆的操作 :
- 插入元素
- 放到最后,然后根据堆的层数依次向上比较判断是否更新位置
- 删除堆顶元素
- 方案一:将最后一个元素放到堆顶,然后根据堆的层数依次向下判读是否更新位置
- 方案二:从堆顶开始,判断下层哪个更新位置
- 堆排序
- 建立一个空堆
- 依次将数组插入堆中
- 每次删除堆顶元素
布隆过滤器
数据结构与算法整理
书籍推荐
- 《算法导论》 很基础的一本书,有时间就看没时间请看下面几本
- 《剑指 offer》 很多笔试面试高频题,基础性也很好
- 《编程之美》 提供了很多结题的思路,微软面试就靠它了
- 《挑战程序设计第二版》 对笔试面试来说难度很合适,笔试和面试的高难度题目很多都能在书里面找到对应的、
- 《背包问题九讲》
- http://www.cyc2018.xyz/
其他资源
- leetcode 题解博主:花花酱 happygirl cat racket acwing 闫学灿
- leetcode 题目分类列表
- 算法 oi: https://github.com/OI-wiki/OI-wiki/
- 算法模板(Python): https://www.zhihu.com/people/mason-21/posts