数据结构-查找

推荐博客:[link1]

知识框架

2021-05-31_19-15

查找表:用于查找的数据集合

静态查找:查找时,只是检索满足某个条件的特定数据元素,而不动态的修改查找表

​ 静态查找方法:顺序查找,折半查找,散列查找。

动态查找:可以动态地插入或者删除的查找表

​  动态查找的方法:平衡二叉树和B树

算法比较

斐波那契查找

随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,为了防止查找树退化,是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。

插值查找

按照数值的分布信息,我们可以将查找的点改进为如下:

  mid=low+(key-a[low])/(a[high]-a[low])*(high-low),

相比于二分查找,将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。

注:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。

二分查找和二叉查找树的区别

二分查找适用于有序的线性表结构,

二叉查找树是动态查找。先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。不同的插入顺序会导致不同结构的二叉查找树,出现退化现象(变成链表)。

二叉查找树性质对二叉查找树进行中序遍历,即可得到有序的数列。

哈希索引

散列方法是按照关键字编址的一项技术:以关键字K为自变量,通过函数h(K)计算地址.散列表建立了关键点和存储地址之间的一种直接映射关系

散列算法的核心是 散列函数h(x) 和 冲突消解的方法

常见的散列函数:

2021-05-31_21-49

冲突消解的方法:拉链法(拉链 和 合并拉链法),线性探查方法(线性探查,二次探查,随机探查),再哈希法,建立公共溢出区

AVL树

1.AVL树的创建

2.查找

3.插入操作[涉及旋转]

2-3树

特点:绝对平衡的树,任意结点到它的所有叶子结点的深度都是相等的.保证了插入和删除的复杂度都控制在 O(logN)

定义:

一颗2-3树或为一颗空树,或有以下节点组成:

2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点;

3-节点,还有两个元素和三个子树(左中右子树),左子树所有元素的值均小于它父节点,中子树所有元素的值都位于父节点两个元素之间,右子树所有元素的值均大于它父节点;

子树也是空树、2-节点或者3-节点;

没有元素相等的节点。

插入分为4种情况

1.向2-节点中插入元素;

2.向一颗只含有一个3-节点的树中插入元素;

3.向一个父节点为2-节点的3-节点中插入元素;

4.向一个父节点为3-节点的3-节点中插入元素。

删除

参考算法4中的解读

红黑树

黑色结点绝对平衡的二叉树

https://riteme.site/blog/2016-3-12/2-3-tree-and-red-black-tree.html

https://www.jianshu.com/p/e136ec79235c

​ 红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。
  • 性质4:每个红色结点的两个子结点一定都是黑色。
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

插入4种情况

删除3种情况

B/B+树

定义:参考ppt

在插入或者删除操作中,如何维护B/B+树?

https://segmentfault.com/a/1190000020416577

B/B+树之间的不同

4 3 2 1

理解B/B+树的应用背景

为什么B树适合在磁盘中查找?

B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,也就是减少了磁盘的IO操作。

为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?

​ 因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出)

指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;