第 9 章 查找

99
9 9 第第 第第

Upload: norris

Post on 11-Jan-2016

116 views

Category:

Documents


0 download

DESCRIPTION

第 9 章 查找. 第一节:. 查找的概念及常用操作 静态查找表 顺序表查找 有序表:折半查找 索引顺序表 考研真题 1 动态查找表: 二叉排序树 2 、平衡二叉树. 9.1 查找的基本概念. 查找的术语( P171 ) 查找表 。由具有同一类型的数据元素(或记录)组成的集合。 关键字 。是记录中某个项或组合项的值,用它可以标识一个记录。能唯一确定一个记录的关键字,称为主关键字;而不能唯一确定一个记录的关键字,称为次关键字。 查找。 是指按给定的某个值 k ,在查找表中查找关键字为给定值 k 的记录。. 9.1 查找的基本概念. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第  9  章  查找

第 第 9 9 章 查找章 查找

Page 2: 第  9  章  查找

第一节:• 查找的概念及常用操作• 静态查找表

1. 顺序表查找2. 有序表:折半查找3. 索引顺序表• 考研真题 1

• 动态查找表:1. 二叉排序树 2 、平衡二叉树

Page 3: 第  9  章  查找

9.1 9.1 查找的基本概念查找的基本概念

• 查找的术语(查找的术语( P171P171 ))– 查找表查找表。由具有同一类型的数据元素(或记。由具有同一类型的数据元素(或记

录)组成的集合。录)组成的集合。– 关键字关键字。是记录中某个项或组合项的值,用。是记录中某个项或组合项的值,用

它可以标识一个记录。能唯一确定一个记录它可以标识一个记录。能唯一确定一个记录的关键字,称为主关键字;而不能唯一确定的关键字,称为主关键字;而不能唯一确定一个记录的关键字,称为次关键字。一个记录的关键字,称为次关键字。

– 查找。查找。是指按给定的某个值是指按给定的某个值 kk ,在查找表中,在查找表中查找关键字为给定值查找关键字为给定值 kk 的记录。的记录。

Page 4: 第  9  章  查找

9.1 9.1 查找的基本概念查找的基本概念

• 查找算法的性能查找算法的性能– 查找算法时间性能通过关键码的比较次数来查找算法时间性能通过关键码的比较次数来

度量。度量。– 关键码的比较次数与哪些因素有关呢?关键码的比较次数与哪些因素有关呢?

• ⑴⑴ 算法;算法;• ⑵⑵ 问题规模;问题规模;• ⑶⑶ 待查关键码在查找集合中的位置;待查关键码在查找集合中的位置;• ⑷⑷ 查找频率。查找频率与算法无关,取决于具查找频率。查找频率与算法无关,取决于具

体应用。通常假设体应用。通常假设 pipi 是已知的。是已知的。

Page 5: 第  9  章  查找

9.1 9.1 查找的基本概念查找的基本概念

• 查找算法的性能查找算法的性能– 平均查找长度:平均查找长度:查找算法进行的关键码的比查找算法进行的关键码的比

较次数的数学期望值。计算公式为:较次数的数学期望值。计算公式为:

其中:其中: nn ::问题规模,查找集合中的记录个数;问题规模,查找集合中的记录个数; ppii ::查找第查找第 ii 个记录的概率;个记录的概率; ccii ::查找第查找第 ii 个记录所需的关键码的比较次数。个记录所需的关键码的比较次数。

结论结论:: ccii 取决于算法;取决于算法; ppii 与算法无关,取决于具体应用。如与算法无关,取决于具体应用。如果果 ppii 是已知的,则平均查找长度只是问题规模的函数。是已知的,则平均查找长度只是问题规模的函数。

ASLASL

n

iii

cp1

Page 6: 第  9  章  查找

9.1 9.1 查找的基本概念查找的基本概念

• 查找技术查找技术– 静态查找静态查找 :不涉及插入和删除操作的查找 。 :不涉及插入和删除操作的查找 。– 静态查找适用于:查找集合一经生成,便只对其进静态查找适用于:查找集合一经生成,便只对其进

行查找,而不进行插入和删除操作,或经过一段时行查找,而不进行插入和删除操作,或经过一段时间的查找之后,集中地进行插入和删除等修改操作;间的查找之后,集中地进行插入和删除等修改操作;

– 动态查找动态查找 :涉及插入和删除操作的查找。 :涉及插入和删除操作的查找。– 动态查找适用于:查找与插入和删除操作在同一个动态查找适用于:查找与插入和删除操作在同一个

阶段进行,例如当查找成功时,要删除查找到的记阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。录,当查找不成功时,要插入被查找的记录。

Page 7: 第  9  章  查找

静态查找静态查找 : :

• 静态查找表– 顺序表查找:适用于顺序表及链表– 有序表:折半查找– 索引顺序表

Page 8: 第  9  章  查找

9.2 9.2 顺序表查找顺序表查找

• 11 )顺序查找)顺序查找– 基本思想基本思想:从线性表的一端向另一端逐个将:从线性表的一端向另一端逐个将

关键码与给定值进行比较,若相等,则查找关键码与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的关键码,则检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。查找失败,给出失败信息。

Page 9: 第  9  章  查找

int SeqSearch(Record r[], int n, int k){

int i=0;while (i<n&&r[i].key!=k) i++;if (i<n) return i;else return -1;

}

由于查找中二个重要信息是记录和关键字,简化之,记录即为关键字,所以直接定义 int key 即可,不需要结构体类型定义

顺序查找算法

Page 10: 第  9  章  查找

基本思想基本思想:设置“哨兵”。哨兵就是待查值,将它放:设置“哨兵”。哨兵就是待查值,将它放在查找方向的在查找方向的尽头尽头处,免去了在查找处,免去了在查找过程中每一次比过程中每一次比较后都要判断查找位置是否较后都要判断查找位置是否越界越界,从而提高查找速度。,从而提高查找速度。

10 15 24 6 12 35 40 98 5510 15 24 6 12 35 40 98 550 1 2 3 4 5 6 7 8 9

ii

例:查找例:查找 kk == 3535

iiiiii哨兵哨兵

3535

查找方向

改进的顺序查找改进的顺序查找

Page 11: 第  9  章  查找

int SeqSearch2(Record r[], int n, int k){

int i=0;r[n].key=k;while (r[i].key!=k) i++;if (i<n) return i;else return -1;

}

ASL= =

n

ii cp

1

n

