DS08_散列查找a__陈越主编_数据结构_第1页
DS08_散列查找a__陈越主编_数据结构_第2页
DS08_散列查找a__陈越主编_数据结构_第3页
DS08_散列查找a__陈越主编_数据结构_第4页
DS08_散列查找a__陈越主编_数据结构_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第5章 散列查找 5.1 引子已有已有几种查找方法:几种查找方法:h)(log2NO已经已经是相当不错的时间复杂度是相当不错的时间复杂度!顺序查找顺序查找二分查找(静态查找)二分查找(静态查找)二叉搜索树二叉搜索树)(NO)(log2NO)(hO为二叉查找树的高度到底还有没有其他到底还有没有其他适应性广适应性广而而速度又快速度又快的查找方法呢?的查找方法呢?2第5章 散列查找 5.1 引子例例5.1 在登录在登录QQ的时候,的时候,QQ服务器如何服务器如何核对你核对你的身份的身份,以确定你就是该号码的主人?,以确定你就是该号码的主人?【分析分析】看看是否可以用看看是否可以用二分法二分法查找。

2、查找。 十亿十亿(109 230)有效用户,用二分查找有效用户,用二分查找30次次。 十亿十亿(109 230) 1K 1024G,1T连续空间。连续空间。 按有效按有效QQ号大小号大小有有序存储序存储:在连续存储空间中,在连续存储空间中,插插入和删除入和删除一个新一个新QQ号码将需要号码将需要移动大量数据移动大量数据。用不了二分查找,用不了二分查找,我们该怎么办?我们该怎么办?3第5章 散列查找 5.1 引子例例5.2 查英文字典的过程查英文字典的过程查询英文单词查询英文单词“zoo”,你为什么不用二分法,而直接从字典的后面找?你为什么不用二分法,而直接从字典的后面找? 我们已经根据要查找的

3、关键词我们已经根据要查找的关键词“zoo”在脑子里经过了在脑子里经过了“计计算算”,得出该关键词所在的,得出该关键词所在的大致位置大致位置,这样就能,这样就能更快地更快地找到它。找到它。这个这个“计算计算”过程非常类似于本章将要介绍的散列查找中的过程非常类似于本章将要介绍的散列查找中的“散列函数计算散列函数计算”。 查字典的过程结合了查字典的过程结合了散列查找散列查找(用于初步定位)、(用于初步定位)、二分查找二分查找(一般不是准确二分)和(一般不是准确二分)和顺序查找顺序查找(当很接近关键词的时候)等(当很接近关键词的时候)等几种查找方法。几种查找方法。4第5章 散列查找 5.1 引子例例5

4、.3 网上搜索。网上搜索。搜索引擎搜索引擎是如何如此是如何如此神速地神速地把我们把我们需要的需要的有关信息有关信息找到的?找到的?【分析分析】主要数据结构是主要数据结构是“倒排索引倒排索引” - “单词到文档单词到文档”的映射关系。的映射关系。如何在这个巨大无比的表格如何在这个巨大无比的表格中查找特定的关键词中查找特定的关键词? DocsTerms文档文档1文档文档2文档文档m1文档文档m关键词关键词13: 1,12,2002: 1, 223: 9,40,52关键词关键词202: 11,22 4: 9,20,32,655: 5,9,10,32,35关键词关键词n1005: 3,9,10,32,

5、5610: 5,6,19,.,44关键词关键词n5: 1,9,20,22,55001: 75【问题问题】如何能够在极短的时间内(比如如何能够在极短的时间内(比如1秒内)搜索到需要的关键词?秒内)搜索到需要的关键词? 第5章 散列查找 5.1 引子 散列查找法的两项基本工作:散列查找法的两项基本工作:构造散列函数:构造散列函数:确定关键词所在的存储位置的确定关键词所在的存储位置的计算方法计算方法; 解决冲突:解决冲突:当多个关键词所在的存储位置相同时的解决方法。当多个关键词所在的存储位置相同时的解决方法。【答案答案】散列查找法散列查找法是是很好很好方法之一!方法之一!)(log2NO 并且,期望

6、查找的并且,期望查找的时间复杂度时间复杂度好于好于 ,几乎是常量:几乎是常量:O(1),即查找时间与问题规模无关!),即查找时间与问题规模无关! 当然,散列查找法也有当然,散列查找法也有缺点和局限性缺点和局限性6散列表散列表的定义的定义 形如形如“名字名字(Name)-属性属性(Attribute)”对的集合的对的集合的“符号表符号表(Symbol Table)”也叫做也叫做“散列表散列表” (Hash Table,即,即哈希表哈希表)。)。类型名称类型名称:符号表(符号表(SymbolTable)数据对象集:数据对象集:符号表是符号表是“名字名字(Name)-属性属性(Attribute)”

7、对的集合。对的集合。操作集:操作集:对于一个符号表对于一个符号表Table SymbolTable,一个给定名字,一个给定名字Name NameType,属性属性Attr AttributeType,以及正整数,以及正整数TableSize,符号表的基本操作主要有:,符号表的基本操作主要有:1、SymbolTable InitializeTable( int TableSize ):创建一个长度为:创建一个长度为TableSize的符号表;的符号表;2、Boolean IsIn( SymbolTable Table, NameType Name): 查找特定的名字查找特定的名字Name是否在符

8、号表是否在符号表Table中;中;3、AttributeType Find( SymbolTable Table, NameType Name): 获取获取Table中指定名字中指定名字Name对应的属性;对应的属性;4、SymbolTable Modefy(SymbolTable Table, NameType Name, AttributeType Attr): 将将Table中指定名字中指定名字Name的属性修改为的属性修改为Attr;5、SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr): 向

