哨兵线性序列查找: 解决问题方法的效率,和算法的巧妙程度有关

最近在复习数据结构,看到查找算法,很有启发,哪怕是最简单的顺序查找,也有可以优化的地方。

例:给定一个整数数组,求数列中是否存在指定关键字K,若存在返回K所在的数组下标。

普通顺序查找:

        一般地,大家都会想到就顺序查找呗,简单粗暴,数组遍历一遍就完事儿了。

伪代码

for (i=0; i<arr.length; i++){
    if (arr[i] == k) return i;
}

哨兵顺序查找

        经过学习,可以在数组头插入一个哨兵值为K,这样查找时不需要判断边界,只要最后返回的值和哨兵下标不一致,那么数组中存在K,否则没找到,因为最后最后循环下标总会遇到哨兵。

伪代码
arr[0] = K;  // 设第一个元素为哨兵
for(i=arr.length-1; arr[i]!=K; i--);
return i;

对比

        两种写法对比就是,只需要牺牲一个整数的空间,就可以减少n次对比次数,普通顺序查找每次循环需要做2次判断  i<arr.length ,arr[i] == k 即2n次判断;而哨兵顺序查找只需要比较一次 i!=K ,只需要做n次判断;

        虽说这在一定程度上提高了查找效率,但是效率还是很低下的,时间复杂度还是O(n),只能说有一定的优化,大家最好还是用二分查找。

启发:

        解决问题方法的效率,和算法的巧妙程度有关。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值