i i inp1

)1(i = (n+1)/2=O(n)

改进的顺序查找改进的顺序查找

Page 12: 第  9  章  查找

9.2 9.2 顺序表查找顺序表查找

• 顺序查找的缺点:顺序查找的缺点:– 平均查找长度较大,特别是当待查找集合中平均查找长度较大,特别是当待查找集合中

元素较多时,查找效率较低。元素较多时,查找效率较低。• 顺序查找的优点:顺序查找的优点:

– 算法简单而且使用面广。算法简单而且使用面广。– 对表中记录的存储没有任何要求,顺序存储对表中记录的存储没有任何要求,顺序存储

和链接存储均可;和链接存储均可;– 对表中记录的有序性也没有要求,无论记录对表中记录的有序性也没有要求,无论记录

是否按关键码有序均可。是否按关键码有序均可。

Page 13: 第  9  章  查找

9.2 9.2 顺序表查找顺序表查找 • 22 )折半查找)折半查找( 有序表的查找)( 有序表的查找)

– 使用条件:使用条件:• 线性表中的记录必须按关键码有序;线性表中的记录必须按关键码有序;• 必须采用顺序存储。必须采用顺序存储。

– 基本思想基本思想::• 在有序表中,取在有序表中,取中间中间记录作为比较对象,若给定值与记录作为比较对象,若给定值与

中间记录的关键码相等,则查找成功;若给定值中间记录的关键码相等,则查找成功;若给定值小于小于中间记录的关键码,则在中间记录的中间记录的关键码,则在中间记录的左半左半区继续查找;区继续查找;若给定值若给定值大于大于中间记录的关键码,则在中间记录的中间记录的关键码,则在中间记录的右右半半区继续查找。不断重复上述过程,直到查找成功,区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。或所查找的区域无记录,查找失败。

Page 14: 第  9  章  查找

例:查找值为例:查找值为 1414 的记录的过程:的记录的过程:

0 1 2 3 4 5 6 7 8 9 10 11 12 13

7 14 18 21 23 29 31 35 38 42 46 49 52

low=1 high=13mid=7

high=6 mid=3

high=2

mid=1

31>1418>14

7<14

low=2

mid=2

14=14

Page 15: 第  9  章  查找

例:查找值为例:查找值为 2222 的记录的过程:的记录的过程:

0 1 2 3 4 5 6 7 8 9 10 11 12 13

7 14 18 21 23 29 31 35 38 42 46 49 52

low=1 high=13mid=7 high=6 mid=3

high=4

mid=5

31>2218<22

23>22low=4

mid=4

21<22

low=5 low>high

Page 16: 第  9  章  查找

int BiSearch(Record r[ ], int n, int k)// 查找成功时返回该对象的下标序号,失败时返回 -1{ low=0,high=n-1;

while (low<=high){

mid=(low+high)/2;if (r[mid].key==k) return mid;else if (r[mid].key<k) low=mid+1;else high=mid-1;

}return -1;

}

折半查找折半查找————非递归非递归

Page 17: 第  9  章  查找

int BiSearch2(Record r[],int low,int high,int k)int BiSearch2(Record r[],int low,int high,int k) { if (low>high){ if (low>high)

return -1;return -1;elseelse{{

mid=(low+high)/2;mid=(low+high)/2;if (r[mid].key==k) if (r[mid].key==k)

return mid;return mid;elseelse

if (r[mid].key<k)if (r[mid].key<k) return return

BiSearch2(r,mid+1,high,k);BiSearch2(r,mid+1,high,k);elseelse return BiSearch2(r,low,mid-return BiSearch2(r,low,mid-

1,k);1,k);}}

}}

折半查找折半查找————递归递归

Page 18: 第  9  章  查找

折半查找的判定树折半查找的判定树

• 判定树判定树:折半查找的过程可以用二叉树:折半查找的过程可以用二叉树来描述,树中的每个结点对应有序表中来描述,树中的每个结点对应有序表中的一个记录,结点的值为该记录在表中的一个记录,结点的值为该记录在表中的位置。通常称这个描述折半查找过程的位置。通常称这个描述折半查找过程的二叉树为的二叉树为折半查找判定树,简称二叉折半查找判定树,简称二叉判定树。判定树。

Page 19: 第  9  章  查找

练习:• 画出二叉判定树• 设有序顺序表各元素编号:• 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7

Page 20: 第  9  章  查找

具有具有 nn 个结个结点的折半查找判定树的深度点的折半查找判定树的深度为为 查找成功查找成功:在表中查找任一记录的过程,即是折半查:在表中查找任一记录的过程,即是折半查找判定树中从根结点到该记录结点的路径,和给定值找判定树中从根结点到该记录结点的路径,和给定值的比较次数等于该记录结点在树中的层数。的比较次数等于该记录结点在树中的层数。

查找不成功查找不成功:查找失败的过程就是走了一条从根结:查找失败的过程就是走了一条从根结点到外部结点的路径,和给定值进行的关键码的比点到外部结点的路径,和给定值进行的关键码的比较次数等于该路径上内部结点的个数。较次数等于该路径上内部结点的个数。

。 1log 2n

折半查找的性能分析折半查找的性能分析

Page 21: 第  9  章  查找

9.2 9.2 顺序表查找顺序表查找

• 33 )分块查找)分块查找– 基本思想基本思想:分块查找又称分块索引查找:分块查找又称分块索引查找 – 分块查找过程分两步进行:分块查找过程分两步进行:

• ① ① 确定要查找的记录所在的子表。用给定值确定要查找的记录所在的子表。用给定值 kk 在索在索引表中查找索引项,以确定要查找的记录位于哪个引表中查找索引项,以确定要查找的记录位于哪个子表中。子表中。

• ② ② 确定要查找的记录的情况。对第①步确定的子表确定要查找的记录的情况。对第①步确定的子表进行顺序查找,以确定要查找的记录的情况。进行顺序查找,以确定要查找的记录的情况。

是顺序查找的改进是顺序查找的改进

Page 22: 第  9  章  查找

9.2 9.2 顺序表查找顺序表查找

• 33 )分块查找)分块查找先确定待查记录所在的块(子表), 接着在块中顺序查找。

第二个子表中所有记录的关键字均大于第一个子表中的关键字

索引表关键字有序

Page 23: 第  9  章  查找

考研真题 1 :1. 若查找每个记录的概率均等,则在具有 n 个记录的连

续顺序文件中采用顺序查找法查找一个记录,其平均查找长度 ASL 为 ( ) 。【北京航空航天大学 2000 一、 8 ( 2 分) 】

A . (n-1)/2 B. n/2 C. (n+1)/2 D. n

