第9章 查找

前言

       在数据处理过程中,是否能在最短时间内查找到所需要的数据,是一个相当值得信息从业人员关心的问题。所谓查找,就是从数据文件中,寻找符合某特定条件的记录。而用来查找的条件就称为“键值”。

9.1 查找简介

       如果我们在电话簿中找某人的电话,那么这个人的姓名就成为在电话簿中查找数据的键值。通常影响查找时间长短的主要因素有算法的选择、数据存储的方式和结构。
查找的分类

  • 内部查找
  • 外部查找
  • 静态查找
  • 动态查找

9.2 常见查找方法

       一般来说,如果数据在查找前经过排序,将可大幅减少查找的时间。比较常见的方法有顺序法、二分查找法、斐波那契法、插值法、哈希法、m路查找树、B-tree等。

9.2.1顺序查找法

9.2.2二分查找法

9.2.3插值查找法

9.2.4斐波那契查找法

9.3 哈希查找法

       哈希法(或称散列法)这个主题通常和查找法一起讨论,主要原因是哈希法不仅被用于数据的查找,在数据结构的领域中,您还能将它应用于数据的建立、插入、删除与更新。
       例如符号表在计算机上的应用领域很广,汇编程序、编译程序、数据库使用的数据字典,都是利用提供的名称来找到对应的属性。而“哈希表”则属于静态表格中的一种,我们将相关的数据和键值存储在一个固定大小的表格中。

9.3.1 哈希法简介

9.3.2常见的哈希函数

  • 除留余数法
  • 平方取中法
  • 折叠法
  • 数字分析法

9.3.3碰撞问题

  • 线性探测法
  • 平方探测
  • 再哈希
  • 链表

9.3.4哈希法综合范例

小结

  • 静态查找是指数据在查找过程中,该查找数据不会有增加、删除或者更新等行为,例如符号表查找就属于静态查找。
  • 而动态查找就是指所查找的数据,在查找过程中经常性地增加、删除或者更新。例如B-tree就属于动态查找。
  • 顺序查找法又称线性查找法,它的方法是将数据一个一个地按顺序依次查找。此法的优点是文件在查找前不需要作任何的处理与排序,缺点为查找速度较慢。
  • 当数据量很大时,不适合使用顺序查找法。但如果预估所查找的数据在文件前端则可以减少查找的时间。
  • 二分查找法是将数据分割成二等份,再比较键值与中间值的大小,如果键值小于中间值,可确定要找的数据在前半段的元素,否则在后半段。
  • 二分法必须事先经过排序,且数据量必须能直接在内存中执行。此方法适合用于不需增删的静态数据。
  • 插值查找法(Interpolation Search)又叫做插补查找法,是按照数据位置的分布,利用公式预测数据的所在位置,再以二分法的方式渐渐逼近。
  • 一般而言,插值查找法优于顺序查找法,而如果数据的分布越平均,则查找速度越快,甚至可能第一次就找到数据。此法的时间复杂度取决于数据分布的情况,平均而言优于O(logn)。
  • 斐氏查找法(Fibonacci Search)又称斐波那契查找法,此法和二分法一样都是以切割范围来进行查找,不同的是斐氏查找法不以对半切割而是以斐氏级数的方式切割。
  • 斐氏级数:0,1,1,2,3,5,8,13,21,34,55,89,…。也就是除了第0和第1个元素外,每个值都是前两个数的和。
  • 当数据个数为n,且我们找到一个最小的斐氏数Fib(k+1)使得Fib(k+1)>n+1,则Fib(k)就是这棵斐氏树的树根,而Fib(k-2)则是与左右子树开始的差值,左子用减的;右子树用加的。
  • 平均而言,斐氏查找法的比较次数会少于二分查找树,但在最坏的情况下二分查找法较快,其平均时间复杂度为O(log2N)。
  • 哈希法不仅被用于数据的查找,在数据结构的领域中,还能将它应用在数据的建立、插入、删除与更新。
  • 所谓哈希法(Hashing)就是将本身的键值,通过特定的数学函数运算或使用其他的方法,转换成相对应的数据存储地址。
  • bucket(桶):哈希表中存储数据的位置,每一个位置对应唯一的一个地址(bucket address)。桶就好比一个记录。
  • 若两笔不同的数据,经过哈希函数运算后,对应到相同的地址,称为碰撞。
  • 当两个标识符I1和I2,经过哈希函数运算后所得的数值相同,即f(I1)=f(I2),则称I1与I2对于f这个哈希函数是同义词。
  • 所谓加载密度是指标识符的使用数目除以哈希表内槽的总数。
  • 完美哈希(perfect hashing):指没有碰撞又没有溢出的哈希函数。
  • 常见的哈希法有除留余数法、平方取中法、折叠法及数字分析法。
  • 最简单的哈希函数是将数据除以某一个常数后,取余数来当索引,这种方法称为除留余数法。
  • 平方取中法就是把数据乘以自己,之后再取中间的某段数字做索引。
  • 折叠法是将数据转换成一串数字后,先将这串数字拆成数个部分,最后再把它们加起来,就可以计算出这个键值的Bucket Address。
  • 数字分析法适用于数据不会更改,且为数字类型的静态类。在决定哈希函数时先逐一检查数据的相对位置及分布情形,将重复性高的部分删除。
  • 常见的溢出处理方法如下:线性探测法、平方探测、再哈希、链表。
  • 线性探测法通常把哈希的位置视为环形结构,如此一来若后面的位置已被填满而前面还有位置时,可以将数据放到前面。
  • 在平方探测中,当溢出发生时,下一次查找的地址是(f(x)+i^2)mod B与(f(x)-i^2)mod B,即让数据值加或减 i 的平方。
  • 再哈希就是一开始就先设置一系列的哈希函数,如果利用第一种哈希函数出现溢出时就改用第二种,如果第二种也出现溢出则改用第三种,一直到没有发生溢出为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值