2019年预备知识静态查找表动态查找表哈希表.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查找
折半查找表示例演示
对右端的区间继续进行折半查找,如下
3 21
low mid= (low+high)/2
4 37
high
查找成功,返 回当前位置3
此时,在mid点的值刚好等于21,所以查找成功
29
8.1.2 有序表的查找
第 8章
查找
折半查找表示例演示
位置 0 1 2 3 4 5 6
查找21
8.1.2 有序表的查找
*8.1.3 静态树表的查找 //自学
8.1.4 索引顺序表的查找
15
第 8章
查找
顺序查找
16
8.1.1 顺序查找表
第 8章
查找
顺序查找表存储结构
typedef struct { ElemType *elem; // 数据元素存储空间基址,建表时
// 按实际长度分配,0号单元留空
int length; } SSTable; // 表的长度
17
8.1.1 顺序查找表
第 8章
查找
顺序查找表的思想
a) 从查找表的第一个元素向后(或从最后一个 元素向前),比较当前位置数据元素的关键字 与查找关键字; b) 若相等,输出当前位置,查找成功,若不相等, 走向下一个位置; c) 循环执行a)、b)步,直到查找成功或超出范围, 表示查找失败。
32
8.1.2 有序表的查找 折半查找表算法分析
第 8章
查找
0 1 2 3 4 5 6 7 8 9 10 05 13 19 21 37 56 64 75 80 88 90 用判定树描述折半查找的过程。 5 2 8 设n=2h-1 ( h=log2(n+1) ) 平均查找长度
0 1
3 4
6 7
9 10
7 8 9 10
关键字05
low
13
19 21 37 56 64 75 80 88 90
mid= (low+high)/2 high=mid-1 high
mid low=mid+1
mid
30
8.1.2 有序表的查找
第 8章
查找
折半查找表算法与实现
int Search_Bin ( SSTable ST, KeyType key ) { low = 1; high = ST.length; // 置区间初值 while (low <= high) { //语句见下页 } return 0; // 顺序表中不存在待查元素 } // Search_Bin
1 h i 1 2 i n i 1 O(log2 n)
查找速度真快!!
33
8.1.2 有序表的查找 折半查找表算法分析 游戏:猜商品价格
第 8章
查找
某款IPad的价格在2000元到3000元之
间,猜出它的价格。实际价格在下页
34
8.1.2 有序表的查找 折半查找表算法分析
第 8章
40
8.1.4 索引顺序表的查找
第 8章
查找
索引表的存储结构
typedef struct { keytype key; int addr; }indextype;
索引表数据 类型
typedef struct { indextype index[maxblock]; int block; }INtable; INtable IX;
第1块起 始位置
第1块 最大值 22 0
第2块起 始位置
第2块 最大值 48 4 86 7
第3块 最大值
第3块起 始位置
22
12
9
20
33
42
48
49
60
86
53
0
1
2
3
4
5
6
7
8
9
10
39
线性表
8.1.4 索引顺序表的查找
第 8章
查找
查找示例:假如要查找42,则根据索引表:
22 0
48 4
86 7
0
1
2
3
4
5
6
7
8
9
10
37
按块单调增加
8.1.4 索引顺序表的查找 索引顺序表的查找思想
第 8章
查找
(1) 首先确定所要查找关键字在哪一块中。 (2) 在所确定的块中用顺序查找查找关键字。
38
8.1.4 索引顺序表的查找
第 8章
查找
索引顺序表的示例演示
建立索引表 该块最大关键字 该块起始位址
从后向前查找33
67 78 76 45 33 99 88
查找步骤:
监视哨
33
67
78
76 4533来自9988比较 比较 比较 查找成功,返 回当前位置5
20
8.1.1 顺序查找表
第 8章
查找
顺序查找表的算法与实现
int Search_Seq(SSTable ST, KeyType key) { // 在顺序表ST中顺序查找其关键字等于 // key的数据元素。若找到,则该函数 // 返回该元素在表中的位置,否则返回 // 0。 ST.elem[0].key = key; // “哨兵” for (i=ST.length; (i>=0) && ST.elem[i].key!=key; --i); // 从后往前找 return i; //若返回值i为0,则表示没有找到 } // Search_Seq
9
预备知识
第 8章
查找
为什么要针对各种数据结构进行查找?
在程序设计中,根据实际情况的需要,要将数据存 储为一些特定的数据结构,例如数组,队列,堆,
数等等。程序的业务逻辑有时候需要确认某项数据 是否存在。因此,要进行查找。例如 宾馆电梯控制程序,查找Vip楼层是否在队列中 国家缉毒部门要查找可疑的毒品走私犯人 等等
7
预备知识
第 8章
查找
类型定义
数据元素类型定义为: typedef struct{ Keytype key; //声明关键字 … }SElemType; // SElemType结构体数据类型
8
预备知识
第 8章
查找
宏定义
//数值型关键字的比较 #define EQ(a, b) ( (a) == (b) ) #define LT(a, b) ( (a) < (b) ) #define LQ(a, b) ( (a) <= (b) ) //字符型关键字的比较 #define EQ(a, b) (!strcmp((a),(b))) #define LT(a, b) (strcmp((a),(b))<0) #define LQ(a, b) (strcmp((a),(b)<=0)
21
8.1.1 顺序查找表
顺序查找表算法分析
第 8章
查找
给定值进行比较的关键字个数的期望值:
ASL
PC
i 1 i
n
i
n 为表长 Pi 为查找表中第i 个记录的概率 Ci为找到记录时,关键 字的比较次数
22
8.1.1 顺序查找表
顺序查找表算法分析
在等概率查找的情况下,
第 8章
查找
折半查找的前提要求是顺序存储并且有序。
25
8.1.2 有序表的查找 折半查找表的思想
第 8章
查找
1)将要查找关键字与查找表的中间的元素 进行比较,若相等,返回当前位值; 2)若查找关键字比当前位置关键字大,向 前递归,否则向后递归。
26
8.1.2 有序表的查找
第 8章
查找
折半查找表示例演示 查找21
查找
游戏:猜商品价格
实际价格:2888元
35
第 8章
查找
索引顺序表查找
36
8.1.4 索引顺序表的查找 索引顺序表的前提要求 (1)查找表要求顺序存储
第 8章
查找
(2)要求查找表可以分成n块,并且当i>j 时,第i块中 的最小元素大于第j块中 的最大元素。
22 12 9 20 33 42 48 49 60 86 53
预备知识 8.1 静态查找表 8.2 动态查找表 8.3 哈希表
1
第 8章
查找
本章重点难点
重点:顺序查找、二分查找、二叉排序树查找以
及散列表查找的基本思想和算法实现。
难点:二叉排序树的删除算法和平衡二叉树的
构造算法。
2
预备知识 8.1 静态查找表
8.2
8.3
动态查找表
哈希表
3
预备知识
有关概念 (1) 查找表:
整个查找表被分为了三块,按照块单调递增: 第1块中的 最大关键字 小于 第2块的 最小关键字; 第2块中的 最大关键字 小于 第3块的 最小关键字。 a) 因为42 > 22,所以42 肯定不在第一块中, b) 因为42 < 48,而第三块的最小值也大于48,所以42肯定不 在第三块中, c) 所以决定在第二块中查找。一般情况下使用顺序查找法。
0 5 1 13 2 19 3 21 4 37 5 56 6 64 7 75 8 80 9 88 10 90
low
mid= (low+high)/2
high
因为21<56,所以21不可能落到右面的区间,于是 我们仅考虑左边的区间
0 5 1 13 2 19 3 21 4 37
27
8.1.2 有序表的查找
第 8章
查找
折半查找表示例演示
对于左边的区间,继续进行折半查找,如下
0 5 low 1 13 2 19 3 21 4 37 high
mid= (low+high)/2
因为21>19,因此,21不可能在左边的区间出现, 所以考虑在右端区间查找
3 21 4 37
28
8.1.2 有序表的查找
第 8章
18
8.1.1 顺序查找表
第 8章
查找
顺序查找表示例演示
从后向前查找55
67 78 76 45 33 99 88
查找步骤:
监视哨
55
67
78
76 45
33
99
88
比较 比较 比较 比较 比较 比较 比较 比较 越界了,表示没找到, 返回值为0
19
8.1.1 顺序查找表
第 8章
查找
顺序查找表示例演示
索引表结构
41
8.1.4 索引顺序表的查找 索引顺序表的算法与实现
第 8章
查找
int SEARCH(SSTable ST, INtable IX,KeyType key ) { int I = 0, s, e; //s记录在查找表中的开始位置 //e记录在查找表中的结束位置 {在索引表中查找,确定s和e的值} {根据s和e的值在线性表中查找} return -1 }
1 Pi n
顺序表查找的平均查找长度为:
1 n n 1 ASLss (n i 1 ) n i 1 2
23
第 8章
查找
折半查找
24
8.1.2 有序表的查找
第 8章
查找
折半查找的前提要求
想一想:英文字典的特点及英语单词的 查找过程。 英文字典是有序的,英语单词的查找用 的是折半查找。
第 8章
查找
是由同一类型的数据元素(或记录)构成的集合。 (2) 静态查找表:
仅作查询和检索操作的查找表。 (3) 动态查找表: 在查找时包含插入、删除或修改。
4
预备知识
有关概念
第 8章
查找
(4) 主关键字
可以识别唯一的一个记录的数据项(字段)。 (5) 次关键字 关联若干项记录的数据项(字段)。 (6) 查找 根据给定的某个值,在查找表中确定一个其关键字 等于给定值的数据元素或(记录)。
10
预备知识
8.1 静态查找表
8.2 动态查找表
8.3 哈希表
11
第 8章
查找
8.1
静态查找表
8.1.1 顺序表的查找 8.1.2 有序表的查找 *8.1.3 静态树表的查找 8.1.4 索引顺序表的查找 //自学
12
8.1 静态查找表
静态查找表的抽象数据类型
第 8章
查找
ADT StaticSearchTable { D是具有相同特性的数据元素的集 数据对象D: 合。每个数据元素含有类型相同的 关键字,可唯一标识数据元素。 数据关系R:数据元素同属一个集合。 基本操作 P: 见下页 } ADT StaticSearchTable
5
预备知识
有关概念 (7) 查找成功 查找表中存在满足条件的记录。 (8) 查找不成功 查找表中不存在满足条件的记录。
第 8章
查找
6
预备知识 类型定义
第 8章
查找
typedef float Keytype; //Keytype定义为浮点数据类型
typedef int Keytype; //Keytype定义为整型数据类型 typedef char *Keytype; //Keytype定义为字符指针数据类型
13
8.1 静态查找表
第 8章
查找
基本操作
Create(&ST, n); //建立静态查找表 Destroy(&ST); //销毁静态查找表
Search(ST, key); //按关键字字key查找 Traverse(ST, Visit()); //遍历查找表
14
第 8章
查找
8.1 静态查找表 8.1.1 顺序表的查找
31
8.1.2 有序表的查找 折半查找表算法与实现
第 8章
查找
while (low <= high) { mid = (low + high) / 2; if (EQ (key , ST.elem[mid].key) ) return mid; // 找到待查元素 else if ( LT (key , ST.elem[mid].key) ) high = mid - 1; // 继续在前半区间进行查找 else low = mid + 1; // 继续在后半区间进行查找 }