整理了一些比较难的数据结构
数据结构的汇总知识点详见:https://blog.csdn.net/v_july_v/article/details/6543438
数据结构
- 链表
https://mp.csdn.net/mdeditor/79977855 - 树
关于树:包括二叉搜索树BST,二叉平衡搜索树AVL,红黑树RBT,B-树,B+树,B*树
https://blog.csdn.net/Sup_Heaven/article/details/39313731
补充一部分:对AVL进行插入操作时,我们需要更新通向根节点路径上那些节点的所有平衡信息,而插入操作隐含着的困难在于,插入一个节点可能破坏AVL树的特性,因此需要对树进行简单的修正来做到,这个操作就是旋转。
旋转分为两种:单旋转和双旋转,单旋转是指发生在“外边”的情况,双旋转是指发生在“内部”的情形。
AVL树流行的一个变种是红黑树,对红黑树的操作可以在最坏情形下花费O(log N)时间。(这也是弥补了AVL树的插入复杂性)。
红黑树是具有以下着色性质的二叉查找树:
1.每个节点要么是红色,要么是黑色;
2.根节点是黑色;
3.所有的叶子节点(指的是NULL)都是黑色;
4.如果一个节点是红色,那么它的子节点必须是黑色;
5.从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。
掺入操作时,首先必须涂成红色,否则违反第4条,另外,如果插入的父节点为红色,那么违反第3条,因此比较进行必要的操作:颜色的改变和树的旋转。
红黑树的查找,删除操作:https://blog.csdn.net/u011240877/article/details/53329023#红黑树的左旋右旋
红黑树常问的问题:https://www.cnblogs.com/bethunebtj/articles/4853480.html - 哈希表(散列表)
也就是python中的字典或Perl中的hash表;
哈希表能够实现很快的查找,因此在查找,匹配等问题中能够实现较小的复杂度,因此经常被用到,例如:
https://leetcode.com/problems/two-sum/description/
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
对每一个数构造一个哈希表对应的元素,其Key为加起来为总和的数,其值对这个数的index,因此就可以根据对应的值找到另一个值对应的index.
算法
- 查找排序算法
一般使用顺序查找,二分查找,哈希表查找和二叉排序树查找。
如果面试题是要求在排序的数组中(或者部分排序的数组中)查找一个数字或者统计数字出现的频率,那么可以尝试使用二分查找算法。
哈希表和二叉排序树的重点在于考察他们的数据结构而不是算法。
一定要会写快速排序,并且熟知各种排序的时间复杂度,额外空间消耗。 - BFS,DFS 广度优先搜索与深度优先搜索
http://www.cnblogs.com/skywang12345/p/3711483.html
DFS深度优先搜索相当于树搜索中的先序遍历,就是先处理完一边的子节点再处理另一边;
BFS广度优先搜索又称”宽度优先搜索”或”横向优先搜索”,以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。
广度优先搜索例题:https://leetcode.com/problems/friend-circles/description/
深度优先搜索例题: - 有向图,无向图的邻接矩阵