一、本章学习小结

(一)查找的一些概念和术语:

1、查找表:是由同一类型的数据元素(或记录)构成的集合,例如线性表、树表及散列表等。

2、关键字:是数据元素(或记录)中某个数据项的值,用来标识一个数据元素(或记录)。①主关键字:唯一标识一个记录的关键字;②次关键字:可以识别若干记录的关键字。

3、查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。查找成功返回的结果可能是整个记录的信息,或是该记录在查找表中的位置;查找不成功给出一个“空”记录或是“空”指针。

4、动态查找表和静态查找表:若在查找的同时对表做修改操作(如插入、删除等),称为动态查找表,否则称静态查找表。

5、平均查找长度:在确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值(平均值)。

(二)一些查找表的查找算法

1、线性表的查找

①顺序查找:

A不设哨兵,算法如下(关键字类型基于int类型):

B设置哨兵

 算法B对A做了改进,即设置了哨兵,免去了查找过程中每一步都要检测整个表是否查找完毕。在传统顺序查找中,一次循环要判断比较2次(一次是判断i值是否合理,另一次是与关键字进行的比较),而改进的算法只需比较1次,当数据量较大时,可以通过减少时间提高一定的效率。

时间复杂度:O(n),空间复杂度:O(1);平均查找长度:(1+2+...+n)/n=(n+1)/2

优点:算法比较简单,既适用于顺序结构,也适用于链式结构,无论记录是否按关键字有序均可应用;

缺点:当数据量很大时,查找效率低

②折半查找(二分查找)

折半查找每一次查找比较都使查找范围缩小一半,与顺序表查找相比,提高了查找效率,但折半要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

时间复杂度:O(log2n);查找成功的平均查找长度为(n+1)/n*log2(n+1)-1

优点:比较次数少,查找效率高;

缺点:只能用于顺序存储的有序表。

③分块查找(索引顺序查找)

索引表:由索引项组成(索引项:基于每个子表(或称块)建立的,包括关键字项(其值为该子表内的最大关键字)和指针项(指示该子表的第一个记录在表中的位置))

确定块的查找可以用顺序查找,也可以用折半查找,而块中记录是无序的,只能顺序查找。

优点:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。

缺点:要增加一个索引表的存储空间,并要对索引表进行排序运算。

2、树表的查找

①二叉排序树(二叉查找树):对排序和查找都很有用的特殊二叉树

二叉排序树的二叉链表存储的类型定义与树类似,此外,二叉排序树的查找、插入、创建等操作可以通过递归实现,删除操作较为复杂一点,要分情况:①被删除的结点是叶子结点(先找到存放该值的结点,指向该结点和其双亲的指针,判断是否为叶子结点)。②被删除的结点只有左子树或只有右子树。③被删除的结点有左子树和右子树。

折半查找长度为n的顺序表的判定数是唯一的,但含有n个结点的二叉树却不唯一。因此,含有n个结点的二叉排序树的平均查找长度和树的形态有关。较好情况下,时间复杂度为O(log2n),最坏情况下二叉排序树为单支树,时间复杂度为O(n)。

②平衡二叉树:保证搜索次数逼近log2n;

③B-树:解决平衡二叉树(当n很大时,高度很大)的局限性

④B+树:根据区间划分,实现区间查找。

3、散列表的查找

①基本概念和术语

a、散列函数和散列地址:在记录的存储位置p和其关键字key之间建立一个确定的对应关系H,是p=H(key),H:散列函数,p:散列地址;

b、散列表:一个有限连续的地址空间,用以存储按散列函数计算得到的相应散列地址的数据记录。

c、冲突和同义词:冲突:不同的关键字得到相同的散列地址;同义词:具有相同函数值的关键字

②散列函数的构造方法:

a、数字分析法

b、平方取中法

c、折叠法

d、除留余数法:计算简单,适用范围广,是最常用的构造散列函数的方法,不仅可以对关键字直接取模,也可以子折叠、平方取中等运算后取模,这样可以保证散列地址一定落在散列表的地址空间中。

③处理冲突的方法

a、开放地址法(包括线性探测法、二次探测法、伪随机探测法)

b、链地址法:要求会画图,能够根据图求查找成功时的平均查找长度等。

二、上次目标达成情况和本次目标

1、上次目标达成情况:通过课后习题的相关练习和课件的学习,自己尝试去画图理解相关的算法,促进自己对基于深度搜索和广度搜索生成树的理解和进一步学习最小生成树的普里姆算法和求最短路径的迪杰斯特拉算法。

2、本次目标:在深入去理解二叉排序树相关算法,特别是删除操作以及进一步学习了解B-树和B+树;同时,还要理解和熟知构造散列函数和处理冲突的方法。