27
学学学学学学学P214-226 查查 查查查查查 查查查查查查查查查查查查查查 查查查查查 (、、 查查 查查查查查查查查查查查查查查查查 、)

学习内容和重点( P214-226)

  • Upload
    italia

  • View
    84

  • Download
    7

Embed Size (px)

DESCRIPTION

学习内容和重点( P214-226). 查找(相关概念、理解各种静态查找表查找方法、掌握顺序表查找、折半查找的实现算法及其性能分析). 回答问题 1( 概念). 什么是 查找表?什么是查找?查找成功?查找不成功?什么是静态查找?动态查找?什么是关键字?主关键字?次关键字?. 回答问题 2. 查找的过程是怎样的?对查找表常用的操作有 哪些? 有哪些查找方法?. (1)查找的过程是怎样的? 给定一个值 K, 在含有 n 个记录的文件中进行搜索,寻找一个关键字值等于 K 的记录,如找到则输出该记录,否则输出查找不成功的信息。. “特定的”= 关键字. - PowerPoint PPT Presentation

Citation preview

Page 1: 学习内容和重点( P214-226)

学习内容和重点( P214-226 )

查找(相关概念、理解各种静态查找表查找方法、掌握顺序表查找、折半查找的实现算法及其性能分析)

Page 2: 学习内容和重点( P214-226)

回答问题 1 (概念)

什么是 查找表?什么是查找?查找成功?查找不成功?什么是静态查找?动态查找?什么是关键字?主关键字?次关键字?

Page 3: 学习内容和重点( P214-226)

回答问题 2

查找的过程是怎样的?对查找表常用的操作有哪些?有哪些查找方法?

Page 4: 学习内容和重点( P214-226)

( 2 )对查找表常用的操作有哪些? 查询某个“特定的”数据元素是否在表中; 查询某个“特定的”数据元素的各种属性; 在查找表中插入一元素; 从查找表中删除一元素。

( 3) 有哪些查找方法? 查找方法取决于表中数据的排列方式 ;

( 1 )查找的过程是怎样的? 给定一个值 K,在含有 n 个记录的文件中进行搜索,寻找一个关键字值等于 K 的记录,如找到则输出该记录,否则输出查找不成功的信息。

例如查字典

针对静态查找表和动态查找表的查找方法也有所不同。

“特定的” = 关键字

Page 5: 学习内容和重点( P214-226)

明确:查找的过程就是将给定的 K 值与文件中各记录的关键字项进行比较的过程。所以用比较次数的平均值来评估算法的优劣。称为平均查找长度( ASL: average search length)。

如何评估查找方法的优劣?回答问题3

其中:n 是文件记录个数;Pi 是查找第 i 个记录的查找概率(通常取等概率 , 即 Pi =1/n) ;Ci 是找到第 i 个记录时所经历的比较次数。物理意义:假设每一元素被查找的概率相同,则查找每一元素所需的比较次数之总和再取平均,即为 ASL。

显然, ASL 值越小,时间效率越高。

n

i

ii cpASL1

Page 6: 学习内容和重点( P214-226)

回答问题 4

何 谓 静 态 查 找 表 ? 它 有 哪 些 操 作 ?( P216 )

针对静态查找表主要有哪些查找算法?一、顺序查找

二、折半查找(二分查找)

三、静态树表的查找

四、分块查找(索引顺序查找)

Page 7: 学习内容和重点( P214-226)

回答问题 5

什么是顺序查找? 对顺序结构如何顺序查找? 对单链表结构如何顺序查找? 对非线性树结构如何顺序查找 ?

