查找算法
查询算法
1. 二分查找
二分查找必须是有序的。
二分查找 - 二叉树 - 二叉查找树
2. 哈希算法(最高效O(1))
hash冲突:
HashMap 数据结构 链表+红黑树
红黑树的作用就是处理hash冲突的、高效查找的
3. 二叉查找树
特点
- 左子树上节点值都小于根节点。
- 右子树上节点值都大于根节点。
有可能退化成链表
查找时间复杂度其实就是树的高度
4. 红黑树
红黑树的底层数据结构就是一个特殊的二叉查找树。
链表 --> 二叉树 --> 二叉查找树 --> 特殊的二叉查找树(自平衡的二叉查找树)
1. 红黑树性质
-
每个节点不是红色就是黑色
-
不可能有连在一起的红色结点
-
根结点都是黑色 root (入度为零)
-
每个红色结点的两个子结点都是黑色。叶子节点都是黑色;出度为0满足了性质就可以近似的平衡了,不一定要红黑,可以为其他。
当不满足红黑树的时候,使用变换规则。
2. 三种变换规则
-
改变颜色
场景:当前结点的父结点和叔叔结点都是红色
变化:父结点和叔叔结点都变成黑色,爷爷结点变成红色。
-
左旋
场景:父结点红色,叔叔结点黑色,当前结点是右子树
变化:以父结点为准,左边旋转
-
右旋
场景:父结点红色,叔叔结点黑色,当前结点是左子树
变化:父结点和爷爷结点交换颜色,以爷爷结点为准,右旋
旋转和变化颜色规则:所有插入的点默认为红色
能做索引的数据结构:数组、红黑树、链表、哈希、B树(B-树,B+树)
什么时候可以使用hash索引?查询条件不会变得时候。
hash(user_id ) = key 一旦user_id变化,key就会变化
联合索引hash(user_id + name) = key 不支持部分查找和范围查找
3. 补充
红黑树不建议用于MySQL索引的原因
- 读取磁盘的次数过多
- 读取浪费太多
5. B树(N叉排序树)
B-Tree、B+Tree、B*Tree
1. BTee的特性
- 结点最多含有m棵子树,m-1个关键字(存的数据,空间)(m>2)
- 除根结点和叶子结点外,其他每个结点至少有ceil(m/2)个子结点,ceil为向上取整。
- 若根结点不是叶子结点,则至少有两颗子树。
当不满足的时候会 分裂(B-Tree):分裂的时候从中间分开,形成两颗子树。
2. B+Tree
- 叶子结点使用双向链表
- 非叶子结点不存储数据
- 叶子结点和数据是一样的
二叉树、红黑树、B树的区别?
二叉查找树:二叉搜索树,有点查找快,但是在某些情况下,会退化成链表,他是所有高校查找树的基础
红黑树:内存查找高效树,不适合大数据量,也不适合磁盘存储的,具体分析就是IO浪费和读取资源浪费,还有就是树的深度会很大
B+Tree:最适合大量数量的磁盘索引,MySQL底层就是,所有的数据都存在叶子结点,其他都是索引,增加了系统的稳定性以及遍历和查找效率
不同:关键字和key值,数据存储地方,双向链表。
M阶:这个由磁盘的页面大小决定,磁盘块和页内存都是4KB,我们的节点数也就是M值,应该尽可能的跟他一致,这样的好处就是为了我们一次刚好全部拿出一个节点里面所有的数据。

浙公网安备 33010602011771号