数据结构-查找-线性结构(顺序、折半、分块)查找

目录

一、顺序查找

*查找效率分析

二、折半查找

*查找效率分析

三、分块查找

*查找效率分析


一、顺序查找

有称线性查找,

算法思想:从头到尾挨个查找(反过来也行)

typedef struct{
    int *elem;                        //数据
    int TableLen;                     //长度
}SSTable;
int Search_Seq(SSTable ST,int key){
    int i;
    for(i=0;i<ST.TableLen && ST.elem[i]!=key; ++i); //从前往后找
    return i==St.TableLen ? -1 : i ;    //成功返回i,不成功 -1
}

*查找效率分析

        查找成功

                n个数据,每个数据查找成功概率为\tiny C_i=\frac{1}{n},第一(\tiny P_1)给数据对比1次为\tiny 1\times \frac{1}{n},第二(\tiny P_2)个对比2次为\tiny 2\times \frac{1}{n},依次类推,第n(\tiny P_n)位\tiny n\times \frac{1}{n},累加为\tiny ASL=\sum_{i=1}^{n}P_iC_i=\frac{1+2+3+...+n}{n}=\frac{n+1}{2}

        查找失败: n+1

对有序表

 一个成功结点查找长度=自身所在层数

一个失败结点查找长度=其父结点所在层数

二、折半查找

折半查找只适用有序的顺序表

typedef struct{
    int *elem;        //数据
    int TableLen;     //长度
}SSTable;
int Binary_Search(SSTable L,int key){
    int low=0,high=L.TableLen-1,mid;
    while(low<=high){
        mid=(low+high)/2;        //取中间位置
        if(L[mid]==key)          
            return mid;          //成功查找位置
        else if(L[mid]<key)
            high=mid-1;          //前部分继续查找
        else
            low=low+1;           //后部分继续查找
    }
    return -1;
}

*查找效率分析

查找成功

        成功=(第几层*每层成功结点树)累和/总成功结点数

        \tiny ASL=(1*1+2*2+3*4+4*4)/11=3

查找失败

        失败=(失败的层*每层数量)累和/总失败结点数

        \tiny ASL=(3*4+4*8)/12=11/3

判定树的构造

        右子树结点数-左子树结点树=0或1,且只有最后一层不满,高度就是二叉树树高\tiny \left \lfloor log_2n \right \rfloor+1

        失败结点数量为 n+1

三、分块查找

 ①:在索引表中确定待查记录所属的分块(可顺序,可折半)

②:在块间顺序查找

*查找效率分析

查找成功

        共14个元素;每个被查概率为\tiny \frac{1}{14}\tiny ASL=\sum_{i=1}^{n}P_iC_i

若索引表采用顺序查找,则查7:2次、10:3次、13:3次...  \tiny ASL=\frac{b+1}{2}+\frac{s+1}{2},当\tiny s=\sqrt{n},ASL=\sqrt{n}+1

若索引表采用折半查找,则查30:4次、27:3次...      \tiny ASL=\left \lceil log_2(n+1) \right \rceil+\frac{s+1}{2} n块,s个元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值