4. 下面关于二分查找的叙述正确的是 ( ) 【南京理工大学 1996 一、 3 ( 2 分) 】

A. 表必须有序,表可以顺序方式存储,也可以链表方式存储

B. 表必须有序且表中数据必须是整型,实型或字符型

C. 表必须有序,而且只能从小到大排列D. 表必须有序,且表只能以顺序方式存储

Page 24: 第  9  章  查找

考研真题 1 :7. 用二分(对半)查找表的元素的速度比用顺序法 ( ) 【南京理

工大学 1998 一、 11 ( 2 分) 】必然快 B. 必然慢 C. 相等 D. 不能确定9. 具有 12 个关键字的有序表,折半查找的平均查找长度( )

【中山大学 1998 二、 10 ( 2 分)】 A. 3.1 B. 4 C. 2.5 D. 510. 折半查找的时间复杂性为( )【中山大学 1999 一、 15 】A. O ( n2 ) B. O ( n ) C. O ( nlogn ) D. O ( logn )11 .当采用分快查找时,数据的组织方式为 ( ) 【南京理工大学

1996 一、 7 ( 2 分) 】A .数据分成若干块,每块内数据有序B .数据分成若干块,每块内数据不必有序,但块间必须有序,每

块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的

数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同

Page 25: 第  9  章  查找

9.3 9.3 树表的查找树表的查找

• 11 )二叉排序树)二叉排序树– 二叉排序树二叉排序树(也称(也称二叉查找树二叉查找树):或者是一):或者是一棵空的二叉树,或者是具有下列性质的二叉棵空的二叉树,或者是具有下列性质的二叉树:树:• ⑴ ⑴ 若它的左子树不空,则左子树上所有结点的若它的左子树不空,则左子树上所有结点的

值均小于根结点的值;值均小于根结点的值;• ⑵ ⑵ 若它的右子树不空,则右子树上所有结点的若它的右子树不空,则右子树上所有结点的

值均大于根结点的值;值均大于根结点的值;• ⑶ ⑶ 它的左右子树也都是二叉排序树。它的左右子树也都是二叉排序树。

– 二叉排序树的定义采用的是递归方法。二叉排序树的定义采用的是递归方法。

Page 26: 第  9  章  查找

二叉排序树 非二叉排序树二叉排序树 非二叉排序树

63

9055

42 58

10 45 67 83

70

63

6055

82 58

10 45 67 83

70

中序遍历二叉排序树可以得到一个按关键码有序的序列 中序遍历二叉排序树可以得到一个按关键码有序的序列

二叉排序树二叉排序树

Page 27: 第  9  章  查找

二叉排序树的插入二叉排序树的插入

在一棵二叉排序树中插入值为在一棵二叉排序树中插入值为 kk 的结点,步骤如下:的结点,步骤如下:① ① 若二叉排序树为空,则生成值为若二叉排序树为空,则生成值为 kk 的新结点的新结点 ss ,同时将新,同时将新结点结点 ss 作为根结点插入。作为根结点插入。② ② 若若 kk 小于根结点的值,则在根的左子树中插入值为小于根结点的值,则在根的左子树中插入值为 kk 的的结点。结点。③ ③ 若若 kk 大于根结点的值,则在根的右子树中插入值为大于根结点的值,则在根的右子树中插入值为 kk 的的结点。结点。④ ④ 若若 kk 等于根结点的值,表明二叉排序树中已有此关键字,等于根结点的值,表明二叉排序树中已有此关键字,则无须插入。则无须插入。从以上描述可知,插入过程是递归的。 从以上描述可知,插入过程是递归的。

Page 28: 第  9  章  查找

例:插入值为例:插入值为 9898 的结点的结点

63

55 90

58 70 98

55

63

root

∧ 90

58∧ ∧ 70∧ ∧ 98∧ ∧

s

root

Page 29: 第  9  章  查找

二叉排序树中插入关键字的算法Int BSTinsert (BTNode *&bt, int key){ if (bt==NULL) { Bt=(BTNode*) malloc( sizeof(BTNode)); Bt->lchild=bt->rchild=NULL; Bt->key=key; Return 1; } Else { If(key==bt->key) Return 0; Else if( key < bt->key ) Return BSTInsert(bt->lchild,key); Else Return BSTInsert(bt->rchild,key); }}

Page 30: 第  9  章  查找

二叉排序树的构造二叉排序树的构造从空的二叉排序树开始,依次插入一个个结点 。从空的二叉排序树开始,依次插入一个个结点 。

例:关键码集合为例:关键码集合为

{63{63 ,, 9090 ,, 7070 ,, 5555 ,, 58}58} ,,

二二叉排序树的构造过程为:叉排序树的构造过程为:

63

55 90

58 70

Page 31: 第  9  章  查找

二叉排序树的构造算法二叉排序树的构造算法

Void CreatBST( BTNode *&bt, int key [] ,int n)

{

int i;

Bt=NULL;

For(i=1; i<=n; ++i)

BSTInsert (bt, key[i]);

}

Page 32: 第  9  章  查找

• 在二叉排序树中查找给定值在二叉排序树中查找给定值 kk 的过程是:的过程是:– ① ① 若二叉排序树为空,则表明查找失败,返回若二叉排序树为空,则表明查找失败,返回空指针;否则,若给定值空指针;否则,若给定值 kk 等于根结点的值,等于根结点的值,则表明查找成功,返回根结点;则表明查找成功,返回根结点;

– ② ② 若给定值若给定值 kk 小于根结点的值,则继续在根的小于根结点的值,则继续在根的左子树中查找;左子树中查找;

– ③ ③ 若给定值若给定值 kk 大于根结点的值,则继续在根的大于根结点的值,则继续在根的右子树中查找。右子树中查找。

• 这是一个递归查找过程。这是一个递归查找过程。

二叉排序树的查找二叉排序树的查找

Page 33: 第  9  章  查找

二叉排序树的查找的算法二叉排序树的查找的算法

BTNode * BSTSearch (BTNode * bt, int key){ if(bt==NULL) return NULL; Else { if ( bt->key==key) Return bt; Else if(key<bt->key) Return BSTSearch(bt->lchild, key); Else Return BSTSearch(bt->rchild, key); }}

Page 34: 第  9  章  查找

递归删除算法的步骤如下:

• ① 若二叉排序树为空,则表明不存在删除的结点,不进行删除操作。

• ② 若给定值 k小于根结点的值,则继续在根的左子树中删除。

• ③ 若给定值 k大于根结点的值,则继续在根的右子树中删除。

