常用的数据结构

线性数据结构

数组、链表、栈、队列。

数组:

链表:

  • 单链表
  • 循环链表
  • 双向链表
  • 双向循环链表

栈:

队列:

图的一些概念:顶点、边、入度和出度、无向图和有向图、无权图和带权图、自环图。

图的存储:邻接矩阵存储、邻接表存储。

树的一些概念:节点、根节点、父节点、子节点、兄弟节点、叶子节点

  • 节点的高度 :该节点到叶子节点的最长路径所包含的边数。
  • 节点的深度 :根节点到该节点的路径所包含的边数
  • 节点的层数 :节点的深度+1。
  • 树的高度 :根节点的高度。

树的种类:

  • 二叉树
  • 满二叉树,2^n-1 个
  • 完全二叉树,最后一层可以有空余
  • 平衡二叉树、二叉排序树

树的存储:链式存储,数组顺序存储

树的遍历:先序遍历、中序遍历、后序遍历。

红黑树

红黑树特点 :

  1. 每个节点非红即黑;
  2. 根节点总是黑色的;
  3. 每个叶子节点都是黑色的空节点(NIL 节点);
  4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
  5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。

红黑树的应用 :TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。

相关阅读《红黑树深入剖析及 Java 实现》(美团点评技术团队)

B 树

B 树、B+树、B*树、LSM 树

最大堆、最小堆。

堆的存储:(二叉)堆可以用数组的方式来存储。

堆的操作 :

  • 插入元素
    • 放到最后,然后根据堆的层数依次向上比较判断是否更新位置
  • 删除堆顶元素
    • 方案一:将最后一个元素放到堆顶,然后根据堆的层数依次向下判读是否更新位置
    • 方案二:从堆顶开始,判断下层哪个更新位置
  • 堆排序
    • 建立一个空堆
    • 依次将数组插入堆中
    • 每次删除堆顶元素

布隆过滤器

布隆过滤器

数据结构与算法整理

书籍推荐

  • 《算法导论》  很基础的一本书,有时间就看没时间请看下面几本
  • 《剑指 offer》  很多笔试面试高频题,基础性也很好
  • 《编程之美》  提供了很多结题的思路,微软面试就靠它了
  • 《挑战程序设计第二版》  对笔试面试来说难度很合适,笔试和面试的高难度题目很多都能在书里面找到对应的、
  • 《背包问题九讲》
  • http://www.cyc2018.xyz/

其他资源