数据结构复习——第七章:查找

1.查找的同时对表做修改操作(如插入或删除)则相应的表称之为动态查找表,否则称之为静态查找表。


2.衡量一个查找算法次序优劣的标准是在查找过程中对关键字需要执行的平均比较次数(即平均查找长度ASL).

 

3.线性表上进行查找的方法主要有三种:顺序查找、二分查找和分块查找。

(1)顺序查找的算法基本思想:是从表的一端开始顺序扫描线性表,依次将扫描到的结点关键字与给定值K比较,若当前扫描到的结点关键字与k相等则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。

   1)顺序查找方法可用链式存储结构和顺序存储结构实现。

   2)在顺序存储结构的顺序查找算法中所设的哨兵是为了简化循环的边界条件而引入的附加结点(元素),其作用是使for循环中省去判定防止下标越界的条件从而节省了比较的时间。

   3)在等概率情况下,查找成功时其平均查找长度约为表长的一半(n+1)/2.查找失败的话其平均查找长度为n+1.

(2)二分查找(又称折半查找),它的算法思想:是对一有序表中的元素,从初始的查找区间开始,每经过一次与当前查找区间的中点位置上的结点关键字进行比较,若相等,则查找成功,否则,当前查找区间的缩小一半,按k值大小在某半个区间内重复相同的步骤进行查找,直到查找成功或失败为止。

   1)二分查找在等概率的情况下查找成功的平均查找长度ASL为lg(n+1)-1,在查找失败时所需比较的关键字个数不超过判定树的深度,最坏情况下查找成功的比较次数也不超过判定树的深度┌lg(n+1)┐(不小于lg(n+1)的最小整数)

   2)二分查找只适用于顺序存储结构而不能用链式存储结构实现。因为链表无法进行随机访问,如果要访问链表的中间结点,就必须先从头结点开始进行依次访问,这就要浪费很多时间,还不如进行顺序查找,而且,用链存储结构将无法判定二分的过程是否结束,因此无法用链表实现二分查找。

(3)分块查找(又称索引顺序查找)的基本思想:是将原表分成若干块,各块内部不一定有序,但表中的块是"分块有序"的,并抽取各块中的最大关键字及其起始位置建立索引表。因为索引表是有序的,分块查找就是先用二分查找或顺序查找确定待查结点在哪一块,然后在已确定的块中进行顺序查找(不能用二分查找,因为块内是无序的)。分块查找实际上是两次查找过程,它的算法效率介与顺序查找和二分查找之间。

 

4.以上三种查找方法的比较如下表:

查找算法

存储结构

优点

缺点

适用于

顺序查找

顺序结构

算法简单,对表结构无任何要求

n很大时,查找效率低

 

链表结构

n较小的表的查找和查找较少但改动较多的表

二分查找

顺序结构

查找效率高

关键字要有序且只能用顺序存储结构实现

一经建立就很少改动又经常需要查找的线性表

分块查找

顺序结构

在表中插入或删除记录时就只要在该记录所属块内操作,因为块内记录的存放是随意的,所以插入和删除比较容易

要增加一个辅助数组的存储空间,并要进行将初始表分块排序运算

适用于有分块特点的记录

链表结构











5.树的查找:以树做为表的组织形式有一个好处,就是可以实现对动态查找表进行高效率的查找。这里讲到了二叉排序树和B-树,以及在这些树表上进行查找和修改操作的方法。


6.二叉排序树(BST)又称二叉查找树,其定义是:二叉排序树要或者是空树或者满足如下性质的二叉树:

  1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值;

  2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值;

  3)左、右子树本身又是一棵二叉排序树。

 

(1)二叉排序树实际上是满足BST性质的二叉树。

(2)二叉排序树的插入、建立的算法平均时间性能是O(nlgn),但其执行时间约为堆排序的2至3倍。二叉排序树的删除操作可分三种情况进行处理:

   1)*P是叶子,则直接删除*P,即将*P的双亲*parent 中指向*P的指针域置空即可。

   2)*P只有一个孩子*child,此时只需将*child和*p的双亲直接连接就可删去*p.

   3)*p有两个孩子,则将操作转换成删除*p结点的中序后继,在删去它之前把这个结点的数据复制到原来要删的结点位置上就完成了删除。

(3)二叉排序树上的查找和二分查找类似,它的关键字比较次数不超过树的深度。在最好的情况下,二叉排序树在生成的过程中比较匀称,此时的叉排序树是平衡的二叉树(也就是树中任一结点的左右子树的高度大致相同),它的高度约为1.44lgn,完全平衡的二叉树高度约为lgn.在最坏的情况下,输入的实例产生的二叉排序树的高度将达到O(n),这种情况应当避免。

 

