- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
散列方法散列函数
2005-5-12 2005 Spring Data Structures by Haiyan Zhao 第六章 字典与检索 之2 赵海燕 zhhy@sei.pku.edu.cn 软件研究所 12 May 2005 散列检索 基于关键码比较的检索 顺序检索,==, != 二分法、树型 , == , 检索是直接面向用户的操作 当问题规模n很大时,基于比较的检索其时间效率可能使得用户无法忍受 最理想的情况:关键码和记录的存储位置之间建立一个确定的对应关系 根据关键码值,直接找到记录的存储地址 不需要把待查关键码与候选记录集合的某些记录进行逐个比较 散列检索 例如,读取指定下标的数组元素 根据数组的起始存储地址、以及数组下标值而直接计算出来的,所花费的时间是O(1) 与数组元素个数的规模n无关 受此启发,计算机科学家发明了散列方法 散列既是一种重要的存储方法 也是一种常见的检索方法 散列检索 根据关键码值直接访问,而不是基于关键码的比较 顺序检索,==, != 二分法、树型 , ==, 散列既是重要的存储方法,也是检索方法 在记录的存储位置和关键码之间建立确定的对应关系,可用函数hash (或简写为h)来表示 把关键码值映射到表中的一个位置,检索时根据这种对应关系,由关键码值直接找到记录的存储地址,从而访问所需记录 散列方法既适宜于内存,也适宜于外存 散列方法 散列函数:把关键码映射到存储位置的函数,通常用 h来表示 address = h(key) 故也被称为关键码-地址转换法,或杂凑法 散列表/杂凑表/哈希表(hash table):用于存放记录的数组,也称基本存储区域,一般用HT[0..M-1]来表示 0≤h(k) M-1 散列基本思想 一个确定的函数关系 h 以结点的关键码K为自变量 函数值h(K)作为结点的存储地址 检索时也是根据这个函数计算其存储位置 通常散列表的存储空间是一个一维数组 散列地址是数组的下标 示例 例:已知线性表关键码集合为: S = { and, begin, do, end, for, go, if, repeat, then, until, while} 可设散列表为: char HT2[26][8]; 散列函数H(key)的值,取为关键码key中的第一个字母在字母表{a, b, c, ..., z}中的序号,即: H(key) = key[0] – ‘a’ 例:在集合S中增加4个关键码,集合S1 = S + { else, array, with, up} 要修改散列函数:散列函数的值为key中首尾字母在字母表中序号的平均值,即: int H3(key) char key[]; int i; { i = 0; while ((i8) (key[i]!=‘\0’)) i++; return((key[0] + key(i-1) – 2*’a’) /2 ) } 散列涉及的基本概念 负载因子α= n/m 散列表的空间大小为m 填入表中的结点数为n 碰撞/冲突/(collision) 某个散列函数对于不相等的关键码计算出了相同的散列地址 在实际应用中,不产生冲突的散列函数极少存在 同义词 对于某一散列函数发生碰撞的若干个关键码 碰撞示例 不同的关键码值,通过散列函数的计算,得到了相同的的散列值,即有 k1 != k2 , 但 h(k1) = h(k2) 例,一组表项,其关键码分别为 12361, 07251, 03309, 30976 采用的散列函数为 h(x) = x % 73 则有 h(12361) = h(07251) = h(03309) = h(30976) 散列法的要素 涉及散列的基本问题/首要问题可分成两类: 散列函数需具备怎样的特性(properties)?怎样才能获得或设计一个具有这些特性的散列函数? 如何构造(选择)使结点“分布均匀”的散列函数? 一旦发生冲突的情况下,怎样处理散列表中出现的碰撞问题? 还需考虑散列表本身的组织方法 一一来考虑…… 散列函数 散列函数:把关键码值映射到存储位置的函数,通常用 h 来表示 Address = h( key ) 散列函数的特性 一个好的散列函数应: 定义域必须包括需要的全部关键码,如果散列表允许有M个地址时,其值域必须在0到M-1之间 简单且能快速计算出结果的 计算出来的地址应能均匀分布在整个地址空间中 即,若 k 是从关键码集合中随机抽取的一个关键码,散列函数应能以同等概率取0到M-1之间的每一个值 散列函数的选择 须考虑的因素 计算时间(运算尽可能简单) 关
文档评论(0)