数据结构
00 分钟
2022-11-18
B+树细节优势,和哈希索引的区别,是为了解决什么问题?B+树和B树有什么区别计算二叉树所有左叶子节点的和层序遍历二叉树判断二叉树是否是镜像二叉树二叉树中序遍历,递归和非递归两种方式非递归方式实现前序遍历二叉树算法:分层遍历二叉树二叉树遍历,非递归给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针说下快排的大概的操作过程,平均时间复杂度,什么情况下是最慢的对一个链表进行排序单链表找到中间节点反转单链表如何实现,口述一下链表和数组的区别,以及各种操作上的复杂度给n个数1n,随机n次,将这n个数输出n对括号输出所有合法的情况n个有序的数组合并成一个一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值手写LRU相关知识点:模拟,结构,增删改查;实现LRU算法LRU缓存实现,要求set\get操作o(1)时间复杂度数组是如何实现用下标访问任意元素的浏览器浏览网页前进后退如何实现?堆排常用的数据结构说下跳表和二叉检索树优劣如何查找一个无序数组的第K大元素用栈实现队列用栈能实现双向队列吗?谈下对散列表的理解,深入说下你知道的排序算法为什么map是O(1)的时间复杂度实现map的方法除了哈希还有哪些?用基础数据结构实现一个map算法:括号匹配问题,说下思路算法:二维矩阵顺时针原地旋转90度算法:找出字符串中不包含重复子串的最大长度算法:两个数组,求两个数组的交集算法:二分查找,复杂度算法题:给一个字符串,从里面找到最长的回文字符串(先说思路)算法题:n*n的矩阵,按圈顺时针打印这个矩阵算法:两个无序数组找到他们的交集算法题

B+树细节优势,和哈希索引的区别,是为了解决什么问题?

在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议。
一个经典的B+树索引数据结构:
notion image
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。
在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。
因此,B+树索引被广泛应用于数据库、文件系统等场景。顺便说一下,xfs文件系统比ext3/ext4效率高很多的原因之一就是,它的文件及目录索引结构全部采用B+树索引,而ext3/ext4的文件目录结构则采用Linked list, hashed B-tree、Extents/Bitmap等索引数据结构,因此在高I/O压力下,其IOPS能力不如xfs。
 
哈希索引的示意图:
notion image
简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
从上面的图来看,B+树索引和哈希索引的明显区别是:
  • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
  • 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
  • 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
  • 哈希索引也不支持多列联合索引的最左匹配规则
  • B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题

后记

通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势:
在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引
例如这种SQL:SELECT … FROM t WHERE C1 = ?; — 仅等值查询
在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。

B+树和B树有什么区别

B树

定义: 又称为多路平衡查找树,B树中孩子结点最大值称为该B树的阶,通常记为m
特性: 1、根节点最少有2棵子树,最少有1关键字;最多有m棵子树,最多m-1个关键字
2、其他结点最少有[m/2]棵子树,最少有[m/2]-1关键字;最多有m棵子树,m-1个关键字
3、所有的叶子结点都在同一层次上,且不带任何信息
4、对于任一结点,所有的子树高度相同
5、关键字从左至右依次变大
6、关键字在各结点中不重复
7、各结点都保存了记录(数据)的指针,可以根据指针找到数据
notion image

B+树

特性: 1、结点的关键字个数和子树个数相同
2、根节点最少有2棵子树,最少有2关键字;最多有m棵子树,最多m个关键字
3、其他结点最少有[m/2]棵子树,最少有[m/2]关键字;最多有m棵子树,m个关键字
4、最底层的所有的叶子结点包含所有的关键字,和指向所有记录(数据)的指针,关键字从左至右依次变大
5、关键字在各结点中可能重复,可能存在一个关键字,在对多个结点中都出现
6、只有最底层的叶子结点才保存了记录(数据)的指针
notion image
B树和B+树的区别
notion image

计算二叉树所有左叶子节点的和

层序遍历二叉树

判断二叉树是否是镜像二叉树

二叉树中序遍历,递归和非递归两种方式

非递归方式实现前序遍历二叉树

算法:分层遍历二叉树

二叉树遍历,非递归

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针

说下快排的大概的操作过程,平均时间复杂度,什么情况下是最慢的

对一个链表进行排序

单链表找到中间节点

反转单链表如何实现,口述一下

链表和数组的区别,以及各种操作上的复杂度

给n个数1n,随机n次,将这n个数输出

n对括号输出所有合法的情况

n个有序的数组合并成一个

一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值

手写LRU相关知识点:模拟,结构,增删改查;实现LRU算法

LRU缓存实现,要求set\get操作o(1)时间复杂度

数组是如何实现用下标访问任意元素的

浏览器浏览网页前进后退如何实现?

堆排

常用的数据结构说下

跳表和二叉检索树优劣

如何查找一个无序数组的第K大元素

用栈实现队列

用栈能实现双向队列吗?

谈下对散列表的理解,深入

说下你知道的排序算法

为什么map是O(1)的时间复杂度

实现map的方法除了哈希还有哪些?

用基础数据结构实现一个map

算法:括号匹配问题,说下思路

算法:二维矩阵顺时针原地旋转90度

算法:找出字符串中不包含重复子串的最大长度

算法:两个数组,求两个数组的交集

算法:二分查找,复杂度

算法题:给一个字符串,从里面找到最长的回文字符串(先说思路)

算法题:n*n的矩阵,按圈顺时针打印这个矩阵

算法:两个无序数组找到他们的交集

算法题

//给定一个以字符串表示的非负整数num,移除这个数中的k位数字,使得剩下的数字最小。
//注意:
//●num的长度小于10002且≥k。
//●num不会包含任何前导零。
//输入/输出示例:
//Input:
//num="1432219",k=3
//Output:
//"1219"
//Explanation:移除掉三个数字4,3,和2形成一个新的最小的数字1219。
 
• 100w个数,怎么找到前1000个最大的,堆排序,怎么构造,怎么调整,时间复杂度。
 
• 四辆小车,每辆车加满油可以走一公里,问怎么能让一辆小车走最远。说了好几种方案,面试官引导我优化了一下,但是还是不满意,最后他说跳过。
  • 十亿个数的集合和10w个数的集合,如何求它们的交集。集合的数字不重复。
  • 十亿和数找到前100个最大的,堆排序,怎么实现,怎么调整。

评论