- 2
- 0
- 约5.24千字
- 约 28页
- 2023-10-26 发布于江苏
- 举报
数据结构课程的内容
1
第8章 查找
8.1 基本概念
8.2 静态查找表
8.3 动态查找表
8.4 哈希表
教材第8、11和12章省略,因《操作系统》课程会涉及。
2
查找不成功 ——否则,称查找不成功(也应输出失败标志或失败位置)
静态查找 —— 只查找,不改变集合内的数据元素。
动态查找 —— 既查找,又改变集合内的数据元素。
关键字 ——记录中某个数据项的值,可用来识别一个记录
( 预先确定的记录的某种标志 )
主关键字 ——可以唯一标识一个记录的关键字
次关键字 ——识别若干记录的关键字
3
8.1 基本概念 是一种数据结构
查找表 —— 由同一类型的数据元素(或记录)构成的集合。
查 找 ——查询(Searching)特定元素是否在表中。
查找成功 ——若表中存在特定元素,称查找成功,应输出该记录;
例如“学号”
例如“女”
v 查询某个“特定的”数据元素是否在表中;
v 查询某个“特定的”数据元素的各种属性;
v 在查找表中插入一元素;
v 从查找表中删除一元素。
(3) 有哪些查找方法? 例如查字典
查找方法取决于表中数据的排列方式;
针对静态查找表和动态查找表的查找方法也有所不同。
讨论:
(1)查找的过程是怎样的?
给定一个值K,在含有n个记录的文件中进行搜索,寻找 一个关键字值等于K的记录,如找到则输出该记录,否则输出 查找不成功的信息。
(2)对查找表常用的操作有哪些?
“特定的”=关键字
4
8.2 静态查找表
静态查找表的抽象数据类型参见教材P216。
针对静态查找表的查找算法主要有:
一、 顺序查找(线性查找)
二、 折半查找(二分或对分查找)
三、 静态树表的查找
四、 分块查找(索引顺序查找)
6
v对非线性树结构如何顺序查找?可借助各种遍历操作!
(1) 顺序表的机内存储结构:
typedef struct {
ElemType *elem;
int length; //表长,即表中数据元素个数 }SSTable;
7
一、顺序查找 ( Linear search,又称线性查找 )
顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最 直接的办法。
v对顺序结构如何线性查找? 见下页之例或教材P216;
v对单链表结构如何线性查找?函数虽未给出,但也很容易 编写;只要知道头指针head就可以“顺藤摸瓜”;
//表基址, 0号单元留空。表容量为全部元素
如何计算ASL?
分析:
查找第1个元素所需的比较次数为1;
查找第2个元素所需的比较次数为2;
……
查找第n个元素所需的比较次数为n;
总计全部比较次数为: 1+2+… +n = (1+n)n/2
讨论①查不到怎么办?
——返回特殊标志,例如返回空记录或空指针。前例中设立了“哨 兵”,就是将关键字送入末地址ST.elem[0].key使之结束并返回
即: ASL=(1+n ) /2 ,时间效率为 O(n)
思考不成功的计算
这是查找成功的情况
i=0。
讨论② 查找效率怎样计算?
——用平均查找长度ASL衡量。
讨论③
未考虑查找不成功的 情况:查找哨兵所需 的比较次数为n+1
若求某一个元素的平均查找次数,还应当除以n (等概率),
9
与正中元素相比,若key小,则缩小至左半部内查找;再取其中 值比较,每次缩小1/2的范围,直到查找成功或失败为止。
v 对顺序表结构如何编程实现折半查找算法? ——见下页之例,或见教材(P219)
v 对单链表结构如何折半查找?
——无法实现! 因全部元素的定位只能从头指针head开始
v 对非线性(树)结构如何折半查找?
——可借助二叉排序树来查找(属动态查找表形式)。
10
讨论④ 顺序查找的特点:
优点: 算法简单,且对顺序结构或链表结构均适用。
?
二、折半查找 (又称二分查找或对分查找)
这是一种容易想到的查找方法。
先给数据排序 (例如按升序排好),形成有序表,然后再将key
缺点: ASL 太长,时间效率太低。 如何改进
解: ① 先设定3个辅助标志: low,high,mid,
显然有: mid= L(low+high)/2」
② 运算步骤:
(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11];
(2) 若 ST.elem[mid].key key,说明 key= [ mid+1,high] , 则令: low =mid+1;重算 mid= L(low+high)/2」;.
(3) 若
原创力文档

文档评论(0)