2020数据结构-查找之顺序查找和折半查找

一、顺序查找和折半查找

1.顺序查找

  • 顺序表查找分为对一般的无序线性表的顺序查找和对关键字有序的顺序表的顺序查找。

1.1 一般线性表的顺序查找

  • 基本思想
    从线性表的一端开始,逐个检查关键字是否满足给定的条件。若查找到某个关键字满足的给定条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表中的一端,还未找到则返回查找失败的信息。

  • 算法分析
    对于有n个元素的表,给定的key值与表中第i个元素的关键字相等,需要进行n-i+1次关键字比较,查找成功时,顺序查找的平均长度为‘求和Pi(n-i+1)’;顺序查找不成功的平均长度为n+1。

  • 优缺点
    缺点:n较大时,平均查找长度长,效率低;优点:对数据的存储没有要求,顺序存储和链式存储均可,对表中的记录的有序性也没有要求。


  • 对线性的链表只能进行顺序查找。

1.2 有序表的顺序查找

  • 基本思想
    假设L是按照关键字从小到大进行排列的,查找的顺序是从前往后,待查找元素的关键字为key,当查找第i个元素时,发现第i个元素的值小于key,但第i+1个关键字的值大于key,这时可以返回查找失败的信息,因为后面的元素均大于key。

如图所示的判定树来描述有序线性表的查找过程。树的圆形节点表示存在的关键字,矩形节点表示失败结点(注:若有n个查找成功结点,则有n+1个失败节点)。
在这里插入图片描述

  • 算法分析
    查找成功的平均查找长度和一般线性表的顺序查找长度一样;查找失败时,指针走到了一个失败的结点。达到失败结点时的长度等于上面的一个圆形结点的所在层数;查找失败的平均查找长度在相等查找概率的情形下为ASL= n/2+n/(n+1)。

2.折半查找

  • 基本思想
    折半查找又称为二分查找,仅适用于有序的顺序表
    首先将给定值key与表中中间位置元素的关键字进行比较,若相等则查找成功,返回存储位置;若不等,则需要查找的元素的位置只能在中间元素以外的前半部分或后半部分,如此反复查找。

  • 举例
    在这里插入图片描述
    在这里插入图片描述
    以上便是折半查找的查找过程在后面的排序–折半插入排序时会使用到这种查找算法。

  • 描述
    折半查找可以用二叉树来表示,称为判定树。树中的每个圆形表示一个记录,其中存放的时关键字的值;最下面的方形的结点表示查找不成功的结点。从树中可以看出,查找成功时的查找长度为从根结点到目的结点的路径上的结点数,而查找不成功时的查找长度为从根结点到对应失败节点的父节点的路径上的结点数;每个节点值均大于其左子结点值,且均小于右子节点值。若序列有n个记录,则对应的判定树中有n个圆形结点,n+1个方形结点。
    在这里插入图片描述

  • 算法分析
    平均查找长度:[log2(n+1)]-1
    时间复杂度:O(log2n)
    平均情况下比顺序查找的效率高
    因为折半查找需要方便的定位查找区域,所以适合折半查找的存储结构必须具有随机存取的特性,因此该查找法仅适合于线性表的顺序存储结构,不适合于链式存储结构,且要求元素按关键字有序排列。

3.分块查找

  • 基本思想
    又称为索引顺序查找,吸取了上面两种的优点,即有动态结构,又适合快速查找。
    将查找表分为若干块。块内元素可以无序,但块之间有序,即第一个块中的最大关键字小于第二个块中的所有记录的关键字,以此类推;再建立一个索引表,表中的每个元素含有每个块中的最大关键字和各块中的第一个元素的地址,索引表按关键字有序排列。

  • 过程
    分块查找的过程分为两步:第一步在索引表中确定待查记录所在的块,可以顺序查找或折半查找索引表,第二步是在块内顺序查找。

  • 举例
    关键字集合为{88,24,72,61,21,6,32,11,8,31,22,83,78,54},按照关键字值24,54,78,88分为四块。
    在这里插入图片描述

  • 算法分析
    查找长度为索引查找和块内查找的平均长度。设索引查找和块内查找的平均查找长度分别为L1,Ls,则平均查找长度为L1+Ls。
    将长度为n的查找表均匀地分为b块,每块有s个记录,在等概率地情况下,若在块内和索引表中均采用顺序查找,则平均查找长度为(s·s+2·s+n)/2·s
    此时若s=sqrt(n),则平均查找长度为sqrt(n)+1;若对索引表进行折半查找,则平均查找长度为:[(向上取整)log2(b+1)]+(s+1)/2。

2019.10.20补充(王道课本未看到知识、细节更新)

  • 在顺序查找的代码中会设置一个烧饼==哨兵,这个哨兵的作用是使在内部循环时不必判断数组是否会越界。
  • 顺序查找的平均长度:当关键之key与第i个元素相等时,需要进行n-i+1次关键字的比较,则平均查找长度为 求和(pi(n-i+1))
    不成功时,每个元素的长度为n+1次,故为n+1.
  • 折半查找的判定树,若有序序列有n个元素,则对应的判定树有n个圆形的非叶节点和n+1个方形的叶节点。
  • 适合折半查找的存储结构必须具有随机存取的特性。因此 此方法仅适合线性表的顺序存储结构,不适合链式存储结构,且要求元素按关键字有序排列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

li_jeremy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值