- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
哈希表原理简介.doc
1. 引言??????? 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用。?哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。??????? 哈希表又叫做散列表,分为“开散列” 和“闭散列”。考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅指“闭散列”,关于其他方面读者可参阅其他书籍。
2. 基础操作?2.1 基本原理??????? 我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一 个元素“分类”,然后将这个元素存储在相应“类”所对应的地方。?但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。后面我们将看到一种解决“冲突”的简便做法。?总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。?2.2 函数构造??????? 构造函数的常用方法(下面为了叙述简洁,设 h(k) 表示关键字为 k 的元素所对应的函数值):?a) 除余法:??????? 选择一个适当的正整数 p ,令 h(k ) = k mod p ,这里, p 如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。?b) 数字选择法:??????? 如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。?2.3 冲突处理??????? 线性重新散列技术易于实现且可以较好的达到目的。令数组元素个数为 S ,则当 h(k) 已经存储了元素???时候,依次探查 (h(k)+i) mod S , i=1,2,3…… ,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。?2.4 支持运算??????? 哈希表支持的运算主要有:初始化(makenull)、哈希函数值的运算(h(x))、插入元素(insert)、查找元素(member)。 设插入的元素的关键字为 x ,A 为存储的数组。 初始化比较容易,例如 :
[cpp]? HYPERLINK /ilibaba/article/details/3960142 \o view plain view plain HYPERLINK /ilibaba/article/details/3960142 \o copy copy
const?empty=maxlongint;?//?用非常大的整数代表这个位置没有存储元素??
p=9997;?//?表的大小??
procedure?makenull;??
var?i:integer;??
begin??
for?i:=0?to?p-1?do??
A[i]:=empty;??
End;???
哈希函数值的运算根据函数的不同而变化,例如除余法的一个例子:?
[cpp]? HYPERLINK /ilibaba/article/details/3960142 \o view plain view plain HYPERLINK /ilibaba/article/details/3960142 \o copy copy
function?h(x:longint):Integer;??
begin??
h:=?x?mod?p;??
end;???
?????? 我们注意到,插入和查找首先都需要对这个元素定位,即如果这个元素若存在,它应该存储在什么位置,因此加入一个定位的函数 locate?
[cpp]? HYPERLINK /ilibaba/article/details/3960142 \o view plain view plain HYPERLINK /ilibaba/article/details/3960142 \o copy copy
function?locate(x:longint):integer;??
var?orig,i:integer;??
begin??
orig:=h(x);??
i:=0;??
while?(iS)and(A[(orig+i)mod?S]x
您可能关注的文档
最近下载
- 遗体表面防腐操作擦拭涂抹法现代遗体防腐技术.pptx VIP
- 遗体防腐整容操作废液收集方法现代遗体防腐技术.pptx VIP
- unit1Financialsystem金融英语第一课省公开课金奖全国赛课一等奖微课获奖PPT课件.pptx VIP
- 2024版冠心病诊断与治疗指南ppt课件[1] .pdf VIP
- 教学课件 管理学基础(刘璇 张永良).ppt
- 教学楼、教学楼水电施工组织计划.docx VIP
- 41水平五 篮球单元18课时计划-《篮球:交叉步持球突破》说课稿.docx VIP
- 遗体防腐操作废液排放的监测及控制现代遗体防腐技术.pptx VIP
- 我的梦中国梦——共筑中国梦PPT课件.pptx VIP
- 中国天眼完整版本.ppt VIP
文档评论(0)