18 索引结构与散列技术(二散列技术)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
1
3
4
5
6
2
7
8
2. 散列技术
概念的介绍
Hash技术的原始面目:
Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的 输出,该输出就是散列值。 无限大 很有限
冲突: h(key1)=h(key2),多对一。 装填因子: key1、key 2称为散列函数H的同义词。 散列表空间大小为 m, 填入表中的结点数是n(n<m), 设计原理:容纳数据,避免冲突 则称 α=n/m为散列表的装填因子。 常取值于 [0.65,0.9]
表 7.2 关键字及其相应的散列地址表示例 关键字 散列地址 散列地址 1(0 999) 2(0 99) 87142653 465 99 87172232 723 04 87182745 874 32 87107156 015 57 87127281 228 03 87157394 539 47
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-1 • 1. 数字选择法
若关键字的位数比散列表的地址位数多,则可选取数字分布比较均匀的 若干位作为散列地址。(必须能预先估计到所有关键字的每一位上各种 数字的分布情况 )
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
内容
索引结构
7
索引和散列
散列技术
注:教材第7章
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
数十亿QQ用户同时登录会发生什么? 线性查找
1
2
2. 散列技术
散列表讨论
• 散列法查找必须解决下面两个主要问题: (1)选择一个计算简单且冲突尽量少的“均匀”的散列函数;
冲突 在所 难免
冲突: H(key1)=H(key2) key1、key2称为散列函数H的同义词。
(2)确定一个解决冲突的方法,即寻求一种方法存储产生冲突的同义词。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
以上都是非常简单的例子
——在实际应用中,问题规模要大得多, 而且也难有这么理想的一对一的Hash函数
21
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表讨论 • 讨论:
– 1 理想的散列函数是一个一对一的函数。 – 2 装填因子:散列表空间大小为m,填入表中的结点数是n,则称 =n/m为散列表的装填因子。实用时,常在区间[0.65,0.9]上取的 适当值。 – 3 散列函数的选取原则是:
第 4,6,7位
n
(4+7)% 10为高位 (6+8)% 10为低位
2. 随机数法
选择一个随机函数,取关键字的随机函数值为它的散列地址,即 H(key)=random(key) 其中: random为随机函数。(当关键字长度不等时采用此法构造散列地址较 恰当 )
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
• 运算应尽可能简单; • 函数的值域必须在表长的范围之内; • 尽可能使得关键字不同时,其散列函数值亦不相同。
– 4 冲突:若某个散列函数 H对于不相等的关键字key1和 key2得到相同 的散列地址(即H(key1)=H(key2),出现了多对一的情况),则将该 现象称为冲突,而发生冲突的这两个关键字则称为该散列函数H的同 义词。
若关键字位数较多,也可将关键字分割成位数相同的几段(最后一段的位 数可以不同),段的长度取决于散列表的地址位数,然后将各段的叠加和 (舍去进位)作为散列地址。折叠法又分移位叠加和边界叠加两种。移位 叠加是将各段的最低位对齐,然后相加;边界叠加则是两个相邻的段沿边 界来回折叠,然后对齐相加。 – 例如关键字key=58242324169,散列表长度为 1000,则将此关键字分 成三位一段,两种叠加结果如下: 移位叠加 边界叠加 582 582 423 324 241 241 + 69 + 96 [1]315 [1]243 H(key)=315 H(key)=243
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
表 7 .1 关 键 字 集 合 S 对 应 的 散 列 表 散列地址 关键字 其它数据项
2. 散列技术
散列表实例
• 例 3 已知线性表的关键字集合为: S={and,begin,do,end,for,go,if,repeat,th en,until,while}
1
2
搜索引擎魔法般的查找速度
仅仅在不到一秒钟的时间就可以给出随机问题的查找结果。
– 实时查找时要在其数据库中线性查找?折半查找? – 有更快更好的方法吗?
实现前提:网页分析(网络爬虫、信 SCHOOL OF TELECOMMUNICATIONS 息指纹 *)并建立专用数据库。
ENGINEERING
Xidian University
1
2
2. 散列技术 问题的引入
• 实际应用中:
–百度文库能否构造一种查找方法与比较次数无关或关系较小?
• 答案:Yes!
– 散列表查找可达到这一要求:不用比较而直接计算出记录所在地址, 从而可直接进行存取的方法。 – 散列表查找的基础是散列存储结构。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表的概念
• 散列法(存储),又称关键字——地址转换法。 Address=h(KeyWord)
散列函数或哈希函数 散列地址或哈希地址
• 用散列法存储的线性表叫散列表(Hash Table)或哈希表。
通常散列表的存储空间是一个一维数组,散列地址 是数组的下标,在不致于混淆之处,我们将这个一 维数组空间就简称为散列表。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-4
• 6. 基数转换法 – 基本思想: 把关键字看成是另一个进制上的数后,再把它转换成原来进制 上的数,取其中的若干位作为散列地址。一般取大于原来基数 的数作为转换的基数,并且两个基数互素为好。 – 例如: 给定一个十进制数的关键字为(210485)10,我们把它看成以13为
基数的十五进制(210485)13,再把它转换为十进制: (210485)13=2 135+1 134+0 133+4 132+8 13+5=(771932)10 假设散列表长度10000,则可取低四位1932作为散列地址。
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造
随机数 法 其他 … 散列函 数的构 造 除留余 数法
基数转 换法
数字选 择法
折叠法
平方取 中法
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
0 1 2 3 4 5 6 7 8 · · · 17 18 19 20
and begin do end for go if · · · repeat then until · · ·
则可设散列表为: char HT2[26][8]; 散列函数 H2(key)的值,取为关键字key中第 一个字母在字母表{a,b,,z}中的序号(序号 范围是 0至 25),即 H2(key)=key[0] a 其中, key的类型是长度为 8的字符数组,利 用 H2构造的散列表如右表所示。
– 注:常人的头发数在15万左右 – 可以假定没有人有超过 100万根头发 – 西安市人口大于100万。
我们取的关键字就好比鸽子,它们的散列函数值就好比笼子, 一个笼子里出现了多于一只的鸽子,那么就会出现冲突。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
用计算机解决实际问题的学问
数据结构与算法分析
任课教师:马彦卓
yzma@mail.xidian.edu.cn
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
四种常用的存储方法 • • • • 顺序存储 链式存储 索引结构(查找运算) 散列技术(查找运算)
每秒上百万次的能力下 需要几十分钟,速度太慢
折半查找
至多需要30多次查找, 可瞬间完成,省时间
索引查找
最快情况下与折半查找速度相当 当数据量增大时,上述方法都会越来越慢
更快、与数据量增长无关的查找方式?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
• 4. 除留余数法
– 基本思想: 选择适当的正整数p,用p去除关键字,取所得余数作为散列地址, 即: H(key)=key % p – 一般地选 p为小于或等于散列表长度m的某个最大素数比较好。 – 例如: “小于或等于”:保证在值域内; m=8, 16, 32, 64, 128, 256, 512, 1024 “某个最大”:使值分散在整个 p=7, 13, 31, 61, 127, 251, 503, 1019 值域区间内;
“素数”:使模运算结果“均匀 化”。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-3 • 5. 折叠法
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表实例 • 例 1 假设要建立一张全国34个地区的各民族人口统计表,每个地 区为一个记录,记录的各数据项为: •
编 号 地 区 总人口 汉族 回族 ……
显然可以用数组R[34] 来存放这张表,其中R[i]是编号为i的地区 的人口情况。编号i便为记录的关键字,由它惟一确定记录的存储 位置 R[i]。 • 例 2 已知一个含有70个结点的线性表,其关键字都由两位十进制 数字组成,则可将此线性表存储在如下说明的散列表中。 datatype HT1[100]; 其中,HT1[i]存放关键字为i的结点,即散列函数为 H1(key)=key
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-2 • 3. 平方取中法
先通过关键字的平方值扩大差别,然后,再取中间的几位或其组合作为散列地址。
– 例 如 , (0100,0110,1010,1001,0111) 关 键 字 的 平 方 结 果 是 : (0010000,0012100,1020100,1002001,0012321) 若 表 长 为 1000 , 则 可 取 中 间 三 位 作 为 散 列 地 址 集 : (100,121,201,020,123)
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术 冲突的产生——鸽巢原理
• 若有 n个笼子和n+1只鸽子,所有的鸽子都 被关在鸽笼里,那么至少有一个笼子有至 少 2只鸽子。 • 简单原理推出的有趣事实:西安至少有两 个人头发数一样多。
Xidian University
1
2
1
3
4
5
6
2
7
8
2. 散列技术
概念的介绍
Hash技术的原始面目:
Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的 输出,该输出就是散列值。 无限大 很有限
冲突: h(key1)=h(key2),多对一。 装填因子: key1、key 2称为散列函数H的同义词。 散列表空间大小为 m, 填入表中的结点数是n(n<m), 设计原理:容纳数据,避免冲突 则称 α=n/m为散列表的装填因子。 常取值于 [0.65,0.9]
表 7.2 关键字及其相应的散列地址表示例 关键字 散列地址 散列地址 1(0 999) 2(0 99) 87142653 465 99 87172232 723 04 87182745 874 32 87107156 015 57 87127281 228 03 87157394 539 47
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-1 • 1. 数字选择法
若关键字的位数比散列表的地址位数多,则可选取数字分布比较均匀的 若干位作为散列地址。(必须能预先估计到所有关键字的每一位上各种 数字的分布情况 )
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
内容
索引结构
7
索引和散列
散列技术
注:教材第7章
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
数十亿QQ用户同时登录会发生什么? 线性查找
1
2
2. 散列技术
散列表讨论
• 散列法查找必须解决下面两个主要问题: (1)选择一个计算简单且冲突尽量少的“均匀”的散列函数;
冲突 在所 难免
冲突: H(key1)=H(key2) key1、key2称为散列函数H的同义词。
(2)确定一个解决冲突的方法,即寻求一种方法存储产生冲突的同义词。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
以上都是非常简单的例子
——在实际应用中,问题规模要大得多, 而且也难有这么理想的一对一的Hash函数
21
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表讨论 • 讨论:
– 1 理想的散列函数是一个一对一的函数。 – 2 装填因子:散列表空间大小为m,填入表中的结点数是n,则称 =n/m为散列表的装填因子。实用时,常在区间[0.65,0.9]上取的 适当值。 – 3 散列函数的选取原则是:
第 4,6,7位
n
(4+7)% 10为高位 (6+8)% 10为低位
2. 随机数法
选择一个随机函数,取关键字的随机函数值为它的散列地址,即 H(key)=random(key) 其中: random为随机函数。(当关键字长度不等时采用此法构造散列地址较 恰当 )
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
• 运算应尽可能简单; • 函数的值域必须在表长的范围之内; • 尽可能使得关键字不同时,其散列函数值亦不相同。
– 4 冲突:若某个散列函数 H对于不相等的关键字key1和 key2得到相同 的散列地址(即H(key1)=H(key2),出现了多对一的情况),则将该 现象称为冲突,而发生冲突的这两个关键字则称为该散列函数H的同 义词。
若关键字位数较多,也可将关键字分割成位数相同的几段(最后一段的位 数可以不同),段的长度取决于散列表的地址位数,然后将各段的叠加和 (舍去进位)作为散列地址。折叠法又分移位叠加和边界叠加两种。移位 叠加是将各段的最低位对齐,然后相加;边界叠加则是两个相邻的段沿边 界来回折叠,然后对齐相加。 – 例如关键字key=58242324169,散列表长度为 1000,则将此关键字分 成三位一段,两种叠加结果如下: 移位叠加 边界叠加 582 582 423 324 241 241 + 69 + 96 [1]315 [1]243 H(key)=315 H(key)=243
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
表 7 .1 关 键 字 集 合 S 对 应 的 散 列 表 散列地址 关键字 其它数据项
2. 散列技术
散列表实例
• 例 3 已知线性表的关键字集合为: S={and,begin,do,end,for,go,if,repeat,th en,until,while}
1
2
搜索引擎魔法般的查找速度
仅仅在不到一秒钟的时间就可以给出随机问题的查找结果。
– 实时查找时要在其数据库中线性查找?折半查找? – 有更快更好的方法吗?
实现前提:网页分析(网络爬虫、信 SCHOOL OF TELECOMMUNICATIONS 息指纹 *)并建立专用数据库。
ENGINEERING
Xidian University
1
2
2. 散列技术 问题的引入
• 实际应用中:
–百度文库能否构造一种查找方法与比较次数无关或关系较小?
• 答案:Yes!
– 散列表查找可达到这一要求:不用比较而直接计算出记录所在地址, 从而可直接进行存取的方法。 – 散列表查找的基础是散列存储结构。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表的概念
• 散列法(存储),又称关键字——地址转换法。 Address=h(KeyWord)
散列函数或哈希函数 散列地址或哈希地址
• 用散列法存储的线性表叫散列表(Hash Table)或哈希表。
通常散列表的存储空间是一个一维数组,散列地址 是数组的下标,在不致于混淆之处,我们将这个一 维数组空间就简称为散列表。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-4
• 6. 基数转换法 – 基本思想: 把关键字看成是另一个进制上的数后,再把它转换成原来进制 上的数,取其中的若干位作为散列地址。一般取大于原来基数 的数作为转换的基数,并且两个基数互素为好。 – 例如: 给定一个十进制数的关键字为(210485)10,我们把它看成以13为
基数的十五进制(210485)13,再把它转换为十进制: (210485)13=2 135+1 134+0 133+4 132+8 13+5=(771932)10 假设散列表长度10000,则可取低四位1932作为散列地址。
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造
随机数 法 其他 … 散列函 数的构 造 除留余 数法
基数转 换法
数字选 择法
折叠法
平方取 中法
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
0 1 2 3 4 5 6 7 8 · · · 17 18 19 20
and begin do end for go if · · · repeat then until · · ·
则可设散列表为: char HT2[26][8]; 散列函数 H2(key)的值,取为关键字key中第 一个字母在字母表{a,b,,z}中的序号(序号 范围是 0至 25),即 H2(key)=key[0] a 其中, key的类型是长度为 8的字符数组,利 用 H2构造的散列表如右表所示。
– 注:常人的头发数在15万左右 – 可以假定没有人有超过 100万根头发 – 西安市人口大于100万。
我们取的关键字就好比鸽子,它们的散列函数值就好比笼子, 一个笼子里出现了多于一只的鸽子,那么就会出现冲突。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
用计算机解决实际问题的学问
数据结构与算法分析
任课教师:马彦卓
yzma@mail.xidian.edu.cn
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
四种常用的存储方法 • • • • 顺序存储 链式存储 索引结构(查找运算) 散列技术(查找运算)
每秒上百万次的能力下 需要几十分钟,速度太慢
折半查找
至多需要30多次查找, 可瞬间完成,省时间
索引查找
最快情况下与折半查找速度相当 当数据量增大时,上述方法都会越来越慢
更快、与数据量增长无关的查找方式?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
• 4. 除留余数法
– 基本思想: 选择适当的正整数p,用p去除关键字,取所得余数作为散列地址, 即: H(key)=key % p – 一般地选 p为小于或等于散列表长度m的某个最大素数比较好。 – 例如: “小于或等于”:保证在值域内; m=8, 16, 32, 64, 128, 256, 512, 1024 “某个最大”:使值分散在整个 p=7, 13, 31, 61, 127, 251, 503, 1019 值域区间内;
“素数”:使模运算结果“均匀 化”。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-3 • 5. 折叠法
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术
散列表实例 • 例 1 假设要建立一张全国34个地区的各民族人口统计表,每个地 区为一个记录,记录的各数据项为: •
编 号 地 区 总人口 汉族 回族 ……
显然可以用数组R[34] 来存放这张表,其中R[i]是编号为i的地区 的人口情况。编号i便为记录的关键字,由它惟一确定记录的存储 位置 R[i]。 • 例 2 已知一个含有70个结点的线性表,其关键字都由两位十进制 数字组成,则可将此线性表存储在如下说明的散列表中。 datatype HT1[100]; 其中,HT1[i]存放关键字为i的结点,即散列函数为 H1(key)=key
Xidian University
1
2
运算应尽可能简单; 函数的值域必须在表长的范围 之内; 尽可能使得关键字不同时,其 散列函数值亦不相同。
2. 散列技术
散列函数的构造-2 • 3. 平方取中法
先通过关键字的平方值扩大差别,然后,再取中间的几位或其组合作为散列地址。
– 例 如 , (0100,0110,1010,1001,0111) 关 键 字 的 平 方 结 果 是 : (0010000,0012100,1020100,1002001,0012321) 若 表 长 为 1000 , 则 可 取 中 间 三 位 作 为 散 列 地 址 集 : (100,121,201,020,123)
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
2. 散列技术 冲突的产生——鸽巢原理
• 若有 n个笼子和n+1只鸽子,所有的鸽子都 被关在鸽笼里,那么至少有一个笼子有至 少 2只鸽子。 • 简单原理推出的有趣事实:西安至少有两 个人头发数一样多。