各类查找算法
查找算法分为静态查找和动态查找,其中,静态查找包括:顺序查找、折半查找、分块查找;动态查找包括:二叉排序树和平衡二叉树。
静态查找表
顺序查找
把待查找的key放到哨兵的位置,哨兵一般是下标为0的位置,在依次从后往前把表中的元素与key作比较,如果返回值为0,则查找失败,如果返回值为元素的下标值i(i是不等于0的),则查找成功。
哨兵的作用是加快执行速度,免去了每次在查找结束后都要判断查找位置是否越界的步骤。
优点
- 对表中记录的有序性没有要求
- 对存储结构没有要求,顺序存储和链式存储都可以。
缺点
- 当表长过长时,查找效率低下。
折半查找(二分查找)
首先将给定的key值与表中的中间位置的元素作比较,若相等,则返回该元素的存储位置;若不相等,则表示所需查找的元素只能在中间元素以外的前半部分或者后半部分,然后缩小范围,在小范围内继续进行同样的查找,知道找到为止。若关键字不在表中时停止查找的标志是:查找范围的上界<=查找范围的下届
时间复杂度
O(logn)
缺点
只适用于顺序存储结构,且要求表中数据按关键字有序排列
分块查找(索引顺序查找)
先将查找表分成若干个子表,要求第一个块的最大关键字小于第二个块的所有关键字,以此类推,这样保证块间是有序的,把各个子表中的最大关键字组成一个索引表,表中还包含各子表的起始地址。表的特点就是块间有序,块内无序。因此,查找时块间进行顺序查找或折半查找,块内进行顺序查找。
动态查找表
二叉排序树(二叉查找树)
定义
若该树有左子树,则左子树的所有节点值小于根节点的值;若该树有右子树,则其右子树的所有节点的值都大于根节点的值,且左右子树也分别为二叉排序树
查找过程
当二叉排序树不为空时,首先将给定的值与根节点的关键字作比较,若相等,则查找成功,否则将依据给定的值和根节点的关键字之间的大小关系,分别在左子树或者右子树上继续查找,若树中不存在关键字等于给定值的节点时,则该给定值作为树的新节点进行插入。
注:中序遍历二叉排序树可以得到一个关键字的有序序列
平衡二叉树
或者是一颗空树,它的左子树和右子树的高度之差绝对值不大于1,且它的左右子树也是平衡二叉树。
采用二叉链表
B树和B+树
B树(多路平衡查找树)
B树,又称多路平衡查找树,B树中所有节点的孩子个数的最大值称为B树的阶,通常用m表示。一颗m阶B树或为空树,或为满足如下特性的m叉树:
- 树中的每个节点至多有m颗子树,至少还有m-1个关键字
- 若根节点不是终端节点,则至少有两颗子树
- 除根节点外的所有非叶节点至少还有【m/2】颗子树,即至少含有【m/2】-1个关键字
- 所有的叶节点都出现在同一层次上,并且不带信息。
B+树
B+树是应数据库所需而出现的一种B树的变形树。
一颗m阶B+树需满足下列条件:
- 每个分支节点最多有m颗子树
- 非叶根节点至少有两颗子树,其他每个分支节点至少【m/2】颗子树
- 节点的子树个数与关键字个数相等
- 所有叶节点包含全部关键字及指向相应记录的指针
(散列表)哈希表查找
根据关键字码的值直接访问的数据结构,即通过关键字的值映射到表中的一个位置以加快查找速度,其中映射函数叫做散列函数,存放记录的数组叫做散列表。
散列函数的构造方法
- 直接定址法
- 除留余数法
- 平方取中法
- 数字分析法
- 折叠法
- 随机数法
哈希冲突的解决方法
- 线性探测法
- 平方探测法
- 再散列法
- 伪随机序列法
- 拉链法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix