• 考研数据结构——(查找)


    查找

    一、 查找的基本概念

    • 查找、查找表、关键字的概念

    在这里插入图片描述

    • 静态查找表 与 动态查找表

    在这里插入图片描述

    • 查找长度 与 平均查找长度

    在这里插入图片描述

    • 查找成功 计算

    在这里插入图片描述

    • 查找失败 的 计算

    在这里插入图片描述

    二、 顺序、折半、分块查找

    2.1 顺序查找

    1. 算法思想
    • 就是 从头到脚
    1. 算法实现
    • 顺序查找的代码

    在这里插入图片描述

    • 哨兵模式下的顺序查找
    1. 通过哨兵的方式,牺牲第一个存储位置,从后向前找。如果到哨兵的位置还没找到,就返回哨兵的位置0;
    2. 哨兵这个方式,不用判断越界问题

    在这里插入图片描述

    1. 查找效率分析
    • ASL(平均查找次数),即 成功平均查找次数与失败平均查找次数。

    在这里插入图片描述
    ⭐ 查找判定树

    在这里插入图片描述

    1. 算法优化
    • 排序优化
    1. 将查找表 有序
    2. 假如在升序表查找一个数时,如果已经大于查找的数了,就可以断定查找失败了,不用查到底部了。
    • 查找概率优化
    1. 这种情况就是 把 经常搜索的置于表前部。
    2. 利于成功查找算法, 对于失败查找,这个优化还是要遍历全表。

    在这里插入图片描述
    5. 顺序查找的知识总结

    在这里插入图片描述

    2.2 折半查找

    1. 算法思想
    • 要求查找表是 有序的顺序表

    在这里插入图片描述

    1. 增序的查找表 折半查找代码
    • 原理
    1. 设置 low 指向最小元素的下标, high 指向 最大元素的下标。
    2. 取中间 mid, 与查找数据x进行比较;
    3. 当 mid指向元素大于 x,(也就是 x在mid的左侧, 所以最大值调整到mid前一个元素,为啥是前一个?因为 mid处元素不是要找的) 设置high = mid-1;
    4. 同理, mid指向的元素 小于 x, low = mid + 1;
    5. 直到找到x, 否则 low 大于 high 时 终止。

    在这里插入图片描述

    1. 折半查找的 判定树
    • 注意 失败查找的紫色方块并不是结点, 而是 指向它的结点对比失败的情况,所以在做 折半查找 成功/失败 平均搜索长度时 注意不要算错。

    折半查找的 判定树

    ⭐ 判定树的构造

    • 注意 结点总数 是奇数/偶树分层的情况
      - 奇数时
      1. 选择中间结点分层
      - 偶数时
      1. 可以选择 [n/2] 向下取整, 即选择 较小的数作为中间结点, 另一个结点在其右子树;
      2. 可以选择 [n/2] 向下取整 + 1, 即选择 较大的数作为中间结点, 另一个结点在其左子树;

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    例如
    在这里插入图片描述

    • 折半查找一定是 平衡二叉树, 元素个数为n, 其数高 为 [log2(n+1)] 向上取整
    • 并且折半查找判定树也符合二叉排序树,并且失败个数正好等于空指针链域的个数

    在这里插入图片描述

    1. 折半查找的查找效率
    • 注意查找效率区别 二叉排序树, 可能等于二叉排序树,也有可能不等于,不等于的情况例如 二叉排序树只有左右子树的情况。
      在这里插入图片描述
    1. 扩展思维

    在这里插入图片描述
    6. 折半查找小总结

    在这里插入图片描述

    2.3 分块查找

    1. 分块查找的思想
    • 分块查找的算法思想:其实就是存储的元素,块内无序,块间有序
      可以建立一个索引表,索引元素存储一个块内的最大元素和这个块的开始和结束位置

    在这里插入图片描述

    • 查找过程

    在这里插入图片描述
    ⭐ 折半查找索引块时应该注意, 假如查找元素不是索引块存储的元素
    a. 查找元素正好存储在索引块

    • 折半查找 查找索引表时,如果查找元素正好是索引表所标识的之间,等于就行

    在这里插入图片描述

    b. 查找元素 不存在索引块

    • 那么折半查找low>high
      此时low指向的块索引就是 要查找元素所在的块
      因为索引表中保存的是最大的元素
      所以,我们要找的元素一定是在小于这个最大的元素的块中

    在这里插入图片描述

    c. 查找元素 不在范围

    在这里插入图片描述

    1. 分块查询的效率分析
    • 索引表采用顺序查询方式,查询一个元素的位置
    1. 顺序查询索引表
    2. 再顺序查找块内元素
    • 或者
    1. 索引表按折半查找
    2. 然后块内按顺序查找。

    在这里插入图片描述
    a . 顺序查索引表
    在这里插入图片描述
    2. 折半查索引表
    在这里插入图片描述

    ⭐ 如何最高效率分块?

    • n条记录,每块只有 根好n个记录时,分块,asl最小
    1. 分块查询知识点总结

    在这里插入图片描述

    三、 树形查找

    3.1二叉搜索树(二叉排序树) (BST)

    二叉排序树的定义

    在这里插入图片描述

    二叉排序树的查找代码

    ⭐ 采用非递归的方式实现

    • 因为二叉排序树,左子树的结点值都小于当前结点, 右子树的结点值都小于当前结点。
    • 因此查找时, 根节点不为空, 如果查找的值x小于 根节点, 则向左子树查找;如果x大于根节点的值,则向右子树开始查找;
    • 依次直到找到,或遍历到null;

    在这里插入图片描述

    ⭐采用递归方式实现

    在这里插入图片描述

    ⭐ 递归实现和非递归实现的区别

    • 针对于空间复杂度
    1. 非递归(循环) 实现, 空间复杂度最差为 O(1);
    2. 递归实现, 空间复杂度为 O(h); 取决于树的高度;

    二叉排序树的插入代码

    ⭐ 递归实现

    • 插入的结点一定是叶子结点;
    • 注意函数的结点遍历是引用类型,因为插入是带的插入的值一直找到合适的叶子结点处,判断是比叶子结点大还是小,从而插入到其的左右孩子结点(也就是创建一个新的叶子结点)。

    在这里插入图片描述
    ⭐ 采用非递归方式实现

    坑🕳。。。。。。。后续补

    二叉排序树的构建

    • 其实就是:
    1. 首先初始化一个 空根;
    2. 然后遍历插入序列(可以通过数组存放), 将每个遍历值,执行BST_Insert——也就是 二叉排序树的插入函数;
    • 注意 可能不不同的插入序列,生成的二叉排序树是一棵树;

    在这里插入图片描述

    二叉排序树的删除 (删除位置不同,复杂程度不同⭐)

    1. 删除叶子结点的思想
    • 叶子节点,直接删除,不会影响二叉排序树的结构

    在这里插入图片描述

    1. 删除只有 左子树 或者 右子树 的 中间结点
    • 假如删除只有左子树的 中间结点, 那么 直接用删除结点的左指针的结点(左子树) 替代 要删除的结点 即可;
    • 假如删除的结点只有右子树, 那 直接用删除结点 的 右指针 代替删除结点即可;

    在这里插入图片描述
    3. 🌙 删除的 结点 即有左子树, 也有 右子树。

    ⭐ 方法一:通过直接后继 补位 删除

    • 就是 因为二叉排序树的 中序遍历就是 有序的序列, 所以删除一个结点即有左子树,又有右子树; 则
    1. 用这个结点的直接后继代替其值; (直接后继就是该结点的右子树的 最左下的结点)
    2. 再将其直接后继删除(其直接后继一定是没有左子树[所以,直接后继可能是 叶子结点,也可能是 只有右子树的结点; 所以该结点的处理遵守前两种删除方案])

    在这里插入图片描述

    ⭐ 方法二: 用删除结点的直接前驱 代替 要删除的 结点

    • 我们要删除的结点,通过其直接前驱代替, 则:
    1. 要删除的结点 ,用其直接前驱代替; (直接前驱, 是要删除结点的 左子树的 最右下 结点);
    2. 删除其直接前驱结点 (该结点一定是 没有 右子树, 只有 两种情况 : 叶子结点、只有左子树的结点) 删除该结点, 要遵守前两种删除方案;

    在这里插入图片描述

    二叉排序树, 查找效率分析(平均查找长度)

    • 二叉排序树的平均查找长度 取决于其 树的高度, 最坏的情况也就是 O(h); h是树高, 因此 我们在构建一个 二叉排序树的时候,尽量的让它排成一个树高较矮的树, 尽可能的保持平衡,称为一个 二叉排序 平衡 二叉树;
    • 如果我们的二叉排序树能够保持平衡,那么它的平均查找长度就是 O (log2 n);
    1. 查找成功的 平均查找长度 asl
      在这里插入图片描述
    2. 查找失败的 平均查找长度 asl

    在这里插入图片描述

    二叉排序树的知识点回顾

    在这里插入图片描述

    3.2 平衡二叉树 (AVL)

    平衡二叉树的 概念

    • 注意 平衡因子的概念 : 其值等于 左子树高 - 右子树高
      在这里插入图片描述

    如何在构建平衡二叉树(插入)?

    1. 构成不平衡的原因!
    • 调整最小不平衡树,具体调整方法在下文;

    在这里插入图片描述
    🌙 2. 调整最小不平衡子树
    在这里插入图片描述
    ⭐a. LL情况(A的左孩子的左子树中插入导致不平衡)

    • 思考为什么所有子树高度都是H?
    1. 假如 AR不是H, 那么 无非就是 h-1,那么A本身就是不平衡因子,不用插入就造成了!那么 为h+1时, LL插入,并不会造成 不平衡
    2. 如何BR 不是 H, 那么无非就是 h+1, 这时候A本身也是不平衡, 如何使h-1, 此时LL插入,造成的不平衡因子是B, 不是我们要解决的A;
    • 解决思想:
    1. 将A的左孩子作为A;
    2. 然后按照 BL < B < BR < A < AR 的方式调整;
    3. 口诀就是: 右单旋转;

    在这里插入图片描述

    ⭐ b. RR情况 (在A的右孩子的右子树中插入导致不平衡)

    • 为什么子树高度都是H? 类LL分析即可;
    • 解决不平衡的思想:
    1. 将A的右子树作为A;
    2. 根据 Al < A < BL < B < BR 的顺序进行调整;
    3. 口诀就是: 左单旋转;

    在这里插入图片描述
    ⭐ LL 与 RR 解决不平衡的 代码 思想
    在这里插入图片描述
    ⭐ c. LR情况(A的左孩子的右子树插入导致的不平衡)

    • 解决思想, 将C(A的左孩子的右子树) 先左上旋调整, 再将B(C的父结点) 右上旋调整;目的是为了 将C放到A的位置。
      在这里插入图片描述
      左旋,右旋都遵守 BL < B < CL < C < CR < A < AR
      在这里插入图片描述
      插入到CL 或CR
      在这里插入图片描述

    ⭐ d. RL 情况(A的右孩子的左子树插入造成不平衡)

    • C(A的有孩子的左子树根)先右旋,再左旋;目的是让其代替A;
      在这里插入图片描述
      保证 AL < A < CL < C < CR < B < BR
      在这里插入图片描述
      插入到CL 或CR
      在这里插入图片描述

    ⭐⭐ 调整不平衡的小总结
    在这里插入图片描述

    填个坑(四种冲突直观图)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    练习RR、RL、LL、LR(注意单旋的时候从出现平衡因子有问题的孙子,具体是哪个孙子看四种模式)

    ⭐ ⭐ 注意 RR LL 找最小不平衡子树,将最小不平衡子树的根的失衡的孩子结点向上单旋。
    ⭐ ⭐ 注意 RL LR 找最小不平衡子树,将最小不平衡子树的根的失衡的孙子结点向上单旋两次到不平衡子树的根部。

    • 做题步骤:
    1. 从插入结点,往上寻找, 最小不平衡子树, 也就是 平衡因子不为 -1 0 1的三种情况;
    2. 分析 LL RR LR RL 四种情况, 进行 不平衡处理;
    1. RR调整
      在这里插入图片描述
      在这里插入图片描述

    2. RL 情况

    在最小不平衡树(以平衡因子不为 -1 0 1 的结点为根的子树) 右孩子的左子树插入产生冲突;
    在这里插入图片描述
    所以先解决左子树-> 右旋;
    在这里插入图片描述
    右子树-> 左旋;
    在这里插入图片描述
    3. LR类型
    在这里插入图片描述

    在最小不平衡树(以平衡因子不为 -1 0 1 的结点为根的子树) 的左孩子的右子树插入造成的不平衡;
    所以先解决 右子树-> 左旋; 再解决左子树 -> 右旋;
    在这里插入图片描述

    平衡二叉树的查找效率

    • 注意一下 平衡二叉树最少结点 计算

    在这里插入图片描述

    • 平衡二叉树 的 平均查找 长度 O(log 2 n)

    在这里插入图片描述

    平衡二叉树的 删除

    ⭐ 第一个例子

    1. 删除同二叉排序树的三种情况
      在这里插入图片描述

    2. 如果删除完,一路向上找不到 不平衡子树,则删除成功;

    3. 如果出现不平衡,则应该用③解决:
      在这里插入图片描述

    4. 根据孙子问题进行调整

    -具体调整类似插入不平衡的四种情况;

    在这里插入图片描述
    a . 右旋后
    在这里插入图片描述

    b . 再左旋

    在这里插入图片描述

    1. 调整完没有产生 不平衡向上传导情况
      在这里插入图片描述
      ⭐ 第二个例子(删除调整完不平衡后, 不平衡出现向上传导)

    2. 删除结点
      在这里插入图片描述

    3. 从删除结点向上找 不平衡子树,找不到就结束了

    4. 找到不平衡子树,再画出个头最大的儿子、孙子;
      在这里插入图片描述

    5. 通过解决冲突方法解决冲突
      在这里插入图片描述

    6. 发现出现不平衡向上传导

    循环执行第二步。
    在这里插入图片描述
    直到解决不平衡
    在这里插入图片描述

    🌙 二叉树删除的知识点回顾
    在这里插入图片描述

    平衡二叉树的 知识回顾

    在这里插入图片描述

    3.3 红黑树 (RBT)

    二叉排序树、平衡树、红黑树 的 增 删 查 的时间复杂度对比

    在这里插入图片描述

    为什么要发明红黑树?

    • 插入和删除会破坏平衡, 平衡二叉树进行调整,时间花销太大;
    • 而红黑树插入和删除的不经常会破坏 红黑 特性,即便调整时间开销也是常数级;

    在这里插入图片描述

    红黑树的 概念

    • 红黑树是二叉排序树
    • 与BST(二叉排序树) 相比 的概念如下:

    在这里插入图片描述
    ⭐ 黑高

    • 某结点(不包含该结点) 到 空叶子结点(包括该结点)的 路径上 所以黑结点的总数;

    在这里插入图片描述

    • 黑高 为 h, 则内部结点(不包括空结点) 的个数最少 为 (2 的 h次方 -1 ) 也就是一颗全黑的满二叉树(全黑就不用塞红结点, 满二叉树因为黑高相等)

    在这里插入图片描述

    红黑树的 性质

    在这里插入图片描述
    性质二的证明
    在这里插入图片描述

    红黑树的查找

    • 就是 x小于当前结点,向左找; x大于当前结点向右找;
    • 与二叉排序树一样;

    在这里插入图片描述

    红黑树的插入

    🌙 红黑树插入的规则 和 遇到冲突时的解决方式

    • 几个问题:
    1. 为什么插入的是非根结点要定义为红结点? 答:因为插入的是红结点不会破坏,平衡二叉树从某个结点到叶子的黑结点数相同的这个性质。

    在这里插入图片描述
    🌙 训练:
    ⭐ 注意插入是按 BST(二叉排序树)的方式插入

    1. 前三步
    • 第一步插入是 根, 直接染成黑色即可;
    • 第二步插入是 非根, 红色不冲突;
    • 第三步插入时 出现红红冲突了; 观察新插入的 0005 结点的叔叔结点是 黑叔,所以采用 黑叔的处理方式(旋转加 + 染色), 旋转类似平衡树解决冲突的方式, 本次是LL冲突,所以进行右单旋,父换爷; 再将父和爷结点分别颜色取反染色;

    ⭐ 注意这里 LL 单旋解决冲突的时候,好似是插入结点的父结点去向上旋!!!(所以是父换爷嘛)
    在这里插入图片描述
    2. 第四步

    • 插入新结点 0030 非根, 又出现了红红冲突;
    1. 看叔叔脸色, 0005 是红色, 用红叔解决方式: 先叔、父、爷三个结点自身颜色取反, 然后 爷结点当成新加入的结点去匹配规则; 本此插入,爷结点作为根结点, 直接染黑;

    在这里插入图片描述
    3. 第五步

    • 插入一个 新的结点 0040 非根结点,发生了红红冲突。
    1. 看叔叔结点为红叔, 且类型为 RR类型, 所以解决方式 —— 左单旋(父换爷)。 父、爷结点自身颜色取反。

    ⭐ 注意这里 RR 单旋解决冲突的时候,好似是插入结点的父结点去向上旋!!!(父换爷)
    在这里插入图片描述
    4. 第六步

    • 插入新结点0057 非根(红) 发生 红红冲突。
    1. 新结点的叔叔是红结点, 采用红叔解决方式, 叔、父、爷颜色自取反,然后将爷结点当成新加入的结点去匹配规则, 本题换完,爷爷是红结点,并且在非根位置不产生冲突!

    在这里插入图片描述
    5. 中间重复过程跳过

    • 当 0022 非根 插入时, 发生 红红冲突:
    1. 看0022 叔叔的为红叔: 所以 叔、父、爷结点自身颜色取反, 爷结点(0020)当成新结点匹配规则
      1. 将爷结点0020 看出新加入的结点, 发现 出现红红冲突:
      2. 0020结点的叔叔为红叔, 所以0020结点 的 叔、父、爷 自身颜色取反, 再将0020结点的 爷爷结点当成新的结点插入匹配规则;
        1. 0020的爷爷结点是根所以,根染黑即可;

    在这里插入图片描述
    6. 插入 0023结点(黑叔 LR调整)

    • 我们发现出现红红冲突, 0023结点的叔为黑叔, 本次插入是 LR冲突
    1. 采用 先左旋,再右旋 (儿换爷, 即新结点左旋换父亲,再右旋换到爷爷位置),再将 儿(自己)和爷 结点颜色取反;
      在这里插入图片描述
      左旋后
      在这里插入图片描述
      右旋后

      自己和曾经的爷结点颜色取反
      在这里插入图片描述
    1. 本次插入0018结点(RL调整)
    • 本次插入后 出现红红冲突, 0018的叔叔是黑叔, 本次插入时 RL冲突
    1. 所以先右旋,再左旋, 儿换爷(本结点右旋换父,再左旋换爷结点) , 再儿、爷结点染色(自身颜色取反);

    在这里插入图片描述
    先右旋
    在这里插入图片描述
    再左旋
    在这里插入图片描述
    儿、爷结点染色(自身颜色取反)
    在这里插入图片描述

    红黑树的知识点框架

    在这里插入图片描述

    红黑树的删除操作

    重点预测
    在这里插入图片描述

    四、 B树 与 B+树 的 基本概念

    4.1 B树 (多路平衡查找树)

    五叉查找树

    • 最少有1个关键字, 分两个叉;
    • 最多有4个关键字, 分五个叉;
    • 失败结点指的是在一个范围的数据;
    • 进行查找时,块内的元素可以通过折半查找的方式;

    在这里插入图片描述

    如何保证查找效率

    1. 保持每个块内的关键字和分叉数量
      在这里插入图片描述
    2. 保证 平衡
      在这里插入图片描述

    这就是B树

    • 对于m叉B树 满足
    1. 每块内的 关键字(【m/2】向上取整 -1), 分支数 (【m/2】向上取整 )
    2. 保证树为 绝对平衡,就是每个子树都相同高度。

    在这里插入图片描述

    在这里插入图片描述

    B树的高度问题

    在这里插入图片描述
    👆 最小高度
    👇 最大高度

    推算方法一:
    在这里插入图片描述
    推算方法二:
    在这里插入图片描述

    小的知识回顾

    在这里插入图片描述

    B树的插入 .

    1 . 初始插入

    • 当插入到非终端结点, 关键字满了后会分叉, 将最中间的关键字提到上层。
      在这里插入图片描述
    1. 新元素一定是插入到终端结点的

    在这里插入图片描述
    3. 失败结点只能出现在最下一层
    在这里插入图片描述
    4. 非根结点出现关键字满的情况,将中间关键字上提
    在这里插入图片描述
    ※ 应当放到指向该结点的指针右侧位置
    在这里插入图片描述
    ※ 如果上层结点的关键字也满了,继续向上提
    在这里插入图片描述
    ⭐ B树插入小总结
    在这里插入图片描述

    B树的删除

    ⭐ 非终端结点删除的讨论

    • 可以选择
    1. 直接后继(删除关键字右孩子的左子树最左下位置的结点的第一个关键字)
    2. 直接前驱(删除关键字左孩子的右子树最右下位置的结点的最后一个关键字)

    在这里插入图片描述

    ⭐ 删除终端结点情况分析

    • 删除后不低于关键字下线,直接删除
    • 若删除后低于每个结点的关键字下限【m / 2】向上取整 -1;
    1. 左右兄弟结点的关键字够,则借用左右兄弟结点; 借用右兄弟的就是父关键字下来到最后一个位置,右兄弟第一个关键字到父关键字位置;借左兄弟的就是父关键字下来称为第一个位置,左兄弟最后一个关键字到父关键字位置;
    2. 如果左右兄弟结点的关键字都不够借,采用合并算法; (将双亲结点的父关键字拿下来和两个兄弟关键字合并,如果双亲结点的关键字少了,再采用删除情况分析, 如果借到根结点了关键字直接没了,则直接删除)
    1. 借用右兄弟结点的关键字
      在这里插入图片描述
    2. 借用左兄弟结点的关键字

    在这里插入图片描述

    1. 合并规则
      在这里插入图片描述

    B树删除、插入知识总结

    在这里插入图片描述

    4.2 B+树

    个人提示:

    叶子结点存储真实信息;

    非终端结点,只是索引,并没有真实数据,是分块查询的思想,为了快速查询的;

    叶子结点直接可以直接直接指向,所以可以直接顺序查询;

    B+树符合条件

    在这里插入图片描述

    B树与B+树区别

    ⭐B+树:

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    ⭐ B树:

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    ⭐ 综合整理
    在这里插入图片描述

    五、 散列表

    5.1 散列表介绍

    在这里插入图片描述

    5.2 冲突解决方法

    拉链法

    在这里插入图片描述
    ⭐ 查找长度

    • 大多数教材不会把空指针的比较算进查找长度中,有的教材会算入;

    在这里插入图片描述
    在这里插入图片描述
    ⭐ 成功平均查找长度分析
    在这里插入图片描述

    ⭐ 失败 平均查找长度分析 (装填因子)
    在这里插入图片描述
    ⭐ 小优化
    在这里插入图片描述

    开放定址法

    在这里插入图片描述
    🌙 增量序列 di 的递推方式:

    ⭐ 线性探测法

    • 其实就是从散列位置向后逐次找不冲突的位置‘;

    在这里插入图片描述
    在这里插入图片描述

    ⭐查找成功分析

    • 可能会和同义词和非同义词都发生冲突;

    在这里插入图片描述

    ⭐ 查找失败分析

    • 与拉链法不同的是, 开放定址法的线性探测法遇到空位置对比算一次查找长度;

    在这里插入图片描述
    ⭐ 删除分析

    • 因为 查找失败分析时,遇到空位置可以直接断定 为查找失败, 但是有时候删除会造成中间位置为空,因此我们的删除操作为了不影响到查找分析误判为查找失败,所以采用逻辑删除的方式:也就是把删除的位置特殊标记;

    在这里插入图片描述

    有时候就很低效
    在这里插入图片描述
    ⭐ 查找效率分析
    成功:
    在这里插入图片描述

    ⭐ 线性探测法的弊端
    在这里插入图片描述

    平方探测法(二次探测法 )

    • 平方探测法相比 线性探测法 不易 出现 堆积问题。
    • 在散列位置向右向左依次探测di,以平方探测的规律;

    在这里插入图片描述

    • 注意一个点: 就是 采用 平方探测法 的 表长 为 一个 可以表示成 4j+3 的素数,这样冲突时才可以探测完整张表,否则冲突时会一直在冲突点进行探测,有的点始终探测不到。

    在这里插入图片描述

    伪随机探测

    • 根据一个伪随机序列进行增量探测;

    在这里插入图片描述

    注意点:

    • 上面说了,直接删除,空位置会造成查询问题
    • 采用线性探测法容易出现一连串伪删除标记,采用平方探测法可以避免聚集 现象。

    在这里插入图片描述

    再散列法

    在这里插入图片描述

    5.3 散列函数的设计

    1. 除留余数法
    • 规则是取表长为m的最接近m且不等于m的指数进行模除;

    在这里插入图片描述

    ⭐为什么要模除这个最大质数P?

    • 质数取余可以让随机的数分布更加均匀,冲突更少,来自《数论》。

    在这里插入图片描述

    1. 直接定值法
    • 常用于学号这类连续的数的映射;

    在这里插入图片描述

    1. 数值分析法
    • 像映射电话号码这类键,可以采用,因为这些数据会有一部分重复数据,可以将这个重复部分当散列值

    在这里插入图片描述
    4. 平方取中法
    在这里插入图片描述

    知识总结

    在这里插入图片描述

  • 相关阅读:
    MySQL的行锁和表锁
    CrossOver23.6软件激活码怎么获取 CrossOver软件2023怎么激活
    编程未来规划笔记
    阿里云对象存储oss私有桶生成链接
    Windows Ubuntu子系统使用USB教程
    如何利用Python实现熵权法?
    macOS 中 聚焦搜索 的使用教程
    Fiverr是什么?做外贸独立站能在Fiverr找到哪些外包服务?
    .NET Web入门到高级路线(新版本)
    物理服务器与虚拟机:主要区别和相似之处
  • 原文地址:https://blog.csdn.net/Seven597/article/details/125462876