数据结构学习——查找(3)

折半查找:

每次将待查元素所在范围减少一半,只适用于有序表,且限于顺序存储结构(对线性链表无效)
折半查找就是设定两个端点low和high,比较两端点中间元素mid关键字与给定值key的大小从而来取舍区间。

mid=(low+high)/2 (不能整除的情况向下取整)

若key<mid,则high=mid-1,舍弃mid右边区间

若key>mid,则low=mid+1,舍弃mid左边区间

当key==mid时,找到

当high<mid,结束

//非递归
int Search_Bin(SSTable ST,KeyType key){
    low=1;high=ST.length;
    while(low<=high){
        mid=(low+high)/2;
        if(ST.R[mid].key==key) return mid;
        else if(key<ST.R[mid].key)
           high=mid-1;
        else low=mid+1;
    }
    return 0;
}

//递归
int Search_Bin(SSTable ST,KeyType key,int low,int high){
    if(low>high)  return 0;
    mid=(low+high)/2; 
    if(key==ST.R[mid].key)  return mid;
    else if(key>ST.R[mid].key)  return Search_Bin(ST,key,mid+1,high);
    else return Search_Bin(ST,key,low,mid-1);
    
}

性能分析:

如果将表中全部元素关键字以二叉排序树的形式画出来,可以发现折半查找在查找成功的情况下比较次数等于经过的路径上的结点数或者说待查结点所在的层数,由此得比较次数不会超过树的深度;查找失败的情况下比较次数也不会超过树的深度。

设每个元素查找概率相等,表长n=\2^{h}-1,h为深度=log2(n+1)的满二叉树,则

ASL(成功时)={log2(n+1) }-1    (n>50)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值