- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构刘勇 中国科大chapter9 查找
// c语言: srand((int)time(NULL)); index = rand() % prime_number; * * * 选择一个随机函数,取关键字的随机函数值作为它的哈希地址,即: H(key) = random(key) 通常当关键字长度不等时采用此法构造哈希地址比较恰当。 6. 伪随机数法 参考德国联邦信息安全办公室给出了随机数发生器质量评判的四个标准。https://www.bsi.bund.de/cae/servlet/contentblob/478152/publicationFile/30552/ais20e_pdf.pdf 1——相同序列的概率非常低 2——符合统计学的平均性,比如所有数字出现概率应该相同,卡方检验应该能通过,超长游程长度概略应该非常小,自相关应该只有一个尖峰,任何长度的同一数字之后别的数字出现概率应该仍然是相等的等等 3——不应该能够从一段序列猜测出随机数发生器的工作状态或者下一个随机数 4——不应该从随机数发生器的状态能猜测出随机数发生器以前的工作状态我们 一般用的随机数发生器至少要符合K1和K2,而用于加密等应用的随机数发生器应该符合K3和K4。 * 在实际应用中,应根据具体情况,灵活采用不同的方法,并用实际数据测试哈希函数的性能,以便做出正确判定。通常应考虑以下五个因素: 计算哈希函数所需的时间(简单); 关键字的长度; 哈希表的大小; 关键字的分布情况。 记录查找的频率(整体上低频数据对冲突的容忍度高一些。) * 9.3.3 处理冲突的方法 1. 开放定址法 其基本思想是:当关键字key的哈希地址p = H(key)出现冲突时,产生下一个哈希地址p1,如果p1仍然冲突,再产生下一个哈希地址p2,……,逐个探测,直到找出一个不冲突的哈希地址pi,将相应元素存入其中。 * 这种方法有一个通用的再散列函数形式: MOD m i=1, 2, …, n 其中H(key)为哈希函数, m 为表长, di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。 * )线性探测再散列, di=1,2,3,…, m-1这种方法的特点是:冲突发生时,顺序查看表中下一单元, 直到找出一个空单元或查遍全表。 )二次探测再散列, di=12,-12,22,-22,…,k2,-k2 (k≤m/2)这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测, 比较灵活。 )伪随机探测再散列, di=伪随机数序列。具体实现时,应建立一个伪随机数发生器,并给定一个随机数做起点。 * 例如,已知哈希表长度m=11,哈希函数为:H(key)= key MOD 11, 则H(47)=3,H(26)=4,H(60)=5,假设下一个关键字为69,则H(69)=3,与47冲突。如果用线性探测再散列处理冲突,下一个哈希地址为H1=(3+1) MOD 11=4,仍然冲突,再找下一个哈希地址为H2=(3+2) MOD 11=5,还是冲突,继续找下一个哈希地址为H3=(3+3) MOD 11=6,此时不再冲突,将69填入6号单元,参见下图。 69 60 26 47 0 1 2 3 4 5 6 7 8 9 10 * 从前述线性探测再散列的过程中可以看出,当表中i,i+1,i+2的位置上已经填有记录时,下一个哈希地址为i,i+1,i+2和i+3的记录都希望填入i+3的位置,这种现象称为“二次聚集”,即在处理同义词的冲突过程中又添加了非同义词的冲突。 * 如果用二次探测再散列处理冲突,下一个哈希地址为H1=(3+12) MOD 11=4,仍然冲突,再找下一个哈希地址为H2=(3-12) MOD 11=2,此时不再冲突,将69填入2号单元,参见下图。 60 26 47 69 0 1 2 3 4 5 6 7 8 9 10 * 如果用伪随机探测再散列处理冲突,且伪随机数序列为:2,5,9……则下一个哈希地址为H1=(3+2) MOD 11=5,仍然冲突,再找下一个哈希地址为H2=(3+5) MOD 11=8,此时不再冲突,将69填入8号单元,参见下图。 69 60 26 47 0 1 2 3 4 5 6 7 8 9 10 * 2. 再哈希法 这种方法是同时构造多个不同
文档评论(0)