七大查找算法:https://www.cnblogs.com/zhang-qc/p/8745153.html
学习的地址 https://www.bilibili.com/video/av27831455?p=20
关于查找表:
上面,静态查找表,找的过程中不改变表。动态查找表,过程中表会变。
静态查找表,对确定的数据元素关系的表查找,不一定是线性表。
关于查找:
上面,概率相同。 我们可以改变元素的排列顺序,可能比较次数会少一点。
平均查找长度,表征效率的问题。
下面为顺序查找:顺序查找适合于存储结构为顺序存储或链接存储的线性表,时间复杂度为O(n)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
折半查找(二分查找):(数据要先有序才行,如果是无序的则要先进行排序操作。)
最大比较次数就是 log2n
下面2种查找方法(斐波那契查找和插值查找),思想和上面类似,都是按照某个函数给元素分段。
斐波那契查找:二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1)。如果>,low=mid+1,k-=2;如果<,high=mid-1,k-=1。
差值查找:基于二分查找算法,将查找点的选择改进为自适应选择,mid=low+(key-a[low])/(a[high]-a[low])*(high-low),适合表长较大,而关键字分布又比较均匀的查找表
分块查找:又称索引顺序查找,它是顺序查找的一种改进方法。
下图,三个子表,第三个子表的数都大于第二个子表的数都大于第一个子表的数。
中间表,第一行是这段子表中最大的数。第二行是子表第一个元素的位置。
二叉查找(排序)树:先看根节点,再往左右的一边,再看子树的根节点,再左右,再根......
类似于折半查找。
下图,先构造二叉排序树,再查找。
第一个数就是树的根节点,
平衡二叉树
平衡因子:左子树的深度减去右子树的深度
平衡二叉树:平衡因子为-1, 0, 1
平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。
下图关于平衡因子,指的是平衡二叉树的平衡因子。
动态平衡要求的是要在插入是,时刻保持树的平衡性。
如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡,这种失去平衡的二叉树可以概括为四种姿态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。AVL树失去平衡之后,可以通过旋转使其恢复平衡。
平衡二叉树的构造:左旋、右旋、左右旋、右左旋
- 平衡查找树之2-3查找树(2-3 Tree)
2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgn,从而保证了最坏情况下的时间复杂度。
https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html
上面链接,其中,根节点分裂 的小节 的图是错误的,关于根节点分裂参看
https://blog.csdn.net/u011337574/article/details/80710824
- 平衡查找树之红黑树(Red-Black Tree)
在2-3查找树基础上改进的红黑树
- B树和B+树(B Tree/B+ Tree)
介绍:https://www.e-learn.cn/content/qita/809639
树表查找总结:
二叉查找树平均查找性能不错,为O(logn),但是最坏情况会退化为O(n)。在二叉查找树的基础上进行优化,我们可以使用平衡查找树。平衡查找树中的2-3查找树,这种数据结构在插入之后能够进行自平衡操作,从而保证了树的高度在一定的范围内进而能够保证最坏情况下的时间复杂度。但是2-3查找树实现起来比较困难,红黑树是2-3树的一种简单高效的实现,他巧妙地使用颜色标记来替代2-3树中比较难处理的3-node节点问题。红黑树是一种比较高效的平衡查找树,应用非常广泛,很多编程语言的内部实现都或多或少的采用了红黑树。
除此之外,2-3查找树的另一个扩展——B/B+平衡树,在文件系统和数据库系统中有着广泛的应用。
哈希查找:空间换时间,map的本质就是Hash表
例题