7.关于B-树(多路平衡查找树)。它适合在磁盘等直接存取设备上组织动态的查找表,是一种外查找算法。

B树的阶是指B-树的度数,B-树的结点具有k个孩子时,该结点必有k-1(k>=2)个关键字。

实际上B-树是二叉排序树的推广,它就是一棵m叉树,且满足四个性质,这些性质与二叉排序树有相似之处,请仔细理解之。

 

8.上面的几种查找方法均是建立在比较关键字的基础上,因此它们的平均和最坏情况下所需的比较次数的下界是lgn+O(1).

 

9.散列技术:可以无需任何比较就找到待查关键字,其查找的期望时间为O(1).

散列表的概念:就是将所有可能出现的关键字的集合U(全集)映射到一个表T[0..m-1]的下标集上,这个表就是散列表。


10.而关键字与这个表地址之间以什么样的关系发生联系呢,这就要通过一个函数来建立,这个函数是以U中的关键字为自变量,以相应结点的存储地址为函数值,它就称为散列函数。将结点按其关键字的散列地址存储到散列表的过程称为散列。


11.根据某种散列函数,一个关键字的散列函数值是唯一的,但是有可能两个或多个不同关键字的函数值是相同的,这时就会把几个结点存储到同一个表位置上,这时就造成冲突(或碰撞)现象,这两个关键字称为该散列函数的同义词。

要完全(不是"安全")避免冲突需满足两个条件,一是关键字集合U不大于散列表长m,另一个是选择合适的散列函数,如果用h(ki)=0)这样的函数的话,看看有什么结果。

 

12.通常情况下U总是大大于m的,因此不可能完全避免冲突。冲突的频繁程度还与表的填满程度相关。装填因子α表示表中填入的结点数与表长的比值,通常取α≤1,因为α越大,表越满,冲突的机会也越大。


13.散列函数的选择有两条标准:简单和均匀。看看h(ki)=0这样的函数,简单是简单,但绝不均匀。

 

14.下面是常见的几种散列函数构的造方法:

(1)平方取中法

(2)除余法:它是用表长m来除关键字,取余数作为散列地址。若选除数m是关键字的基数的幂次,就会使得高位不同而低位相同的关键字互为同义词。因此最好选取素数为除数.

(3)相乘取整法:有两个步骤,先用关键字key乘上某个常数A(0)

(4)随机数法,此法以关键字为自变量,通过一随机函数得到的值作为散列地址。

 

15.处理冲突的方法:当不可避免发生冲突时,就必须对冲突加以解决,使发生冲突的同义词能存储到表中。

 

16.通常有两类方法处理冲突:开放定址法和拉链法。前者是将所有结点均存放在散列T[0..m-1]中,后者是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表中。

 

17.开放定址法的一般形式为:hi=(h(key)+di)%m1≤i≤m-1


18.开放定址法要求散列表的装填因子α≤1。开放定址法又有线性探查法、二次探查法和双重散列法之分。

(1)由于线性探查法在构造散列表时,遇到冲突(有同义词)的时候会按探查序列向后面的空地址插入,从而使原来应插入到此位置的结点又与它发生冲突,当一连串的位置均已有结点时,本应插入到这些位置的结点又只能将其插入到更后面的同一个空结点上,这种散列地址不同的结点争夺同一个后继散列地址的现象就是聚集或堆积。(注意,同义词发生冲突不是堆积)

为了减小堆积现象的发生,可以用二次探查法和双重散列法进行探查。

(2)拉链法解决冲突的做法是,将所有关键字为同义词的结点链接在同一个单链表中。

 

19.与开放定址法相比,拉链法有如下几个优点:

(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;(简单无堆积)

(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适于造表前无法确定表长的情况;(动态申表长)

(3)开放定址法为减少冲突要求装填因子α较小,当结点规模较大时会浪费很多空间,拉链法中α可以大于1,且结点较大时,其指针域可忽略不计,因此节省空间;(空间可节省)

(4)拉链法构造的散列表删除结点易实现,而开放定址法中则不能真正删除结点只能做删除标记。(删除易实现)


20.拉链法也有缺点:当结点规模较小时,用拉链法中的指针域也要占用额外空间,还是开放定址法省空间。

 

21.在散列表上的运算有查找、插入和删除,主要是查找。这三个操作的算法并不复杂,也容易理解。关于查找操作的时间性能,可看教材p202的表9.1。由表可见,散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。α越小,冲突的概率越小,但空间的浪费将增加,当α大小合适时,散列表上的平均查找长度就是一个常数,时间性能是O(1).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值