hash技术 策略设计与实现

hash技术 策略设计与实现

ID:17863383

大小:132.50 KB

页数:13页

时间:2018-09-07

hash技术 策略设计与实现_第1页
hash技术 策略设计与实现_第2页
hash技术 策略设计与实现_第3页
hash技术 策略设计与实现_第4页
hash技术 策略设计与实现_第5页
资源描述:

《hash技术 策略设计与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、散列技术与策略设计——原理,技术及实现TomsdinaryEditor前言数据库德存储结构中必须考虑的一个核心问题是数据的插入,查找和检索的效率问题。索引技术结合散列技术可以成倍的提高数据库数据的查找和操作。此文将讨论一般散列技术的具体实现。但它并没有涉及到具体的数据库系统中的设计实现。此文的一大特色就在于C++高级语言特性和先进设计思想的使用——基于策略的设计。虽然在国际上此设计方式早已传开,但作为学习的个人能够实际运用上还是有成就感的。散列技术在基于比较的排序算法最好效率复杂度是O(nlogn).。而

2、针对已经排好序或某种特殊结构的查找算法的最好效率也只是O(logn)。是否存在一种既不需要对数列排序又可获得比O(logn)更好的查找效率的数据结构。这就是散列技术用到的哈希表。散列技术是根据记录的查找键值,使用一个函数计算得到的函数值作为磁盘块的地址,对记录进行存储和访问的方法。根据已有的文献显示,散列技术一般包括三个部分:一个哈希表,键值到存储位置的映射函数——哈希函数,以及处理哈希函数冲突的有效方法。哈希表用于存放键值,它可以采用多种形式实现。比如,数组、链表、平衡树、红黑树或B树。不同的哈希表结构

3、在效率和算法实现上都会有很大的差异。具体情况视设计者权衡而定。哈希表只是用来存放键值,如何存放键值并没有规定。哈希函数就是用于计算键值到存放键值位置的。哈希表与其它基于比较存储最大的不同就在于键值位置的存放是由哈希函数决定的。使用散列方法首先需要一个好得哈希函数,由于在设计哈希函数时不可能精确知道要存储的键值,因此要求散列函数在把键值转换成存储地址时满足:散列后的地址是均匀的,并且地址分布是均匀的。这不仅设计到哈希函数的设计也必须考虑一但哈希函数映射冲突如何解决。其中映射冲突的解决构成了散列技术的第三个方

4、面。通常处理冲突的方法有:开放定址法、再哈希法、链地址法和建立一个公共溢出区。开放地址法是这样一种方法:当进行哈希函数映射后,发现遇到冲突;此时就开始从冲突位置开始向哈希表后搜索第一个没有被使用的位置作为映射后的位置直道搜索到映射位置的前一个位置。再哈希法是这样一种方法:当进行哈希函数映射后,发现遇到冲突;于是对此键值使用另外一个其它机制设计的哈希函数进行再次映射;如果还是冲突就使用不同于以上哈希函数的新哈希函数进行映射直道找到一个不再冲突的位置停止。链地址法是这样一种方法:当进行哈希函数映射后,不管是否

5、发生冲突都在相应位置后添加一个属于这个位置的节点元素。这个节点称之为桶。于是被映射到相同地址的键值构成了一个链表。当发生冲突时就在链表中查找对应键值就可以了。建立一个公共溢出区:开辟一个新内存区块用于存放产生哈希冲突的数据。不管哈希表采用何种数据结构,冲突避免采用何种处理办法;一个好的散列方法必然有一个好的哈希函数。一般的哈希函数构造方式有:直接定址法、数字分析法、平方取中法、折叠法、保留余数法和随机数法。在这里介绍下文将要用到的保留余数法:如果键值是一些整数并且哈希表大小为一个质数,那么我们可以用一个简

6、单的方法来确定键值的位置。让键值和哈希表大小整除,取其余数作为键值的存放位置。而其他方式都是根据不同方式对键值进行处理从而获得哈希表中的位置。策略设计设计的选择:程序设计技术发展到当前设计手法也在不断发展。从面向过程的范型到泛型程序设计。在这里将要讨论的设计选择是面向对象的。而从面向过程,基于对象,面向对象和泛型程序设计这些泛型都支持的当今只有一种语言C++。所以一下的讨论都将带有浓厚的C++色彩。在面向对象领域里有一颗神奇的“银弹”——继承和多态。但经过面向对象方法论长期的发展我们听到的教诲永远是不要使

7、用继承而多使用组合;即使继承那就针对接口编程的。还有程序设计的关键是针对抽象设计而不是实现设计的观念在每一个面向对象分析和设计人员心目中根深蒂固。继承与多态的确是好东西,但并不是“银弹”。而一些不成熟设计者对它们的滥用使得系统越来越复杂,越来越不好维护和管理。后来才发现,模块之间耦合太密而内部聚合太松。对继承和多态的依赖让设计变得越来越难。于是在综合过去系统好的设计方案中,人们发现了很多经典的不断在各种稳健系统中出现的设计权衡——设计模式。于是继承,多态,接口这些概念被重新审视,在遵循一些好的设计模式下设

8、计有了更多好的选择,这对于一个普通开发者而言无疑是一个福音。面向对象系统中鼓吹一种称为复用的精神。那下面看看为了复用我们有哪些设计选择。n第一个很自然的设计倾向就是将全部功能集成在一个类实现中。对这样一个富接口的重大缺点就是不利于服用这个类其它可以复用的功能,同时这样一个全功能的类是笨拙的且不利于和系统其它部分交互。n第二个设计方式就是多继承了。我们首先设计些具有小功能的类,然后通过多继承把这些功能复用到一个子类中。这样设计的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。