- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
散列技术与策略设计
——原理,技术及实现
Tomsdinary Editor
前言
数据库德存储结构中必须考虑的一个核心问题是数据的插入,查找和检索的效率问题。索引技术结合散列技术可以成倍的提高数据库数据的查找和操作。此文将讨论一般散列技术的具体实现。但它并没有涉及到具体的数据库系统中的设计实现。此文的一大特色就在于C++高级语言特性和先进设计思想的使用——基于策略的设计。虽然在国际上此设计方式早已传开,但作为学习的个人能够实际运用上还是有成就感的。
散列技术
在基于比较的排序算法最好效率复杂度是O(nlog n).。而针对已经排好序或某种特殊结构的查找算法的最好效率也只是O(log n)。是否存在一种既不需要对数列排序又可获得比O(log n)更好的查找效率的数据结构。
这就是散列技术用到的哈希表。散列技术是根据记录的查找键值,使用一个函数计算得到的函数值作为磁盘块的地址,对记录进行存储和访问的方法。
根据已有的文献显示,散列技术一般包括三个部分:一个哈希表,键值到存储位置的映射函数——哈希函数,以及处理哈希函数冲突的有效方法。
哈希表用于存放键值,它可以采用多种形式实现。比如,数组、链表、平衡树、红黑树或B树。不同的哈希表结构在效率和算法实现上都会有很大的差异。具体情况视设计者权衡而定。
哈希表只是用来存放键值,如何存放键值并没有规定。哈希函数就是用于计算键值到存放键值位置的。哈希表与其它基于比较存储最大的不同就在于键值位置的存放是由哈希函数决定的。
使用散列方法首先需要一个好得哈希函数,由于在设计哈希函数时不可能精确知道要存储的键值,因此要求散列函数在把键值转换成存储地址时满足:散列后的地址是均匀的,并且地址分布是均匀的。这不仅设计到哈希函数的设计也必须考虑一但哈希函数映射冲突如何解决。
其中映射冲突的解决构成了散列技术的第三个方面。通常处理冲突的方法有:开放定址法、再哈希法、链地址法和建立一个公共溢出区。
开放地址法是这样一种方法:当进行哈希函数映射后,发现遇到冲突;此时就开始从冲突位置开始向哈希表后搜索第一个没有被使用的位置作为映射后的位置直道搜索到映射位置的前一个位置。
再哈希法是这样一种方法:当进行哈希函数映射后,发现遇到冲突;于是对此键值使用另外一个其它机制设计的哈希函数进行再次映射;如果还是冲突就使用不同于以上哈希函数的新哈希函数进行映射直道找到一个不再冲突的位置停止。
链地址法是这样一种方法:当进行哈希函数映射后,不管是否发生冲突都在相应位置后添加一个属于这个位置的节点元素。这个节点称之为桶。于是被映射到相同地址的键值构成了一个链表。当发生冲突时就在链表中查找对应键值就可以了。
建立一个公共溢出区:开辟一个新内存区块用于存放产生哈希冲突的数据。
不管哈希表采用何种数据结构,冲突避免采用何种处理办法;一个好的散列方法必然有一个好的哈希函数。一般的哈希函数构造方式有:直接定址法、数字分析法、平方取中法、折叠法、保留余数法和随机数法。
在这里介绍下文将要用到的保留余数法:如果键值是一些整数并且哈希表大小为一个质数,那么我们可以用一个简单的方法来确定键值的位置。让键值和哈希表大小整除,取其余数作为键值的存放位置。而其他方式都是根据不同方式对键值进行处理从而获得哈希表中的位置。
策略设计
设计的选择:程序设计技术发展到当前设计手法也在不断发展。从面向过程的范型到泛型程序设计。在这里将要讨论的设计选择是面向对象的。而从面向过程,基于对象,面向对象和泛型程序设计这些泛型都支持的当今只有一种语言C++。所以一下的讨论都将带有浓厚的C++色彩。
在面向对象领域里有一颗神奇的“银弹”——继承和多态。但经过面向对象方法论长期的发展我们听到的教诲永远是不要使用继承而多使用组合;即使继承那就针对接口编程的。还有程序设计的关键是针对抽象设计而不是实现设计的观念在每一个面向对象分析和设计人员心目中根深蒂固。
继承与多态的确是好东西,但并不是“银弹”。而一些不成熟设计者对它们的滥用使得系统越来越复杂,越来越不好维护和管理。后来才发现,模块之间耦合太密而内部聚合太松。对继承和多态的依赖让设计变得越来越难。
于是在综合过去系统好的设计方案中,人们发现了很多经典的不断在各种稳健系统中出现的设计权衡——设计模式。于是继承,多态,接口这些概念被重新审视,在遵循一些好的设计模式下设计有了更多好的选择,这对于一个普通开发者而言无疑是一个福音。面向对象系统中鼓吹一种称为复用的精神。
那下面看看为了复用我们有哪些设计选择。
第一个很自然的设计倾向就是将全部功能集成在一个类实现中。对这样一个富接口的重大缺点就是不利于服用这个类其它可以复用的功能,同时这样一个全功能的类是笨拙的且不利于和系统其它部分交互。
第二个设计方式就
您可能关注的文档
- (单片机原理及应用)电子教案 - 第2章 硬件结构.ppt
- (杜小勇)慢性阻塞性肺疾病健康教育内容.doc
- (新人教版)2011届高考限时智能检测(计数原理、概率、随机变量及其分步、统计、统计案4.doc
- (新人教版物理选修3-4)14.2《电磁振荡》同步测试.doc
- [CAFS2008]心衰合并房性心律失常治疗.doc
- [PDF] ±800kV 输电线路直流复合绝缘子均压环结构的研究.pdf
- [电工考题]高级电工试题.doc
- [精品]蛋白可溶表达与纯化详细实验过程.doc
- [浙江]商业大厦地下室深基坑监测施工方案(whitetiger20).pdf
- ]2010年各高校机械专业考研难度分析.doc
最近下载
- DB41T 2412-2023 高标准农田建设规范.docx VIP
- DB11_T 387.1-2016 水利工程施工质量评定 第1部分:河道整治.PDF VIP
- IPC-1602-CN:2020+印制板操作和储存标准+-+完整中文电子版(36页).pdf VIP
- 肝病相关血小板减少症临床管理中国专家共识2023解读.pptx VIP
- 夏枯草种植技术规程.pdf VIP
- 【室内装修施工组织设计】.docx VIP
- 生物物理学导论-08省名师优质课获奖课件市赛课一等奖课件.ppt VIP
- DB41_T 2416-2023 高标准农田 智慧灌溉技术规程.docx VIP
- 棉纺织生产工艺流程大全.pdf VIP
- 生物物理学课件.docx VIP
文档评论(0)