数据结构 第六章 查找(一) B树,B+树

1. 查找的基本概念

(1) 平均查找长度 ASL = 每个元素 查找概率 * 找到第i个元素需要进行的比较次数 的和。
(2) 决策树(判定树)

2. 顺序查找法

(1) 一般线性表的顺序查找
a. 若每个元素查找概率相同,则 ASL(成功) = 1 + 2 + . . . + n n \frac{1 + 2 + ... + n}{n} n1+2+...+n= n + 1 2 \frac{n+1}{2} 2n+1
b. ASL(失败) = n或n+1,取决于代码写法。
(2) 有序表的顺序查找
a. 若每个元素查找概率相同,则 ASL(成功) = 1 + 2 + . . . + n n \frac{1 + 2 + ... + n}{n} n1+2+...+n= n + 1 2 \frac{n+1}{2} 2n+1
b. ASL(失败) = 1 + 2 + . . . + n + n n + 1 \frac{1 + 2 + ... + n+n}{n+1} n+11+2+...+n+n = n 2 \frac{n}{2} 2n+ n n + 1 \frac{n}{n+1} n+1n
在这里插入图片描述

3. 折半查找法(前提是数组有序数组)

(1) ASL = log(n + 1) - 1

在这里插入图片描述

//折半查找算法
int Search_Bin(SSTable *ST,keyType key){
    int low=1;		//初始状态 low 指针指向第一个关键字
    int high=ST->length;	//high 指向最后一个关键字
    int mid;
    while (low<=high) {
        mid=(low+high)/2; //int 本身为整形,mid为下取整
        //如果 mid 指向的同要查找的相等,返回 mid 所指向的位置
        if (ST->elem[mid].key==key)
        {
            return mid;
        }
        //如果mid指向的关键字较大,则更新 high 指针的位置
        else if(ST->elem[mid].key>key)
        {
            high=mid-1;
        }
        //反之,则更新 low 指针的位置
        else{
            low=mid+1;
        }
    }
    return 0;
}

4. 分块查找法

设共n个元素,每块s个元素,共b = n s \frac{n}{s} sn块。块内无序,块间有序。
(1) 顺序查找确定块:ASL(成功) = s 2 + 2 s + n 2 s \frac{s^2 + 2s + n}{2s} 2ss2+2s+n,s = n \sqrt{n} n 时取最小值
(2) 二分查找确定块:log( n s \frac{n}{s} sn + 1) + s − 1 2 \frac{s-1}{2} 2s1
在这里插入图片描述

5. B树及其基本操作、B+树及其基本概念

(1) B树
[1] m阶B树,每个节点最多有m个孩子。
[2] 每个节点最多有 m − 1 m-1 m1个关键字(可以存有的键值对)。
[3] 根节点最少可以只有1个关键字。
[4] 非根节点至少有 m 2 \frac{m}{2} 2m个子树,即 ⌈ m 2 ⌉ − 1 \left \lceil \frac{m}{2} \right \rceil -1 2m1个关键字。
[5] 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
[6] 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。
[7] 每个节点都存有索引和数据,也就是对应的key和value。
[8] 所以,根节点的关键字数量范围: 1 < = k < = m − 1 1 <= k <= m-1 1<=k<=m1,非根节点的关键字数量范围: ⌈ m 2 ⌉ − 1 \left \lceil \frac{m}{2} \right \rceil -1 2m1 <= k <= m-1。
[9]n个关键字的m阶B树
最大高度: H ≤ 1 + log ⁡ ⌈ m 2 ⌉ ( n + 1 2 ) H\le 1+\log _{\left \lceil \frac{m}{2} \right \rceil}(\frac{n+1}{2}) H1+log2m(2n+1)
最小高度: H ≥ log ⁡ m ( n + 1 ) H\ge \log_{m}(n+1) Hlogm(n+1)
(2) B+树
[1] B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
[2] B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
[3] B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
[4]B+树支持顺序索引,B树不支持。

B树插入操作模拟:

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值