优先队列
特点:保证每次取出的元素是队列中优先级别最好的,优先级别可自定义。
常用场景:从杂乱无章的数据中按照一定的顺序(优先级)逐步的筛选出部分乃至全部的数据,例如任意一个数组,找出前K大的数。
性质:
1.数组里的第一个元素 array[0] 拥有最高的优先级别。
2. 给定一个下标 i,那么对于元素 array[i] 而言:
它的父节点所对应的元素下标是 (i-1)/2
它的左孩子所对应的元素下标是 2×i + 1
它的右孩子所对应的元素下标是 2×i + 2
3.数组里每个元素的优先级别都要高于它两个孩子的优先级别。
基本操作:向上筛选,向下筛选。
时间复杂度:O(logN)
图
图可以说是所有数据结构里面知识点最丰富的一个,最基本的知识点如下。
- 阶(Order)、度:出度(Out-Degree)、入度(In-Degree)
- 树(Tree)、森林(Forest)、环(Loop)
- 有向图(Directed Graph)、无向图(Undirected Graph)、完全有向图、完全无向图
- 连通图(ConnectedGraph)、连通分量(Connected Component)
- 存储和表达方式:邻接矩阵(Adjacency
Matrix)、邻接链表(Adjacency List)
需要掌握的知识点: - 图的存储和表达方式:邻接矩阵(Adjacency Matrix)、邻接链表(Adjacency List)
- 图的遍历:深度优先、广度优先(较为重要)
- 二部图的检测(Bipartite)、树的检测、环的检测:有向图、无向图
- 拓扑排序
- 联合-查找算法(Union-Find)
- 最短路径:Dijkstra、Bellman-Ford(区分特点,哪种场合用哪种方法)
前缀树(字典树)
性质:
1.每个节点至少包含两个基本属性。
children:数组或者集合,罗列出每个分支当中包含的所有字符
isEnd:布尔值,表示该节点是否为某字符串的结尾
2.前缀树的根节点是空的
所谓空,即只利用到这个节点的 children 属性,即只关心在这个字典里,有哪些打头的字符。
3. 除了根节点,其他所有节点都有可能是单词的结尾,叶子节点一定都是单词的结尾。
基本操作:创建和搜索
线段树
书写较为繁琐,需要不断练习
树状数组
特点:
- 它是利用数组来表示多叉树的结构,在这一点上和优先队列有些类似,只不过,优先队列是用数组来表示完全二叉树,而树状数组是多叉树。
- 树状数组的第一个元素是空节点。
- 如果节点 tree[y] 是 tree[x] 的父节点,那么需要满足条件:y = x - (x & (-x))。