• ④ 若给定值 k等于根结点的值,则根结点即为要删除的结点,此时需要根据上述分析的三种结点情况:叶子结点、单支结点或双支结点,执行相应的删除操作。

Page 35: 第  9  章  查找

• 方法一:用右子树中最小的结点替补定位 *p 的右子树的最左下结点 *s ,及其父结点 *parent_s

• 若 *s 是叶子 : parent_s->lchild=NULL; • 若 *s 是有右孩子 : parent_s->lchild=s->rchild;s-

>lchild=p->lchild; s->rchild=p->rchild; parent_p->lchild=s; 或 parent_p->rchild=s;

• 方法二:用左子树中最大的结点替补定位 *p 的左子树的最右下结点 *s ,及其父结点 *parent_s

• 若 *s 是叶子 : parent_s->rchild=NULL; 若 *s 是有左孩子 : parent_s->rchild=s->lchild;s->lchild=p->lchild; s->rchild=p->rchild; parent_p->lchild=s; 或 parent_p->rchild=s;

Page 36: 第  9  章  查找

44 .二叉排序树的删除操作.二叉排序树的删除操作

• 分三种情况 :

( 1 )删除叶子结点

Page 37: 第  9  章  查找

• ( 2 )删除单支结点

Page 38: 第  9  章  查找

• ( 3 )删除双支结点

Page 39: 第  9  章  查找

例:在二叉排序树中查找关键字值为例:在二叉排序树中查找关键字值为 3535 ,, 9595的过程:的过程:

50

30

20

80

90

85

88

40

35

32

二叉排序树的查找二叉排序树的查找

50

30

20

80

90

85

88

40

35

32

Page 40: 第  9  章  查找

二叉排序树的查找性能分析二叉排序树的查找性能分析

由序列由序列 {3, 1, 2, 5, 4}{3, 1, 2, 5, 4} 得到二叉排序树:得到二叉排序树:

由序列由序列 {1, {1, 22, , 33, , 44, , 55}}得到二叉排序树:得到二叉排序树:

ASL =ASL = (( 1+2+3+4+51+2+3+4+5 )) / /

5= 35= 3

ASL =ASL = (( 1+2+3+2+31+2+3+2+3 )) / 5 = 2.2/ 5 = 2.2

二叉排序树的查找性能取决于二叉排序树的形状,二叉排序树的查找性能取决于二叉排序树的形状,在在 OO((loglog

22nn)) 和和 OO((nn)) 之间。之间。

1

2

3

4

53

1

2

5

4

Page 41: 第  9  章  查找

考研真题例一51. 输入一个正整数序列

( 53,17,12,66,58,70,87,25,56,60 ),试完成下列各题。

1. 按次序构造一棵二叉排序树 BS 。2. 依此二叉排序树,如何得到一个从大到小的有

序序列?3. 画出在此二叉排序树中删除“ 66” 后的树结构。– 【同济大学 2001 一 (10 分 ) 】

Page 42: 第  9  章  查找

9.3.2 9.3.2 平衡二叉树平衡二叉树

• 平衡二叉树:平衡二叉树:或者是一棵空的二叉排序树,或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:或者是具有下列性质的二叉排序树:– ⑴ ⑴ 根结点的左子树和右子树的深度最多相差根结点的左子树和右子树的深度最多相差 1;1;– ⑵ ⑵ 根结点的左子树和右子树也都是平衡二叉树。根结点的左子树和右子树也都是平衡二叉树。

• 平衡因子:平衡因子:结点的平衡因子是该结点的左结点的平衡因子是该结点的左子树的深度与右子树的深度之差。子树的深度与右子树的深度之差。

Page 43: 第  9  章  查找

55

44 88

22

55

44 88

22

11是平衡树 非平衡树是平衡树 非平衡树

在平衡树中,结点的平衡因子可以是在平衡树中,结点的平衡因子可以是 11 ,, 00 ,, -1-1 。。

结点的平衡因子=结点的平衡因子= HHLL-H-HRR

9.3.2 9.3.2 平衡二叉树平衡二叉树

Page 44: 第  9  章  查找

• 基本思想基本思想:在构造二叉排序树的过程中,:在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,在保持二叉而破坏了树的平衡性,若是,在保持二叉排序树特性的前提下,调整各结点之间的排序树特性的前提下,调整各结点之间的链接关系,进行相应的旋转,使之成为新链接关系,进行相应的旋转,使之成为新的平衡子树。的平衡子树。

平衡二叉树的构造平衡二叉树的构造

Page 45: 第  9  章  查找

平衡二叉树的构造平衡二叉树的构造

• 设结点设结点 AA 为为最小不平衡子树最小不平衡子树的根结点,对的根结点,对该子树进行平衡调整归纳起来有以下四种该子树进行平衡调整归纳起来有以下四种情况:情况:– 1. LL1. LL 型型– 2. RR2. RR 型型– 3. LR3. LR 型型– 4. RL4. RL 型型

Page 46: 第  9  章  查找

调整有 4 种情况

• ( 1 ) LL 型

Page 47: 第  9  章  查找

• ( 2 ) RR 型

Page 48: 第  9  章  查找

• ( 3 ) LR 型

Page 49: 第  9  章  查找

• ( 4 ) RL 型

Page 50: 第  9  章  查找
Page 51: 第  9  章  查找

例题讲解二: P264 :例 9 - 3

• 已知关键码: 16 , 3 , 7 , 11 , 9 , 26 ,18 , 14 , 15 依次插入到一棵初始为空的AVL 树中,画出插入每一个关键码后的AVL 树。并标出平衡旋转的类型。构造完成后依次删除结点 16 , 15 , 11. 给出详细的操作过程。

Page 52: 第  9  章  查找

考研真题 212. 二叉查找树的查找效率与二叉树的 ( ( 1 ) ) 有关 , 在 ( ( 2 ) ) 时其查找

