常见面试题
1。什么是平衡二叉树?
插入数据?
2。解决hash冲突的办法?
3。阻塞队列,生产者消费者模型。
4。B-树,B+树的区别(时间复杂度)
5。二叉树与堆的关系?(时间复杂度)
树
1。二叉树的定义:
每个节点最多只有两颗子树,并且有左右子树之分。
每一层节点达到最大就是满二叉树。
每一层节点序号和满二叉树对应,为完全二叉树(满二叉树从后向前删减可变成完全二叉树)
2。遍历二叉树:(先中后代表root点的顺序,左右子树的先后是确定的)
先序遍历:root-左-右
中序遍历:左-root-右
后序遍历:左-右-root
线索二叉树就是通过遍历二叉树的顺序,在左指针加上前驱,右指针加上后继。
3。深林变二叉树:
所有节点,最左子树不变,其余节点全部断开,依次变为左兄弟节点的右节点。
4。最优二叉树(哈夫曼树):
权值越小的节点离根最远,才可以达到二叉树的总路径长度最小。
5。二叉排序树(二叉查找树):
所有节点,左子树的所有节点的值都小于根节点的值,所有右子树节点的值都大于根节点的值。
所以,中序遍历可以达到有序序列。
查找的时间复杂度:O(log2n)
递归查找算法:
6。平衡二叉树:
树中任何一个节点的左右两颗子树的高度差的绝对值不能大于1。
左右旋使之保持为平衡二叉树:
左边多,并且添加节点在左节点(的任一边):直接右旋
右边多,并且添加节点在右节点(的任一边):直接左旋
左边多,但是添加节点在右节点(的任一边):先左旋再右旋
右边多,但是添加节点在左节点(的任一边):先右旋再左旋
7。B-树/B+树:
一种平衡的多路查找树(查找时需要最快,二叉树的深度太深而节点的子节点广度不够,如果所有节点全部加在root节点上又会造成广度太广而深度不够,依然不能快速查找,B树就是在深度和广度中取平衡值的一种数据结构)
查找时间复杂度:O(log2n)
B-树的所有关键字分散存储
B+树的所有关键字都存储在叶子节点
数据库为什么用B+树:
局部性原理与磁盘预读
由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。
关于数据库存储原理中的数据结构:[CSDN地址](https://blog.csdn.net/lis_12/article/details/57416576)
堆
1。堆的定义:
堆是一个完全二叉树。又是一种特殊的队列,从堆中取出元素是按照元素的优先级取的,而不是按照元素的插入顺序。
最大堆:每个节点的值都大于其子节点的值,root总是最大。
最小堆:每个节点的值都小于其子节点的值,root总是最小。
(堆不是排序二叉树!)
堆插入元素:
插入元素总是在最后插入,然后进行调整
堆删除元素:
删除元素总是在root节点删除,然后进行调整
构建最大/小堆的时间复杂度:O(N)
(大型长片小说——“从码渣到码神”第一卷《码渣的进阶》系列内容均来自one note个人笔记)
来源:CSDN
作者:Johnny Leo
链接:https://blog.csdn.net/qq_42661628/article/details/103996697