9、向Table中插入一个新名字中插入一个新名字Name及其属性及其属性Attr;6、 SymbolTable Delete(SymbolTable Table, NameType Name): 从从Table中删除一个名字中删除一个名字Name及其属性。及其属性。3/225.2 基本概念第5章 散列查找 7“散列(散列(Hashing)” 的基本思想是:以数据对象的关键字的基本思想是:以数据对象的关键字key为自变量,通过一个确定的为自变量,通过一个确定的函数关系函数关系 h,计算出对应的函数值,计算出对应的函数值h(key),把这个值解释为数据对象的存储地址,并按此存放,即,把这个值解释为数据

10、对象的存储地址,并按此存放,即“存储位置存储位置 = h(key)”。第5章 散列查找 5.2 基本概念 散列方法中使用的计算函数称为散列方法中使用的计算函数称为“散列函数散列函数” (也称哈希函数),(也称哈希函数),按这个思想构造的表称为按这个思想构造的表称为“散列表散列表”,所以它也是一种存储方法。,所以它也是一种存储方法。 在查找某数据对象时,用同样的方法在查找某数据对象时,用同样的方法“存储位置存储位置 = h(key)”计计算出地址,将算出地址,将key与该地址单元中数据对象关键字进行比较,确定查与该地址单元中数据对象关键字进行比较,确定查找是否成功。找是否成功。通常关键词的通常关

11、键词的值域值域(允许取值的范围)远远大于表空间的(允许取值的范围)远远大于表空间的地址地址集集,所以说,所以说,冲突不可能避免,只能尽可能减少冲突不可能避免,只能尽可能减少。 可能将可能将不同的关键字映射到同一个散列地址不同的关键字映射到同一个散列地址上,即上,即h(keyi) = h(keyj)(当(当keyi keyj),这种现象称为),这种现象称为“冲突冲突(Collision)”, keyi 和和keyj称为称为“同义词(同义词(synonym)”。8例例5.4 有有n = 11个数据对象的集合,关键词是正整数,分别为个数据对象的集合,关键词是正整数,分别为 18,23,11,20,2

12、,7,27,30,42,15,34。如果符号表的。如果符号表的大小用大小用TableSize = 17(通常用一个素数),选取散列函数(通常用一个素数),选取散列函数h如下:如下:h(key) = key mod TableSize (公式(公式 5.1)其中其中mod 是求余运算,相当于是求余运算,相当于C语言中的语言中的%运算。运算。用这个散列函数对用这个散列函数对11个数据对象建立查找表(个数据对象建立查找表(忽略各关键词对应的属性部分,该例的关键词没有冲突)如下:)如下:第5章 散列查找 5.2 基本概念 查找时,对给定关键词查找时,对给定关键词keyi依然通过公式依然通过公式5.1计

13、算出地址,再计算出地址,再将将keyi与该地址单元中关键词比较,若相等,则查找成功。与该地址单元中关键词比较,若相等,则查找成功。 比如查找:比如查找:key = 22, 地址是地址是22%17 = 5,该地址空表示表中,该地址空表示表中没有关键词没有关键词22的信息。的信息。比如查找:比如查找:key = 40, 地址是地址是40%17 = 6,该地址存的是,该地址存的是23,40 23,故还要采用后面介绍的,故还要采用后面介绍的解决冲突解决冲突的策略才能确定。的策略才能确定。地址地址0123456789 10 11 12 13 14 15 16关键词关键词 34 18 2 2023 7 4

14、227 113015【定义定义】 设散列表空间大小为设散列表空间大小为m,填入表中的元素个数是,填入表中的元素个数是n,则称,则称 n / m为散列表的为散列表的“装填因子(装填因子(Loading Factor)”。 装填因子装填因子11 / 17 0.65。 实用时,常将散列表大小设计使得实用时,常将散列表大小设计使得 0.50.8为宜为宜。9例例5.5 将给定的将给定的10个个C语言中的关键词语言中的关键词(保留字或标准函数名保留字或标准函数名)顺次存入一张散列表。这顺次存入一张散列表。这10个关键词为:个关键词为:acos、define、float、exp、char、atan、ceil

15、、floor、clock、ctime。散列表设计为一个散列表设计为一个二维数组二维数组Table262,2列分别代表列分别代表 2个槽。个槽。 第5章 散列查找 5.2 基本概念槽槽 1槽槽 0012345625装填因子装填因子 ?10 / 52 = 0.19为了把字母为了把字母 a z 映射到映射到 0 25, 如何设计散列如何设计散列函数函数h (key ) = ? h(key) = key0 aacosacosdefinedefinefloatfloatexpexpcharcharatanatanceilceilfloorfloorclockctime如何设计如何设计散列函数散列函数,使

16、得,使得发生发生冲突的概率冲突的概率尽可能小?尽可能小?当当冲突或溢出冲突或溢出不可避免时,不可避免时,如如何处理何处理使得表中没有空单元被使得表中没有空单元被浪费,同时浪费,同时插入、删除、查找插入、删除、查找等操作都能正确完成?等操作都能正确完成?10第5章 散列查找 5.3 散列函数的构造方法 一个一个“好好”的散列函数一般应考虑下列的散列函数一般应考虑下列两个因素两个因素:1. 计算简单计算简单,以便提高转换速度;,以便提高转换速度;2. 关键词对应的关键词对应的地址空间分布均匀地址空间分布均匀,以尽量减少冲突。,以尽量减少冲突。 数字关键词数字关键词的散列函数构造的散列函数构造1直接

17、定址法直接定址法 取关键词的某个线性函数值为散列地址取关键词的某个线性函数值为散列地址,即,即 h(key) = a key + b (a、b为常数为常数)地址地址h(key)出生年份出生年份(key)人数人数(attribute)0 01990199012851285万万1 11991199112811281万万2 21992199212801280万万10102000200012501250万万21212011201111801180万万11第5章 散列查找 5.3 散列函数的构造方法2除留余数法除留余数法散列函数为:散列函数为:h(key) = key mod p例例5.4: h(key

18、) = key % 17 地址地址h(key)012345678910 11 12 13 14 15 16关键词关键词key34 182202374227 113015 这里:这里:p = Tablesize = 17。也可以采用。也可以采用 p TableSize; TableSize = n/;n-key集合的大小,集合的大小,装填因子上限;装填因子上限; p TableSize的某个最大的某个最大素数素数。TableSize81632641282565121024p7133161127251503101912第5章 散列查找 5.3 散列函数的构造方法3数字分析法数字分析法 取取11位手

19、机号码位手机号码key的后的后4位作为地址:位作为地址: 散列函数为:散列函数为:h(key) = atoi(key+7) 若若key集合大小集合大小n 10000, 则比较合适。若取则比较合适。若取装填因子上限装填因子上限=0.8,那么地址空间(表长),那么地址空间(表长)TableSize = n/=12500 若若key集合大小集合大小n 100, 则可以作如下二选一:则可以作如下二选一:a、若取、若取装填因子上限装填因子上限=0.8,那么地址空间(表长),那么地址空间(表长)TableSize = n/128, 取取p=127,h(key) = atoi(key+7) % pb、直接、

20、直接取后取后2位作为地址:位作为地址: h(key) = atoi(key+9),而表长而表长TableSize = n/ 127。13第5章 散列查找 5.3 散列函数的构造方法3数字分析法数字分析法如果关键词如果关键词 key 是是18位的身份证号码:位的身份证号码: h1(key) = (key6-0) 104 + (key10-0) 103 + (key14-0) 102 + (key16-0) 10 + (key17-0)h(key) = h1(key) 10 + 10 (当(当 key18 = x时)时)或或 h(key) = h1(key) 10 + key18-0 (当(当 key18 为为0 9时)时)123456789101112131415161718330106199010080419省省市市区(县)区(县)下属辖下属辖区编号区编号(出生)年份(出生)年份月份月份日期日期该辖区中的该辖区中的序号序号校校验验14字符关键词字符关键词的散列函数构造的散列函数构造1一个简单的散列函数一个简单的散列函数ASCII码加和法码加和法对字符型关键词对字符型关键词key定义散列函数如下:定义散列函数如下:h(key) = (keyi) mod T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论