概念:寻找关键字符合条件的记录
类别:(动)静态查找、散列查找
相关:关键字、索引、预排序、平均查找长度(ASL)
静态查找(不更改数据集)
顺序查找:从头到尾,序列任意排序
折半查找:序列有序,顺序存储,范围更新(left<=mid<=right)
分块查找:顺序+折半+索引(块首指针项+最大关键字项),块之间“按块有序”
动态查找(更改数据集,查找失败时将数据添加到数据集)
B-树(一对二)
• 定义:空树或分支结点除根结点外子树数目范围m/2~m,根结点子树数目范围2~m,叶子结点在同一层,分支结点包含n个关键字和n+1个子树指针(关键字后接指针所指向的子树的所有结点的关键字均大于该关键字,前接指针的都大于,m为树的度,0<n<m)
• 查找:先找结点(外存),再找关键字(内存)
• 插入(分裂):插入到叶子结点,若关键字满,则”等分”分裂成左右两部分和中间一个关键字,将关键字和指向右部分的指针合并到父结点(递归直至关键字不满或产生新的根结点)
• 删除(合并):将非叶结点与后接子树中的最小结点交换,转化为删除叶子结点
○ 关键字数目>=m/2,直接删除关键字及其后接指针
○ 关键字数目=m/2-1且左(右)兄弟结点的关键字数目>=m/2,将左(右)兄弟结点的最大(小)关键字上移至父结点,将父结点划分这两子树的关键字下移至该结点,删除关键字及其后接指针
○ 关键字数目=m/2-1且左(右)兄弟结点(存在)的关键字数目=m/2-1,删除关键字及其后接指针,将剩余关键字及指针与父结点划分这两子树的关键字一起合并到右(左)兄弟结点(递归直至条件不满足或树的高度减小)
B+树(一对一)
• 定义:空树或分支结点除根结点外子树数目范围m/2~m,根结点子树数目范围2~m,叶子结点在同一层,分支结点包含n个关键字和n个子树指针(关键字前接指针所指向的子树的所有结点的关键字均不大于该关键字,m为树的度,1<n<=m)
• 查找:先找叶子结点(外存),在找关键字(内存)
• 插入(分裂):插入到叶子结点,若关键字满,则”等分”分裂成左右两部分,将左部分最右边的关键字复制到父结点(递归直至关键字不满或产生新的根结点)
• 删除(合并):只有叶子结点存储数据,其他结点分界值
○ 删除关键字及其前接指针,关键字数目>=m/2,不合并
○ 删除关键字及其前接指针,关键字数目<m/2且左(右)兄弟结点的关键字数目>m/2,将左(右)兄弟结点的最大(小)关键字右(左)移至该结点,复制该节点最右边的关键字到父结点
○ 删除关键字及其前接指针,该节点及兄弟结点的关键字数目均<=m/2,合并该结点与兄弟结点,删除父结点划分这两子树的关键字(递归直至条件不满足或树的高度减小)
散列查找(直接由关键字获得记录的存储位置,不进行任何比较)
散列函数
• 定义:在记录的关键字与它的存储位置之间建立一个映射关系,尽量保证一对一,但由于散列表的大小限制,存在多对一的情况,即冲突
• 构造方法:
○ 直接定址法
○ 数字分析法
○ 除留余数法
○ 平方取中法
○ 基数转换法
○ 折叠法
冲突解决方法(同义词即产生冲突的关键字)
• 开放定址法(初始探查冲突,沿后续探查序列探查,若探查到空闲地址,说明查找失败)
○ 线性探查法(存在一次聚集问题,对于非同义词,探查序列相同)
○ 二次探查法(存在二次聚集问题,对于同义词,探查序列相同)
○ 伪随机探查法(相同关键字使用相同的随机数种子)
○ 双散列探查法(两个散列函数)
• 链接法(同义词链表)
• 桶定址法(开放定址法+链接法)
各种冲突解决方法的平均查找长度: