第10章 索引结构与散列数据结构课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2161)8
4734741
(2162)8
4741304
(1100)8
1210000
2020/10/3
14
3) 乘法杂凑函数(书中称乘余取整法) H(k)= M× ( ( ×k) mod 1 )
表容
0.618
例子:设表长为29=512,则 H(1)= 29 × (0.618)10 = 29 × (0.4743...)8 = 474
2020/10/3
2
2) 例子:
Max-key obj-addr
1 33 ID 2 48 索引表 3 80
4 98
有序
2020/10/3
22
12
13
9
30
29
33
8 25
无序
42
48
44
38
34
40






3
平均查找长度不但与n有关,而且与块大小s有关,当n固 定后: 如果s=n,即不分段,则与前面的算法一样 如果s=1,即index与n一样大(稠密索引)
Hash(Burke)=1 Hash(Broad)=1 Hash(Attlee)=0 Hash(Alton)=0
Hash(Ekers)=4 Hash(Blum)=1 Hash(Hecht)=7 Hash(Ederly)=4
指针
次关键码 计数
男5
03

3
08
17
24
47
51
83
45
2020/10/3
百度文库
7
10.4 散列(散列表的检索)
前面所学的静态搜索法中: 顺序搜索为O(n) 有序折半搜索为O(log2n) 索引搜索为O(n)。
这些方法所以称它为静态,是因为原始的表或索引 是不变的。
下面讨论的散列表的检索: 1)进一步提高了搜索速度 O(1) 2)是动态的,搜索不到就插入
10
设符号表(散列表)大小为8(0~7),H(x)为对x的数码 求7的模。
x1=884910 x2=885010 x3=885110 beta=6669845610 y2=895010
H(x1)=8849 % 7=1 H(x2)=8850 % 7=2 H(x3)=8851 % 7=3 H(beta)=66698456 % 7=1
2020/10/3
8
1. 概述
1) Hash法(散列法,杂凑法)
对给定的关键码key作各种运算,其结果为放该key的地址。
Address=Hash(key) 有时也称为名-址函数。
散列函数:H(key)
散列表:通过这种方法建立的表就称为Hash表或杂凑表。
2020/10/3
9
2) 例子:在编译程序中建立,查找符号表 如有下列程序段: ... float x1,x2, x3; int beta,y2; ...
28 35 63 77 105
7 14 0 14 0
关键码含质因子7的Hash值均为7的倍数
2020/10/3
13
2) 平方取中法 H(k)=k2 的中间部分,其长度取决于表的大小。
设表长=29=(512)10 地址 000~777(八进制)
(2061)8
4310541
(2062)8
4314704
2020/10/3
6
2.倒排表 (Inverted Index List)
倒排表(倒排文件)是一种次索引的实现(即保持了所 有次关键码的链)
例子:职工表
按关键码的索引
“性别”次索引
主关键码 地址
03 180 08 140 17 340
24 260 47 300 51 380 83 100 95 220
具体的讲:假设H(k)=d,冲突了,则探查序列 为d+1,d+2,…,m-1,0,1,2,…,d-1
2020/10/3
16
例子: 关键码为:Burke,Ekers,Broad,Blum,Attlee,Hecht ,
Alton ,Ederly
Hash(x)=ord(x)-ord(‘A’) 取关键码第一个字母在字母表中 的位置
2020/10/3
15
3. 解决冲突的方法(collision)
碰撞的两个(或多个)关键码称为同义词,即 H(k1)=H(k2),k1k2
1) 闭散列方法(也称开地址法)
(1) 线性探测法(Linear Probing) 设表容m,即0~m-1
思想:当k的Hash地址上已有别的元素,则顺序向 下(或上)一个个位置查找,找到某个key=k,或者找 到一个空位置插入。
第10章 索引结构与散列
10.1 静态索引结构 10.4 散列(散列表的检索) 10.2 动态索引结构(外查找--与外存打交道)
2020/10/3
1
10.1 静态索引结构 1. 线性索引 (Linear Index List)
1) 前提: 把n个数据对象分成若干块,块与块之间必须有序,
块内可有序/无序。
<1 碰撞频率小 >1 碰撞频率大
2020/10/3
12
2. 散列函数(经验函数)
1) 取余数法: H(k)=k % M M<=基本区长度的最大质数
例如: 基本区长 M
8
7
16
13
2048
2039
反例: (1) 若取10的幂次,2的幂次,则冲突率是比较的 (2) 若取含有质因子的M,如M=21 (3*7),含有 质因子3和7,则
现要确定,当s=? ASL最小 ASLs=1/2(-n/s2+1)=0 s2=n, s=n时 ASL=1/2(n/n+n )+1=n+1=O(n)
例如有10000个结点,则分100块,每块100个元素
如果索引表采用二分法,则平均查找时间: ASL=log2(b+1)-1+(s+1)/2=log2(n/s+1)+s/2
x1=(beta+y2) / (x2-x1)*y2; ...
字母数字编码:
0 1 2 …9 a b … e…t…x y z 30 31 32 … 39 41 42 … 45 … 54 … 58 59 5A 十六进制 48 49 50 … 64 65 66 … 69 … 84 …88 89 90
2020/10/3
H(y2)=8950 % 7=4
name 0 1 x1 2 x2 3 x3 4 y2 5 6 7
type
float float float int
address link
1000 1004 1008 2002
beta int 2000 ^
2020/10/3
11
3) 问题: 1) 选择一个计算简单且地址分布比较均匀的散列函数 2) 讨论解决冲突的方法 3) 选择适当的装载因子 散列表中结点的数目 = 基本区域能容纳的结点数
相关文档
最新文档