效率最低【武汉交通科技大学 1996 一、 2(4 分 ) 】 (1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置 (2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。

13. 要进行顺序查找,则线性表( 1 );要进行折半查询,则线性表( 2 );若表中元素个数为 n, 则顺序查找的平均比较次数为( 3 );折半查找的平均比较次数为( 4 )。【北方交通大学 1999 一、 2 ( 4 分)】

( 1 )( 2 ): A. 必须以顺序方式存储; B. 必须以链式方式存储;C. 既可以以顺序方式存储,也可以链式方式存储;D. 必须以顺序方式存储,且数据已按递增或递减顺序排好;E. 必须以链式方式存储,且数据已按递增或递减的次序排好。( 3 )( 4 ): A.n B.n/2 C.n*n D.n*n/2 E.log2n F.nlog2n G.(n+1)/2

H.log2(n+1)

14 .在等概率情况下 , 线性表的顺序查找的平均查找长度 ASL 为 ( ( 1 ) ), 有序表的折半查找的 ASL 为 ( ( 2 ) ), 对静态树表 , 在最坏情况下 ,ASL 为 ( ( 3 ) ), 而当它是一棵平衡树时 ,ASL 为 ( ( 4 ) ), 在平衡树上删除一个结点后可以通过旋转使其平衡 , 在最坏情况下需 ( ( 5 ) ) 次旋转。供选择的答案:【上海海运学院 1999 二、 3 ( 5 分)】

A. O(1) B. O( log2n ) C. O((log2n)2) D.O(nlog2n) E. O(n)

Page 53: 第  9  章  查找

考研真题 216 .如果要求一个线性表既能较快的查找,又能适应动态变化的要求,则可采用 ( ) 查找法。

A. 分快查找 B. 顺序查找 C. 折半查找 D. 基于属性【西安电子科技大学 2001应用一、 8 ( 2 分)】

18 .分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是 ( ) 【合肥工业大学 2000 一、 4 ( 2 分)】

A .( 100 , 80 , 90 , 60 , 120 , 110 , 130 ) B. ( 100 , 120 , 110 , 130 , 80 , 60 , 90 )C. ( 100 , 60 , 80 , 90 , 120 , 110 , 130 ) D. (100 , 80 , 60 , 90 , 120 , 130 , 110)

19. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为 A, 并已知 A 的左孩子的平衡因子为 0 右孩子的平衡因子为 1, 则应作 ( ) 型调整以使其平衡。【合肥工大 2001 一、 4 ( 2 分)】

A. LL B. LR C. RL D. RR

Page 54: 第  9  章  查找

练习:• 已知关键码:

DEC , FEB , NOV , OCT , JUL , SEP , AUG , APR , MAR , MAY , JUN ,JAN 依次插入到一棵初始为空的 AVL 树中,画出插入每一个关键码后的 AVL 树。并标出平衡旋转的类型。

Page 55: 第  9  章  查找

小结• 查找的概念及常用操作• 静态查找表

1.顺序表查找2.有序表:折半查找3.索引顺序表• 考研真题 1

• 动态查找表:1.二叉排序树 2 、平衡二叉树对比各种查找算法的性能和适用情况。

Page 56: 第  9  章  查找
Page 57: 第  9  章  查找

复习:• 查找的概念及常用操作• 静态查找表

1.顺序表查找2.有序表:折半查找,二叉判定树3.索引顺序表• 考研真题 1

• 动态查找表:1.二叉排序树(查找) 2 、平衡二叉树对比各种查找算法的性能和适用情况。查找成功的平均查找长度,查找不成功的平均查找长度

Page 58: 第  9  章  查找

第二节• B 树

– B 树的特性及查找性能过程– 查找分析、 B 树插入和删除– B+ 树现 B 树的区别

• 哈希表– 查找思想–哈希函数构造方法及处理冲突的方法– 性能分析(计算查找成功和失败的平均查找时间)

Page 59: 第  9  章  查找

9.7 B树与 B+树•什么是 B 树 ? • B 树的特征• B 树中结点的插入和删除

•什么是 B+ 树 ?

Page 60: 第  9  章  查找

B 树的特征或是空树,或是满足以下条件 m 叉树:1. 每个结点最多有 m 个分支,除根外,所有

分支结点的子树数 >=m/2;

2. 根结点至少有二棵分支 ( 除非它是叶子 );

3. 所有叶子结点都在同一级上。4. 结点内的关键字互不相同且按从小到大排

列5. N 个分支的结点有 n-1 个关键字。

所有的非终端结点中包含下列信息数据:( n,A0,K1,A1,K2,A2…… , Kn,An)

Page 61: 第  9  章  查找
Page 62: 第  9  章  查找

B 树结点的插入1. 找到叶结点上的插入位置,直接插入2. 插入后检查被插入结点内关键字的个数,

若大于 m-1, 则进行拆分。取第 m/2 个关键字升到父结点中,重复至满足 B 树的定义

3. 不改变叶子结点的结构,只会使树变高。

Page 63: 第  9  章  查找

B 树插入实例• P268 例 9 - 4

• 用以下关键字序列 {1 , 2 , 6 , 7 , 11 ,4 , 8 , 13 , 10 , 5 , 17 , 9 , 16 ,20 , 3 , 12 , 14 , 18 , 19 , 15}创建一棵 5 阶 B- 树。

Page 64: 第  9  章  查找

B 树中关键字的删除1. 如果要删除的关键字不在叶子上,则换孩子

(以相邻关键字交换),使其转化为在叶子结点上。

2. 删除的关键字在叶子上:3. 结点内关键字个数大于 m/2-1 ,直接删除4. 结点内关键字个数等于 m/2-1 ,若有兄弟结

点中关键字个数大于 m/2-1 ,则借兄弟,否则,对父结点或兄结点进行合并(并父兄)。

Page 65: 第  9  章  查找

B 树删除结点实例• P268 例 9 - 4

• 用以下关键字序列 {1 , 2 , 6 , 7 , 11 ,4 , 8 , 13 , 10 , 5 , 17 , 9 , 16 ,20 , 3 , 12 , 14 , 18 , 19 , 15}创建一棵 5 阶 B- 树。给出删除关键字 8 , 16 ,15 , 4 的过程

Page 66: 第  9  章  查找

练习:• P282 ( 6 )• 设有一颗空的 3 阶 B-树,依次插入关键字

{30 , 20 , 10 , 40 , 80 , 58 , 47 , 50 , 29 , 22 , 56 , 98 , 99} ,请画出该树。

• P283 , 4 选择题

Page 67: 第  9  章  查找

B 树的特点:平衡、高效、易变。与其他知识点的联系:①是二叉平衡树的扩展;②是索引查找树的扩展;③是树的孩子表示法的扩展。

Page 68: 第  9  章  查找

B+树的定义• ①有 n 个子树的结点含有 n 个关键字;• ②所有叶子结点按关键值组成有序链表:• 包含了全部关键字的信息,及指向对应记

录的指针;• ③所有非终端结点是叶子结点的索引,其

中关键值是对应子树中的最大 / 小关键值

Page 69: 第  9  章  查找

B+ 树

Page 70: 第  9  章  查找

考研真题一21. 下面关于 m 阶 B 树说法正确的是 ( ) 【南京理工大学 1999 一、 5

( 2 分) 】 ① 每个结点至少有两棵非空子树; ②树中每个结点至多有 m 一 1 个关键

字 ; ③ 所有叶子在同一层上 ; ④ 当插入一个数据项引起 B 树结点分裂

后,树长高一层。A . ①②③ B. C. D. ②③ ②③④ ③

22. 下面关于 B 和 B+ 树的叙述中,不正确的是 ( ) 【北方交通大学 2001 一、 17 ( 2 分) 】

A. B 树和 B+ 树都是平衡的多叉树。 B. B 树和 B+ 树都可用于文件的索引结构。

C. B 树和 B+ 树都能有效地支持顺序检索。 D. B 树和 B+ 树都能有效地支持随机检索。

23. m 阶 B- 树是一棵 ( ) 【北京邮电大学 2000 二、 2 ( 20/8 分) 】A. m 叉排序树 B. m 叉平衡排序树 C. m-1 叉平衡排序树 D. m+1 叉平衡

排序树

Page 71: 第  9  章  查找

考研真题一判断21 .完全二叉树肯定是平衡二叉树。 【南京航空航天大

学 1996 六、 5 ( 1 分)】24 .有 n 个数存放在一维数组 A[1..n] 中,在进行顺序

查找时,这 n 个数的排列有序或无序其平均查找长度不同。

【北京邮电大学 1998 一、 6 ( 2 分)】29. B- 树中所有结点的平衡因子都为零。 【大连海事大

学 2001 一、( 1 , 17 ) (1 分 ) 】30. 在 m 阶 B- 树中每个结点上至少有 m/2 个关键字,

最多有 m 个关键字。 【东北大学 1997 二、 4 (2分 ) 】

36 、 B+ 树既能索引查找也能顺序查找。【青岛大学 2002 一、 10 ( 1 分)】

Page 72: 第  9  章  查找

9.4 Hash9.4 Hash 查找查找• 查找操作要完成什么任务?查找操作要完成什么任务?

• 我们学过哪些查找技术?这些查找技术的共性?我们学过哪些查找技术?这些查找技术的共性?– 顺序查找、折半查找、二叉排序树查找等。顺序查找、折半查找、二叉排序树查找等。– 以上讨论的查找方法,以上讨论的查找方法,由于记录的存储位置与关键字由于记录的存储位置与关键字

之间不存在确定的关系,之间不存在确定的关系,因此查找时需要进行一系列因此查找时需要进行一系列对关键字的查找比较,即对关键字的查找比较,即“查找算法”是建立在比较“查找算法”是建立在比较的基础上的,的基础上的,查找效率由比较一次缩小的查找范围决查找效率由比较一次缩小的查找范围决定。定。

待查值待查值 kk 确定确定 kk 在存储结构中的位置在存储结构中的位置

Page 73: 第  9  章  查找

• 能否不用比较,通过关键码直接确定存储能否不用比较,通过关键码直接确定存储位置?位置?– 理想的情况是,依据关键字直接得到其对应的理想的情况是,依据关键字直接得到其对应的

记录位置,即要求关键字与记录位置间存在一记录位置,即要求关键字与记录位置间存在一一对应关系,通过这个关系,能很快地由关键一对应关系,通过这个关系,能很快地由关键字得到对应的记录位置。字得到对应的记录位置。

Page 74: 第  9  章  查找

• 散列技术仅仅是一种查找技术吗?散列技术仅仅是一种查找技术吗?– 散列既是一种查找技术,也是一种存储技术。散列既是一种查找技术,也是一种存储技术。

• 散列是一种完整的存储结构吗?散列是一种完整的存储结构吗?– 散列只是通过记录的关键码定位该记录,没有散列只是通过记录的关键码定位该记录,没有

完整地表达记录之间的逻辑关系,所以,散列完整地表达记录之间的逻辑关系,所以,散列主要是主要是面向查找面向查找的存储结构。的存储结构。

Page 75: 第  9  章  查找

散列技术适合于哪种类型的查找?散列技术适合于哪种类型的查找?

– 散列技术一般不适用于允许多个记录有同样关散列技术一般不适用于允许多个记录有同样关键码的情况。散列方法也不适用于范围查找,键码的情况。散列方法也不适用于范围查找,换言之,在散列表中,我们不可能找到最大或换言之,在散列表中,我们不可能找到最大或最小关键码的记录,也不可能找到在某一范围最小关键码的记录,也不可能找到在某一范围内的记录。内的记录。

Page 76: 第  9  章  查找

• 散列技术的关键问题:散列技术的关键问题:– 函数设计、冲突解决,函数设计、冲突解决, ASLASL ,装填因子,装填因子– ⑴ ⑴ 散列函数的设计。散列函数的设计。如何设计一个简单、均匀、如何设计一个简单、均匀、

存储利用率高的散列函数。存储利用率高的散列函数。• ① ① 所选函数尽可能简单,以便提高转换速度。所选函数尽可能简单,以便提高转换速度。• ② ② 所选函数对关键字计算出的地址,应在所选函数对关键字计算出的地址,应在 HashHash 地地址集中大致均匀分布,以尽量减少冲突。址集中大致均匀分布,以尽量减少冲突。

Page 77: 第  9  章  查找

• 散列技术的关键问题:散列技术的关键问题:– ⑵ ⑵ 冲突的处理。冲突的处理。如何采取合适的处理冲突方法来解决如何采取合适的处理冲突方法来解决冲突。冲突。

• ① ① HashHash 函数。若函数。若 HashHash 函数选择得当,就可使函数选择得当,就可使 HashHash 地地址尽可能均匀地分布在址尽可能均匀地分布在 HashHash 地址空间上,从而减少冲突地址空间上,从而减少冲突的发生;否则,若的发生;否则,若 HashHash 函数选择不当,就可能使函数选择不当,就可能使 HashHash地址集中于某些区域,从而加大冲突的发生。地址集中于某些区域,从而加大冲突的发生。

• ② ② 处理冲突的方法。选择适当的处理冲突的方法。选择适当的 HashHash 函数可以减少冲函数可以减少冲突,但不能避免冲突,因此当冲突发生时,必须有较好突,但不能避免冲突,因此当冲突发生时,必须有较好的处理冲突的方法。的处理冲突的方法。

• ③ ③ HashHash 表的装填因子。关键字个数表的装填因子。关键字个数 // 表长度表长度

Page 78: 第  9  章  查找

散列函数是关键码的线性函数散列函数是关键码的线性函数,,即:即:

HH((keykey) = ) = aa keykey + + b b (( aa ,, bb 为常数)为常数)例:关键码集合为例:关键码集合为 {10, 30, 50, 70, 80, 90}{10, 30, 50, 70, 80, 90} ,选取的散,选取的散列函数为列函数为 HH((keykey))==keykey/10/10 ,,则散列表则散列表为:为:

0 1 2 3 4 5 6 7 8 9

10 30 50 70 80 90

适用情况?适用情况?

事先知道关键码,关键码集合不是很大且连续性较好。 事先知道关键码,关键码集合不是很大且连续性较好。

构造散列函数构造散列函数————直接定址法直接定址法

Page 79: 第  9  章  查找

散列函数为:散列函数为:

HH((keykey))==keykey mod mod pp

1414771414141477001414散列地址散列地址5656494942423535282821211414 关键码关键码

如何选取合适的 如何选取合适的 pp ,产生较少同义词?,产生较少同义词?

例: 例: pp == 2121 == 3×73×7 ?:?:

构造散列函数构造散列函数————除留余数法除留余数法

PP 常是小于或等于表长的最大素常是小于或等于表长的最大素数数

Page 80: 第  9  章  查找

根据关键码在各个位上的分布情况,选取分布比较根据关键码在各个位上的分布情况,选取分布比较均匀均匀的若干位组的若干位组成散列地址。成散列地址。

例:关键码为例:关键码为 88 位十进制数,散列地址为位十进制数,散列地址为 22 位十进制数位十进制数

8 1 3 4 6 5 3 28 1 3 7 2 2 4 28 1 3 8 7 4 2 28 1 3 0 1 3 6 78 1 3 2 2 8 1 7 8 1 3 3 8 9 6 7

① ② ③ ④ ⑤ ⑥ ⑦ ⑧

散列函数散列函数————数字分析法数字分析法

Page 81: 第  9  章  查找

对关键码平方后,按散列表大小,取中间的若干位作对关键码平方后,按散列表大小,取中间的若干位作为散列地址(为散列地址(平方平方后后截取截取)。 )。

事先不知道关键码的分布且关键码的位数不是很大。事先不知道关键码的分布且关键码的位数不是很大。

适用情况适用情况 ::

例:散列地址为例:散列地址为 22 位,则关键码位,则关键码 123123 的散列地址为:的散列地址为:

(1234)(1234)22 == 15215227275656

散列函数散列函数————平方取中法平方取中法

Page 82: 第  9  章  查找

将关键码从左到右分割成位数相等的几部分,将这几将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,取后几位作为散列地址。 部分叠加求和,取后几位作为散列地址。 例:设关键码为例:设关键码为 2 5 3 4 6 3 5 8 7 0 52 5 3 4 6 3 5 8 7 0 5 ,散列地址为三位。 ,散列地址为三位。

2 5 32 5 3 4 6 34 6 3 5 8 75 8 7 + 0 5+ 0 5 ─── ─── 1 3 0 81 3 0 8 移位叠加移位叠加

2 5 3 2 5 3 3 6 4 3 6 4 5 8 7 5 8 7 + 5 0 + 5 0 ─── ─── 1 2 5 41 2 5 4 间界叠加间界叠加

适用情况适用情况 ::

关键码位数很多,事先关键码位数很多,事先不知道关键码的分布。 不知道关键码的分布。

散列函数散列函数————折叠法折叠法

Page 83: 第  9  章  查找

由关键码得到的散列地址一旦产生了冲突,就去寻找由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空下一个空的散列地址,并将记录存入。 的散列地址,并将记录存入。

如何寻找下一个空的散列地址如何寻找下一个空的散列地址 ??

(( 11 )线性探测法)线性探测法(( 22 )二次探测法)二次探测法(( 33 )随机探测法)随机探测法

冲突的解决:冲突的解决:散列函数散列函数————开放定址法开放定址法

Page 84: 第  9  章  查找

冲突的解决:线性探测法冲突的解决:线性探测法

当发生冲突时,从冲突位置的下一个位置起,依次当发生冲突时,从冲突位置的下一个位置起,依次寻找空的散列地寻找空的散列地址。址。

对于键值对于键值 keykey ,,设设 HH((keykey))==dd ,,闭散列表的长度为闭散列表的长度为mm ,,则发生冲突时,寻找下一个散列地址的公式为:则发生冲突时,寻找下一个散列地址的公式为:

HHii=(=(HH((keykey)) ++ ddii) % ) % mm (( ddii=1=1 ,, 22 …, ,…, , mm--

11 )) 用开放定址法处理冲突得到的散列表叫用开放定址法处理冲突得到的散列表叫闭散列表闭散列表。 。

Page 85: 第  9  章  查找

例例 9-13 9-13 有关键字序列为有关键字序列为{7{7 ,, 44 ,, 11 ,, 1414 ,, 100100 ,, 3030 ,, 55 ,, 99 ,, 2020 ,,134}134} ,,Hash(key)=key % 13Hash(key)=key % 13 ,用线性探测法处理冲突,,用线性探测法处理冲突,建立建立 HashHash 表表 ,计算查找成功和失败的平均查找时 ,计算查找成功和失败的平均查找时间间

线性探测法实例线性探测法实例

Page 86: 第  9  章  查找

真题练习• P282 4 已知一组关键字:

{26 , 36 , 41 , 38 , 44 , 15 , 68 ,12 , 6 , 51 , 25} ,用链地址法解决冲突,假设装填因子为 0.75 , Hash函数的形式为 H(key)=key Mod P

1. 确定表长,构造 Hash 函数2. 计算等概率下查找成功的平均查找长度3. 计算等概率下查找失败的平均查找长度

(只将与关键字比较次数计算在内)

Page 87: 第  9  章  查找

int HashSearch_1(int hash[ ], int m, int k) int HashSearch_1(int hash[ ], int m, int k) {{

pos=k%m; //pos=k%m; // 计算计算 HashHash 地址地址t=pos; t=pos; while (hash[pos]!=EMPTY) //while (hash[pos]!=EMPTY) // 当当 HashHash 地址中的记录不为空时循地址中的记录不为空时循

环环{{

if (hash[pos]==k)if (hash[pos]==k)return pos; //return pos; // 查找成功,返回下标查找成功,返回下标

elseelsepos=(pos+1)%m;pos=(pos+1)%m;

if (pos==t) return -1; //if (pos==t) return -1; // 查找失败,返回查找失败,返回 -1-1}}return -1; //return -1; // 查找失败,返回查找失败,返回 -1-1

} }

9.4.3 Hash9.4.3 Hash 查找算法及分析查找算法及分析 在线性探测法构造的散列表中查找算法在线性探测法构造的散列表中查找算法———— C++C++描述描述

Page 88: 第  9  章  查找

散列查找的性能分析散列查找的性能分析 散列查找的性能分析散列查找的性能分析

由于冲突的存在,产生冲突后的查找仍然是给定值与由于冲突的存在,产生冲突后的查找仍然是给定值与关键码进行比较的过程。关键码进行比较的过程。在查找过程中,关键码的比较次数取决于产生冲突的在查找过程中,关键码的比较次数取决于产生冲突的概率。概率。而影响冲突产生的因素有:而影响冲突产生的因素有:(( 11)散列函数是否均匀)散列函数是否均匀(( 22)处理冲突的方法)处理冲突的方法(( 33)散列表的装载因子)散列表的装载因子 α=α= 表中填入的记录数表中填入的记录数 //表的长度表的长度

Page 89: 第  9  章  查找

考研真题二32. 假定有 k 个关键字互为同义词,若用线性探测法把这 k 个关键字存入散列表

中,至少要进行多少次探测? ( ) A . k-1 次 B. k 次 C. k+1 次 D. k ( k+1 ) /2 次【中国科技大学 1998 二、 3 ( 2 分)】【中科院计算所 1998 二、 3 ( 2

分)】34. 散列函数有一个共同的性质,即函数值应当以 ( )取其值域的每个值。A. 最大概率 B. 最小概率 C. 平均概率 D. 同等概率【西安电子科技大学 01应用一、 7 ( 2 分) 】 【北京邮电大学 1999 一、 4

( 2 分)】35. 散列表的地址区间为 0-17,散列函数为 H(K)=K mod 17 。采用线性探测法处

理冲突,并将关键字序列 26 , 25 , 72 , 38 , 8 , 18 , 59 依次存储到散列表中。

( 1 )元素 59 存放在散列表中的【北方交通大学 2001 一、( 19 , 20 )( 4 分)】地址是( )。

A . 8 B. 9 C. 10 D. 11 ( 2 )存放元素 59 需要搜索的次数是( )。A . 2 B. 3 C. 4 D. 536. 将 10 个元素散列到 100000 个单元的哈希表中,则( )产生冲突。【北京邮电大学 2001 一、 4 ( 2 分)】

A. 一定会 B. 一定不会 C. 仍可能会

Page 90: 第  9  章  查找

真题练习• 已知关键字集合为

{53 , 17 , 19 , 61 , 98 , 75 , 79 ,63 , 46 , 49} ,用除留余数法将关键字散列到地址区间{100 , 101 , 102 , 103 , 104 , 105 ,106 , 107 , 108 , 109} 内,若产生冲突,用开放定址法的线性探查法解决。

• 写出选用的 hash函数及形成的 hash 表。并计算查找成功时的平均查找长度。

Page 91: 第  9  章  查找

作业: P283 ,(二)

Page 92: 第  9  章  查找

小结• B 树

– B 树的特性及查找性能过程– 查找分析、 B 树插入和删除– B+ 树现 B 树的区别

• 哈希表– 查找思想–哈希函数构造方法及处理冲突的方法– 性能分析

Page 93: 第  9  章  查找
Page 94: 第  9  章  查找
Page 95: 第  9  章  查找

考研真题一

Page 96: 第  9  章  查找

考研真题二28. 下面关于哈希 (Hash ,杂凑 ) 查找的说法正确的是 ( ) 【南京理工大学 1998 一、

10 ( 2 分) 】A .哈希函数构造的越复杂越好,因为这样随机性好,冲突小 B .除留余数法是所有哈希函数中最好的 C .不存在特别好与坏的哈希函数,要视情况而定D .若需在哈希表中删去一个元素,不管用何种方法解决冲突都只要简单的将该元素删去即可

29. 若采用链地址法构造散列表,散列函数为 H ( key ) =key MOD 17 ,则需 ( ( 1 ) ) 个链表。这些链的链首指针构成一个指针数组,数组的下标范围为 ( ( 2 ) ) 【南京理工大学 1999 一、 12(13) ( 4 分) 】

( 1 ) A . 17 B. 13 C. 16 D. 任意( 2 ) A . 0 至 17 B. 1 至 17 C. 0 至 16 D. 1 至 16 30. 关于杂凑查找说法不正确的有几个 ( ) 【南京理工大学 2000 一、 16 ( 1.5

分) 】 ( 1 )采用链地址法解决冲突时,查找一个元素的时间是相同的 ( 2 )采用链地址法解决冲突时,若插入规定总是在链首,则插入任一个元素的时

间是相同的 ( 3 )用链地址法解决冲突易引起聚集现象 ( 4 )再哈希法不易产生聚集A. 1 B. 2 C. 3 D. 4

Page 97: 第  9  章  查找

考研真题二• 7. 对下面的关键字集 {30,15,21,40,25,26,36,37} 若

查找表的装填因子为 0.8 ,采用线性探测再散列方法解决冲突,做:

( 1 )设计哈希函数; ( 2 )画出哈希表;( 3 )计算查找成功和查找失败的平均查找长度;( 4 )写出将哈希表中某个数据元素删除的算法;【东北大学 2001 六 (18 分 ) 】

Page 98: 第  9  章  查找

考研真题二判断11 .用向量和单链表表示的有序表均可使用折半查找方法来提高

查找速度。 【中科院软件所 1997 一、 6 ( 1 分)】15. 就平均查找长度而言,分块查找最小,折半查找次之,顺序

查找最大。【西安交通大学 1996 二、 3 (3 分 ) 】16 .对无序表用二分法查找比顺序查找快。【青岛大学 2002

一、 8 ( 1 分)】17 .对大小均为 n 的有序表和无序表分别进行顺序查找,在等概

率查找的情况下,对于查找成功,它们的平均查找长度是相同的,而对于查找失败,它们的平均查找长度是不同的。【上海海运学院 1995 一、 11 ( 1 分) 1998 一、 12 ( 1 分)】

19 . 最佳二叉树是 AVL 树(平衡二叉树)。【北京大学 1994 】

Page 99: 第  9  章  查找

)( 21

11

2

1

)((

21

11

2

1

)1ln(1

1

1

21

e

查找成功时 查找不成功时

线性探测法

二次探测法

拉链法

ASL处理冲突方法

几种不同处理冲突方法的平均查找长度几种不同处理冲突方法的平均查找长度