7-1顺序查找(数据结构)

一.基础知识
1.查找——线性结构——顺序查找
2.查找方式:从头至尾(或从尾至头)依次查找
3.查找长度:比较次数

eg.找到43需要比较9次
在这里插入图片描述
4.平均查找长度ASL
①等概率(通常情况)
②不等概率(见后文)

(1)查找成功
找到26,查找长度2
找到30,查找长度3
查找每个是等概率的,即1/8
在这里插入图片描述
ASL=1×1/8+2×1/8+2×1/8+3×1/8+3×1/8+3×1/8+3×1/8+4×1/8
=(1+2×2+3×4+4×1)/8=2.625

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

(2)查找失败
在这里插入图片描述
如插入22,需要比较3次,放到21的右子树
在全过程中,失败共有9个位置可放(紫色)
ASL失败=3×1/9+3×1/9+3×1/9+3×1/9+3×1/9+3×1/9+3×1/9+4×1/9+4×1/9=(3×7+4×2)/9=3.22

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

求ASL:
在这里插入图片描述
二.实现

(一)方法一

TableLen表示表的长度(并非数组)
图中TableLen为11(蓝色部分)
标号从0开始,到10
在这里插入图片描述
可以用for循环来依次对比

for(i=0;i<ST.TableLen//小于11,从0到10
&&ST.elem[i]!=key;i++)//elem为动态分配数组,如果当前未找到,i++

查找成功返回当前i,失败返回-1

return i==ST.TableLen?-1:i;//i=11说明查找失败,返回-1

(二)方法二(哨兵法)

将待查找的数据放在0号位
表中数据从1开始,即数组下标从1开始
TableLen=11(11个数据)
注:法一和法二的TableLen均为11

逆向对比,即0号位的16和11号位的37对比
在这里插入图片描述
同样可以用for循环表示

for(i=ST.TableLen;//i=11,数组下标从1到11
ST.elem[i]!=key;i--)

查找成功返回i,查找失败返回0

return i;

优点:哨兵法进行循环时无需判断下标是否越界
在这里插入图片描述
总结:
ASL成功=(1+2+3+…+n)/n=(1+n)/2
ASL失败=n+1

(1)对于成功,右侧第一个为1×1/n,右侧第二个为2×1/n…1号位为n×1/n
(2)对于失败,待查找元素不在n个元素中,即比较n次没有匹配上,在0号位的第n+1次匹配成功

三.对于有序表(递增/递减排序)
在这里插入图片描述
升序表查找21,找到29仍失败,后面的无需再次比较,对于查找失败情况的效率提高
在这里插入图片描述
ASL成功=(1+2+3+4+5+6)/6=3.5
ASL失败=(1+2+3+4+5+6+6)/7=3.857
即:
ASL成功=(1+2+3+…+n)/n=(n+1)/2
ASL失败=(1+2+3+…+n+n)/(n+1)=n/2+n/(n+1)

四.对于概率不相等

同样计算方式
给出概率
7: 15%
13: 5%
19: 10%
29: 40%
37: 28%
43: 2%
在这里插入图片描述
将概率大的放到前面,对于查找成功情况的效率提高,对于查找失败情况可能不如有序表
在这里插入图片描述
五.总结

1.ASL 的数量级反应了查找算法时间复杂度,上述时间复杂度均为O(n)
2.哨兵法无需判断下标是否越界;
递增或递减排序可以提高失败查找效率;
概率不同时,按概率递减排序可以提高成功查找效率
3.评价⼀个查找算法的效率时,通常考虑查找成功/查找失败两种情况的ASL,ASL通常越小越好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡__卡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值