【数据结构-查找】1.通俗易懂讲解 —— 顺序-折半-分块查找

平均查找长度是所有查找过程中进行关键字的比较次数的平均值

失败的平均查找长度:图画出来,补充为二叉树,其中补上的层数之和是分子,列表长度 len+1 是分母

顺序查找

顺序查找主要是用于线性表中的查找。在查找中,待查找数列有 无序数列有序数列 两种

class Solution{
public:
	bool unorderSearch(Node* head, int value) {
		while(head) {
            if(head->val == value) {
                return true;
            }
            head = head->next;
        }
        return false;
	} 
};

平均成功查找长度:ASL成功 = n + 1 2 \frac{n+1}{2} 2n+1

解释:如果第一个点找到,就是 1 ;如果第二个点找到,就是 2 ;依次类推,第 n 个点找到,就是 n;一共有 n 种可能,所以 ASL成功 = 1 + 2 + 3 + … … + n n \frac{1+2+3+……+n}{n} n1+2+3++n = n ( n + 1 ) 2 n \frac{n(n+1)}{2n} 2nn(n+1) = n + 1 2 \frac{n+1}{2} 2n+1

无序列表 · 顺序查找平均失败查找长度:ASL失败 = n + 1 n+1 n+1

解释:就是在前n个找不到,继续探索下一个(但下一个是null),因此在n的基础上还要加1,所以为 ASL失败 = n + 1 n+1 n+1

有序列表 · 顺序查找平均失败查找长度:ASL失败 = n 2 + n n + 1 \frac{n}{2} + \frac{n}{n+1} 2n+n+1n

解释:从以下图示中可以知道,在相等查找概率 的情况下,到达某个点查找失败概率为 1 n + 1 \frac{1}{n+1} n+11 (有 n+1 个区间)。而分子则是节点所在层次,亦从下图矩形位置可以得到,也就是 1 + 2 + … … + n + n 1+2+……+n+n 1+2++n+n 。综上所述





顺序查找的特点:好处是对数据元素的存储没有要求,顺序存储或者链式存储都可以;缺点是当n较大时,平均查找长度较大,效率低。

折半查找

仅适用于 有序顺序表 。它的基本思想是:首先将给定值 key 与表中中间位置的关键字比较,若相等,则查找成功;若不相等,在搜小范围之后继续进行同样查找,如此重复。



bool bisearch(vector<int> &nums, int value) {
    int start = 0;
    int end = nums.size();
    while(start <= end) {
        int mid = (start + end) / 2;
        if(nums[i]==value) {
            return true;
        } else if (nums[i] < value) {
            start = mid + 1;
        } else {
            end = mid - 1;
        }
    }
    return false;
}

平均成功查找长度:ASL成功 = ( 层 数 ) ∗ ( 同 层 节 点 个 数 ) n \frac{(层数)*(同层节点个数)}{n} n()()

平均失败查找长度:ASL失败 = ( 层 数 ) ∗ ( 同 层 与 该 节 点 子 节 点 情 况 类 似 个 数 ) n + 1 \frac{(层数)*(同层与该节点子节点情况类似个数)}{n+1} n+1()()

以如下图示:



平均成功查找长度:ASL成功 = 1 ∗ 1 + 2 ∗ 2 + 3 ∗ 3 + 4 ∗ 1 7 \frac{1*1+2*2+3*3+4*1}{7} 711+22+33+41= 18 7 \frac{18}{7} 718

平均失败查找长度:ASL失败 = 2 ∗ 1 + 3 ∗ 5 + 4 ∗ 2 8 \frac{2*1+3*5+4*2}{8} 821+35+42= 25 8 \frac{25}{8} 825

分块查找

基本思想:将查找表分为若干子块。块内的元素可以无序,但块与块之间是有序的,第一个块中最大关键字小于第二个块中的所记录的所有关键字,同理,第二个块中最大关键字小于第三个块中的所记录的所有关键字,依次类推。


分块查找的平均查找长度为索引查找和块内查找的平均长度之和。设索引查找和块内查找的平均查找长度分别为L1L2,那么分块查找的平均查找长度为 $ALS = L1 + L2 $

将长度为 n 的查找表均匀分为 b 块,每块有 s 个记录,在等概率情况下,平均查找长度为 A L S = A L S 块 间 + A L S 块 内 = L 1 + L 2 = b + 1 2 + s + 1 2 = s 2 + 2 s + n 2 s ALS = ALS_块间 +ALS_块内= L1 + L2 = \frac{b+1}{2} + \frac{s+1}{2} = \frac{s^2 + 2s + n}{2s} ALS=ALS+ALS=L1+L2=2b+1+2s+1=2ss2+2s+n

此时,若 s = n s=\sqrt n s=n ,则平均查找长度取最小值 n + 1 \sqrt n +1 n +1;若对索引表采用折半查找时,则平均长度为 A L S = A L S 折 + A L S 顺 = L 1 + L 2 = l o g 2 ( b + 1 ) + s + 1 2 ALS = ALS_折 +ALS_顺= L1 + L2 = log_2(b+1) + \frac{s + 1}{2} ALS=ALS+ALS=L1+L2=log2(b+1)+2s+1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_之桐_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值