顺序表的存储结构表示:typedef struct { ElemType *elem; // 表基址, 0 号单元留空。表容量为实际表长 int length; // 表长,即表中数据元素个数}SSTable;

Page 8: 学习内容和重点( P214-226)

回答问题 6解释顺序表上实现顺序查找算法的含义。

int Search_Seq( SSTable ST , KeyType key )

{ ST.elem[0].key =key;

for( i=ST.length; ST.elem[ i ].key!=key; - - i ); return i;

}

此算法和 P25-26 的算法 2.6 的算法思想一致,

但实现技巧不同,该改进有何好处?

Page 9: 学习内容和重点( P214-226)

技巧:把待查关键字 key 存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。例:若将待查找的特定值 key 存入顺序表的首部(如 0号单

元),则顺序查找的实现方案为:从后向前逐个比较!int Search_Seq( SSTable ST , KeyType key ){ // 在顺序表 ST 中,查找关键字与 key 相同的元素;若成功,返回其

位置信息,否则返回 0

ST.elem[0].key =key; // 设立哨兵,可免去查找过程中每一步都要检测是否查找完毕。当 n>1000 时,查找时间将减少一半。

for( i=ST.length; ST.elem[ i ].key!=key; - - i ); // 不要用 for(i=n; i>0; - -i) 或 for(i=1; i<=n; i++)

return i; // 若到达 0 号单元才结束循环,说明不成功,返回 0 值(i=0) 。成功时则返回找到的那个元素的位置 i 。

}

Page 10: 学习内容和重点( P214-226)

回答问题 7

顺序表的查找时间性能怎样?

Page 11: 学习内容和重点( P214-226)

顺序表的查找时间性能分析查找成功的情况: 第 n 个元素比较 1 次,第 n-1 个元素比较 2

次,依次类推,第 i 个元素的比较次数为 n-i+1, 第 1 个元素的比较次数为 n 。总计全部比较次数为: 1 + 2 +…+ n = (1+n)n/2 。

在等概率情形  pi = 1/n, i = 1, 2, , n所以求某一个元素的平均查找次数,即平均查找

长度为: ASL =( 1 + n ) /2 ,时间效率为 O(n)

Page 12: 学习内容和重点( P214-226)

顺序表的查找时间性能分析查找不成功的情况: 查找哨兵所需的比较次数为 n+1。

通过分析,查找成功时,最少比较次数 1 ;最多比较次数 n ;平均比较次数(n+1)/2 。

查找失败时,最少比较次数 n+1 ;最多比较次数 n+1 ;平均比较次数 n+1 。

查找成功和不成功的时间效率均为 O(n) 。

Page 13: 学习内容和重点( P214-226)

回答问题 8

顺序查找有何特点?

优点:算法简单,对顺序结构或链表结构均适用。

缺点: ASL 长,时间效率低。

Page 14: 学习内容和重点( P214-226)

回答问题 9

何谓折半查找?适用条件?如何进行?

已知如下 11 个元素的有序表 , 请查找关键字为 21和 85 的数据元素。

( 05 13 19 21 37 56 64 75 80 88 92 )1 2 3 4 5 6 7 8 9 10 12

Page 15: 学习内容和重点( P214-226)

折半查找的基本思想:

折半查找时折半查找时 , , 先求位于查找区间正中的对象的下先求位于查找区间正中的对象的下标标 midmid ,,用其关键码与用其关键码与给定值给定值 xx 比较比较 :: Element[mid].key Element[mid].key ==== x x ,,查找成功查找成功;; Element[mid].key > xElement[mid].key > x ,,把查找区间缩小把查找区间缩小

到表的到表的前半部分前半部分,继续折半查找,继续折半查找;; Element[mid].key < xElement[mid].key < x ,,把查找区间缩小把查找区间缩小

到表的到表的后半部分后半部分,继续折半查找。,继续折半查找。如果查找区间已缩小到一个对象,仍未找到想要如果查找区间已缩小到一个对象,仍未找到想要

查找的对象,则查找失败。查找的对象,则查找失败。

Page 16: 学习内容和重点( P214-226)

折半查找实例:已知如下 11 个元素的有序表:

( 05 13 19 21 37 56 64 75 80 88 92 ) , 请查找关键字为 21 和 85 的数据元素。

② 运算步骤:(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11] ;(2) 若 ST.elem[mid].key < key ,说明 key[ mid+1,high] , 则令: low =mid+1; 重算 mid = (low+high)/2 ; .(3) 若 ST.elem[mid].key > key ,说明 key[low ,mid-1] , 则令: high =mid–1; 重算 mid ;(4) 若 ST.elem[ mid ].key = key ,说明查找成功,元素序号 =mid;结束条件: ( 1 )查找成功 : ST.elem[mid].key = key ( 2 )查找不成功 : high≤low (意即区间长度小于0)

解:① 先设定 3 个辅助标志 : low,high,mid,其中mid= (low+high)/2

Page 17: 学习内容和重点( P214-226)

折半查找时间性能如何?

回答问题 10

Page 18: 学习内容和重点( P214-226)

折半查找时间性能分析—二叉判定树

折半查找的过程可以利用判定树来描述,当元素个数一定时,判定树的形态也唯一,可以根据判定树来确定查找元素成功或不成功时所需要的判定次数。例如 6 个元素的判定树如下:

1 5

2-3

-1

1-2 3-4 4-5 5-6 6-

==

==

====

==

==

3

<

<

<

<

<

<

( 1 , 6 )

>

> >

> >2 4 6

>( 4 , 6 )( 1 , 2 )

( 2 , 2 ) ( 4 , 4 )( 6 , 6 )

Page 19: 学习内容和重点( P214-226)

折半查找时间性能分析—二叉判定树

折半查找的过程可以利用判定树来描述,当元素个数一定时,判定树的形态也唯一,可以根据判定树来确定查找元素成功或不成功时所需要的判定次数。例如 6 个元素的判定树如下:

1 5

2-3

-1

1-2 3-4 4-5 5-6 6-

==

==

====

==

==

3

<

<

<

<

<

<

( 1 , 6 )

>

> >

> >2 4 6

>( 4 , 6 )( 1 , 2 )

( 2 , 2 ) ( 4 , 4 )( 6 , 6 )

Page 20: 学习内容和重点( P214-226)

通过判定树可知,查找第 i 个元素所与关键字比较的次数为从根到该结点的路径上结点数,也即是该结点在树上的层次数,因此查找成功时进行比较的关键字个数最多不超过树的深度,而具有n 个结点的判定树的深度为 log2n +1, 所以 ,折半查找在查找成功时和给定值进行比较的关键字的个数至多为 log2n +1.

称树中的方形结点为判定树的外部结点 ( 圆形结点为内部结点 ),那么 , 折半查找在查找不成功的过程就是走了一条从根结点到外部结点的路径 , 和给定值进行比较的关键字的个数等于该路径上的内部结点的个数 . 折半查找在查找不成功时和给定值进行比较的关键字的个数至多为 log2n +1.

Page 21: 学习内容和重点( P214-226)

折半查找的平均查找长度

nnn

nj

nASL

m

j

j22

1

1 log1)1(log1

21

Page 22: 学习内容和重点( P214-226)

回答问题 11

什么是分块查找(索引顺序查找) ? 如何进行?

Page 23: 学习内容和重点( P214-226)

分块查找(索引顺序查找) 顺序查找的另一种改进方法。先让数据分块有序,即分成若干子表,要求每个子表中的数

值(用关键字更准确)都比后一块中数值小(但子表内部未必有序)。然后将各子表中的最大关键字构成一个索引表,表中还要包

含每个子表的起始地址(即头指针)。索引表

最大关键字起始地址

22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53

第 1块

第 2块

第 3块

22 48 86

例:22 48 861 7 13

特点:块间有序,块内无序

Page 24: 学习内容和重点( P214-226)

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

索引顺序查找的基本思想 : 1 )由索引确定记录所在区间 2 )在顺序表的某个区间内进行查找 索引顺序查找的过程也是一个“缩小区

间”的查找过程 索引顺序查找的平均查找长度 = 查找“索引”的平均查找长度

+ 查找“顺序表”的平均查找长度

Page 25: 学习内容和重点( P214-226)

折半查找知识点举例

1 、使用折半查找算法时,要求被查文件(多项选择)A.采用链式存贮结构 B.记录的长度≤ 128

C.采用顺序存贮结构 D.记录按关键字递增有2 、线性有序表( a1 , a2 , a3 …, , a256) 是从小到大排列的,对一个给定的值 k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。设有 100 个结点,用二分法查找时,最大比较次数是 7 。

Page 26: 学习内容和重点( P214-226)

折半查找知识点举例

3 、假设在有序线性表 a[20] 上进行折半查找,则比较一次查找成功的结点数为 1 ;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。

4 、折半查找有序表( 4 , 6 , 12 , 20 , 28 ,38 , 50 , 70 , 88 , 100 ),若查找表中元素 20 ,它将依次与表中元素 28 , 6 ,12 , 20 比较大小。

Page 27: 学习内容和重点( P214-226)

下节课学习内容和重点

动态查找表(二叉排序树概念、用途,熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 理解二叉排序树删除元素算法)