数据结构检索(查找)之入土攻略(一)

目录

1 检索的基本概念

2 线性表的检索

2.1 顺序检索

2.2 二分检索

2.3 分块检索

3 集合的检索


1 检索的基本概念

度娘作为中国最牛的中文搜索引擎,各种问题在其中都会找到答案,其中不乏一些辣眼的奇葩提问。

不好意思,以上在扯犊子。

搜索引擎是检索的典型应用,当我们在搜索引擎上输入一个关键字,点击“搜索”按钮时,搜索引擎会带着关键字奔向索引数据库,检索到所有包含搜索词的网页,并依据它们的浏览次数与关联性等一系列算法确定网页级别,排列出顺序,最终以网页的形式显示给用户。

检索(查找):在一组记录集合中找到关键码值等于给定值的某个记录,或者找到关键码值符合特定条件的某些记录的过程。

提高检索效率的方法:

2 线性表的检索

平均查找长度:在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度是所有查找过程中进行关键字的比较次数的平均值。

2.1 顺序检索

(来源于《大话数据结构》)

上述图书尽管已经排列整齐,但还没有分类,因此我们要找书,只能从头到尾从尾到头一本一本地查看,直到找到或全部查找完为止。这就是顺序检索。

顺序检索:针对线性表里的所有记录,逐个进行关键码和给定值的比较。
–若某个记录的关键码和给定值比较相等,则检索成功
–否则检索失败(找遍了仍找不到)

查找成功:最好的情况就是在第一个位置就找到了,比较1次,时间复杂度为O(1),最坏的情况是在最后一位才找到,需要比较n次,时间复杂度为O(n)

ASL = (1 + 2 + ......+ n)* 1/n = (1+n)n/2n = (1+n)/2

查找失败:需要比较n+1次(设置了一个监视哨)

ASL = (n+1)n * 1/n = n+1

(p取1或0)

顺序检索的优缺点:

优点:插入元素可以直接加在表尾 Θ(1)

缺点:检索时间太长 Θ(n)

2.2 二分检索

将上述图书排列整齐后,还按照书名拼音的首字母排序放置,也就是对图书做了有序排列,这样利于查找。

二分查找前提:

  • Sorted 单调递增或递减
  • Bounded 存在上下界
  • Accessible by index 能通过索引访问

二分查找具体操作:查找31

伪代码

 while (left <= right) {
       mid = left + (right - left) / 2;
       if (array[mid] == target) {
           retrun mid;
       } else if (array[mid] <= target) {
           left = mid + 1;
       } else {
           right = mid - 1;
       }
}

判定树

二分查找的过程可用二叉树来描述,圆中的值表示一个记录的关键字值,树中最下面的叶结点均为方形。表示查找不成功的情况。

栗子

树高=4,等概率情况下

查找成功ASL = (1*1 + 2*2 + 3*3 + 4*4)/11=3

查找失败ASL = (3*4 + 4*8)/12 = 11/3

查找给定值的比较次数不超过树的高度。等概率查找时,查找成功的平均查找长度为:

折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。

2.3 分块检索

  分块检索原理与稀疏索引(分块索引)类似,可参考

《数据结构索引之杀死攻略(一)》:数据结构索引之杀死攻略(一)_闲狗的博客-CSDN博客_数据结构 索引方法

分块检索性能分析:

设线性表中共有 n 个数据元素,将表分成 b 块,每块有s个记录。

分块检索的优缺点:

优点:插入删除相对容易,没有大量记录移动

缺点:增加一个辅助数组的存储空间
          – 初始线性表分块排序
          – 当大量插入/删除时,或结点分布不均匀时,速度下降

3 集合的检索

集合(set):由若干个确定的、相异的对象(element)构成的整体
集合的检索:确定一个值是不是某个集合的元素

  集合的检索的原理与位图索引类似,可参考:

《数据结构索引之杀死攻略(三)》:数据结构索引之杀死攻略(三)_闲狗的博客-CSDN博客

仿佛检索的知识点到此就结束了,然而

下面跳转至《数据结构检索(查找)之入土攻略(二)》:Hash 函数之入土攻略_闲狗的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值