- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在前面讨论的静态查找和动态查找结构中,结点在结构中的相对位置是随机的,位置和结点的关键字之间不存在确定的关系,因此在结构查找结点需要进行一系列的关键字之间的比较,这类查找方法是建立在比较的基础上的,查找的效率依赖于查找过程中进行比较的次数。是否可以不用比较而直接得到结点的存储地址,从而找到所需的结点呢?哈希表为我们提供了肯定的答案。 8.4 哈希表及其查找 8.4.1 哈希表与哈希函数 哈希函数又叫散列函数,它是一种能把关键字映射成记录存储地址的函数。 哈希函数:假设F是一个包含n个记录的文件空间,Ri为文件中的某个记录(1≤i≤n),keyi是其关键字值,若在关键字值keyi与记录Ri的地址之间建立某种函数关系,则便可以通过这个函数把关键字值转换成相应记录在文件中的地址。 即有:addr(Ri)=H(keyi),其中addr(Ri)为Ri的地址,H(keyi)称为哈希函数。 哈希表:通过哈希函数构造而成的表称为哈希表。 例:已知文件中记录的关键字集合为S=(Anderson,Bush,Jenes,Refman,Rambo),空间地址为200—399。 则有: H(Anderson)=200, H(Bush)=201 H(Jenes)=209 H(Refman)=217 H(Rambo)=217+1=218 哈希函数定义为:H(key)=FORT(key)+199, FORT(key)表示关键字的首写字母在字母表中的序号。 构成的表如下所示: 把记录按地址存放到文件空间中相应的位置上,就形成了哈希表,也称散列表。 构成哈希表的过程称为地址散列。 冲突(Collision):若某个散列函数对于不同的关键字key1和key2,得到相同的散列地址,这种现象称为冲突,这两个具有相同函数值的关键字称为同义词。 如上例Refman、Rambo。 这时就需要想办法处理冲突,使得每个关键字都能找到合理的位置。解决冲突即为对应到同一地址的多个同义词安排存储位置。因此在选定散列函数时应该考虑尽量避免发生冲突。冲突是很难避免的,问题在于一旦发生了冲突应如何处理。 冲突不是我们所希望的,而如何避免冲突发生,则取决于哈希函数的构造。好的哈希函数,应使散列地址均匀地分布在哈希表的整个地址区间内,这样可以避免或减少发生冲突。 然而,这并非是件容易做到的事。哈希函数的构造,与关键字的长度、哈希表的大小、关键字的实际取值状况等许多因素有关,而且有的因素事前不能确定(如关键字的实际取值只知道范围)。哈希函数的构造或多或少带有杂凑的意味,英文单词hash一词就是杂凑的意思。 直接定址法 数字分析法 平方取中法 折叠法 除留余数法 随机数法 8.4.2 构造哈希函数的常用方法 1、直接定址法 取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a·key+b 其中a和b为常数。 例如:有一个1岁到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。 此法仅适合于: 地址集合的大小 = = 关键字集合的大小 2、 数字分析法 假设关键字是以R为基的数(如2,8,10等),并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干数位来组成哈希地址,这就是数字分析法。 这种方法适合于关键字值中各位字符分布为已知的情况。 例如:有80个记录,关键字为8位10进制数,则可取其中两位数作为哈希地址。 原则是使得到的哈希地址尽量避免产生冲突,则需从分析这80个关键字着手,下面是一部分数字: ① 由于中间的四位近乎随机,可取中间4位中的任意两位。 ② 或取其中两位与另外两位的叠加求和后舍去进位。 3、 平方取中法 有时一组关键字在每一位上某些数字的重复出现频率很高,例如:(0100,1100,1200,1160,2060,2163,2261,2262),这时无法是用数字分析法得到较均匀的哈希函数。 平方取中法是首先求关键字的平方值,通过平方来扩大差别,然后再选其中的几位或其组合作为哈希地址。 该方法适用于关键字位数少而相同的位数多的关键字。 4、折叠法(边界法)与转移法(移位法) 有时关键字含位数较多,这时可将关键字值从某些地方断开,分成几段,其中一段的长度等于地址的位数,把其余折叠加到它的上面,若产生进位则舍去。有两种折叠方法(folding): 边界法 移位法(转移法) 1、边界法:从一端沿分割界来回折送,然后对齐相加 此法适于关键字的数字位数特别多。
文档评论(0)