哈希表与一般查找方法的比较及冲突的解决

合集下载

哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度⼀、哈希表1、概念哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)⽽直接进⾏访问的数据结构。

它通过把关键码值映射到哈希表中的⼀个位置来访问记录,以加快查找的速度。

这个映射函数就做散列函数,存放记录的数组叫做散列表。

2、散列存储的基本思路以数据中每个元素的关键字K为⾃变量,通过散列函数H(k)计算出函数值,以该函数值作为⼀块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。

3、哈希表查找的时间复杂度哈希表存储的是键值对,其查找的时间复杂度与元素数量多少⽆关,哈希表在查找元素时是通过计算哈希码值来定位元素的位置从⽽直接访问元素的,因此,哈希表查找的时间复杂度为O(1)。

⼆、常⽤的哈希函数1. 直接寻址法取关键字或者关键字的某个线性函数值作为哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b为整数),这种散列函数也叫做⾃⾝函数.如果H(Key)的哈希地址上已经有值了,那么就往下⼀个位置找,知道找到H(Key)的位置没有值了就把元素放进去.2. 数字分析法分析⼀组数据,⽐如⼀组员⼯的出⽣年⽉,这时我们发现出⽣年⽉的前⼏位数字⼀般都相同,因此,出现冲突的概率就会很⼤,但是我们发现年⽉⽇的后⼏位表⽰⽉份和具体⽇期的数字差别很⼤,如果利⽤后⾯的⼏位数字来构造散列地址,则冲突的⼏率则会明显降低.因此数字分析法就是找出数字的规律,尽可能利⽤这些数据来构造冲突⼏率较低的散列地址.3. 平⽅取中法取关键字平⽅后的中间⼏位作为散列地址.⼀个数的平⽅值的中间⼏位和数的每⼀位都有关。

因此,有平⽅取中法得到的哈希地址同关键字的每⼀位都有关,是的哈希地址具有较好的分散性。

该⽅法适⽤于关键字中的每⼀位取值都不够分散或者较分散的位数⼩于哈希地址所需要的位数的情况。

4. 折叠法折叠法即将关键字分割成位数相同的⼏部分,最后⼀部分位数可以不同,然后取这⼏部分的叠加和(注意:叠加和时去除进位)作为散列地址.数位叠加可以有移位叠加和间界叠加两种⽅法.移位叠加是将分割后的每⼀部分的最低位对齐,然后相加;间界叠加是从⼀端向另⼀端沿分割界来回折叠,然后对齐相加.5. 随机数法选择⼀个随机数,去关键字的随机值作为散列地址,通常⽤于关键字长度不同的场合.6. 除留余数法取关键字被某个不⼤于散列表表长m的数p除后所得的余数为散列地址.即H(Key)=Key MOD p,p<=m.不仅可以对关键字直接取模,也可在折叠、平⽅取中等运算之后取模。

【学习总结】哈希表:哈希函数构造;哈希表解决地址冲突的方法

【学习总结】哈希表:哈希函数构造;哈希表解决地址冲突的方法

【学习总结】哈希表:哈希函数构造;哈希表解决地址冲突的⽅法⼩结散列函数构造⽅法:1.直接定址法:H(key) = a*key + b2.除留余数法:H(key) = key % p(p为不⼤于散列表表长,但最接近或等于表长的质数p)3.数字分析法:选取r进制数数码分布较为均匀的若⼲位作为散列地址4.平⽅取中法:取关键字的平⽅值的中间⼏位作为散列地址5.折叠法:将关键字分割成位数相同的⼏部分,然后取这⼏部份的叠加和作为散列地址处理冲突的⽅法:1.开放定址法(闭哈希表):在冲突的哈希地址的基础上进⾏处理,得到新的地址值。

Hi = (H(key)+di) % m(m表⽰散列表表长,di为增量序列)1)线性探测法:dii=1,2,3,…,m-12)⼆次探测法:di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )冲突发⽣时,以原哈希地址为中⼼,在表的左右进⾏跳跃式探测,⽐较灵活。

3)伪随机数法:di=伪随机数序列。

具体实现时,应建⽴⼀个伪随机数发⽣器,(如i=(i+p) % m),并给定⼀个随机数做起点。

线性探测再散列的优点是:只要哈希表不满,就⼀定能找到⼀个不冲突的哈希地址,⽽⼆次探测再散列和伪随机探测再散列则不⼀定。

注:在开放定址的情形下,不能随便物理删除表中已有元素,若删除元素将会截断其他具有相同散列地址的元素的查找地址。

若想删除⼀个元素,给它做⼀个删除标记,进⾏逻辑删除。

2.链地址法、拉链法(开哈希表)将所有哈希地址为i的元素构成⼀个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因⽽查找、插⼊和删除主要在同义词链中进⾏。

链地址法适⽤于经常进⾏插⼊和删除的情况。

3.再哈希法:同时构造多个不同的哈希函数,发⽣冲突时,使⽤其他哈希函数求值。

这种⽅法不易产⽣聚集,但增加了计算时间。

4.建⽴公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发⽣冲突的元素,⼀律填⼊溢出表概述哈希法⼜称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。

hash与map的区别联系应用

hash与map的区别联系应用

hash与map的区别联系应⽤⼀,hashtable原理:哈希表⼜名散列表,其主要⽬的是⽤于解决数据的快速定位问题。

考虑如下⼀个场景。

⼀列键值对数据,存储在⼀个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我⼀个个拿出来⽐较key啊,呵呵。

⼤家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要⼀个个查找。

⽽哈希表就是利⽤数组这个能够快速定位数据的结构解决以上的问题的。

具体如何做呢?⼤家是否有注意到前⾯说的话:“数组可以通过下标直接定位到相应的空间”,对就是这句,哈希表的做法其实很简单,就是把Key通过⼀个固定的算法函数既所谓的哈希函数转换成⼀个整型数字,然后就将该数字对数组长度进⾏取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间⾥,⽽当使⽤哈希表进⾏查询的时候,就是再次使⽤哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此⼀来,就可以充分利⽤到数组的定位性能进⾏数据定位。

不知道说到这⾥,⼀些不了解的朋友是否⼤概了解了哈希表的原理,其实就是通过空间换取时间的做法。

到这⾥,可能有的朋友就会问,哈希函数对key进⾏转换,取余的值⼀定是唯⼀的吗?这个当然不能保证,主要是由于hashcode会对数组长度进⾏取余,因此其结果由于数组长度的限制必然会出现重复,所以就会有“冲突”这⼀问题,⾄于解决冲突的办法其实有很多种,⽐如重复散列的⽅式,⼤概就是定位的空间已经存在value且key不同的话就重新进⾏哈希加⼀并求模数组元素个数,既 (h(k)+i) mod S , i=1,2,3…… ,直到找到空间为⽌。

还有其他的⽅式⼤家如果有兴趣的话可以⾃⼰找找资料看看。

2 hash_map和map的区别在哪⾥?构造函数。

hash_map需要hash函数,等于函数;map只需要⽐较函数(⼩于函数).存储结构。

c实现的hash表-概述说明以及解释

c实现的hash表-概述说明以及解释

c实现的hash表-概述说明以及解释1.引言1.1 概述在计算机科学中,哈希表(Hash Table),又被称为散列表,是一种常用的数据结构。

它能够以常数时间复杂度(O(1))来实现插入、删除和查找等操作,因此具有高效的特性。

哈希表通过哈希函数将键(key)映射到一个固定大小的数组(通常称为哈希表)。

通过这种映射关系,我们可以在数组中快速访问到对应的值(value)。

常见的应用场景包括缓存系统、数据库索引、编译器符号表等。

相对于其他数据结构,哈希表具有以下优点:1. 高效的插入、删除和查找操作:哈希表在插入、删除和查找数据时以常数时间复杂度进行操作,无论数据量大小,都能快速地完成操作。

2. 高效的存储和检索:通过哈希函数的映射关系,哈希表能够将键值对存储在数组中,可以通过键快速地找到对应的值。

3. 空间效率高:哈希表通过哈希函数将键映射到数组下标,能够充分利用存储空间,避免冗余的存储。

然而,哈希表也存在一些局限性:1. 冲突问题:由于哈希函数的映射关系是将多个键映射到同一个数组下标上,可能会导致冲突。

解决冲突问题的常见方法包括链地址法(Chaining)和开放定址法(Open Addressing)等。

2. 内存消耗:由于哈希表需要维护额外的空间来存储映射关系,所以相比于其他数据结构来说,可能会占用较多的内存。

本篇长文将重点介绍C语言实现哈希表的方法。

我们将首先讨论哈希表的定义和实现原理,然后详细介绍在C语言中如何实现一个高效的哈希表。

最后,我们将总结哈希表的优势,对比其他数据结构,并展望哈希表在未来的发展前景。

通过本文的学习,读者将能够深入理解哈希表的底层实现原理,并学会如何在C语言中利用哈希表解决实际问题。

1.2 文章结构本文将围绕C语言实现的hash表展开讨论,并按照以下结构进行组织。

引言部分将对hash表进行概述,介绍hash表的基本概念、作用以及其在实际应用中的重要性。

同时,引言部分还会阐述本文的目的,即通过C语言实现的hash表,来探讨其实现原理、方法以及与其他数据结构的对比。

哈希表处理冲突的方法

哈希表处理冲突的方法

哈希表处理冲突的方法哈希表是一种常见的数据结构,用于实现快速查找和插入操作。

它通过将关键字映射到数组的特定位置来存储数据。

然而,当两个或多个关键字映射到同一个位置时,就会发生冲突。

为了解决冲突,哈希表采用了多种方法。

1. 链地址法(Chaining):在哈希表中的每个位置上维护一个链表或链表数组。

如果发生冲突,新的数据将被添加到链表的末尾。

这种方法可以处理任意数量的冲突,但需要额外的空间来存储链表。

2. 开放地址法(Open Addressing):在哈希表中的每个位置上存储一个数据,并通过探测序列来处理冲突。

探测序列是一个确定的规则,用于寻找下一个可用的位置。

常见的探测方法包括线性探测(Linear Probing),二次探测(Quadratic Probing)和双重散列(Double Hashing)。

这种方法不需要额外的存储空间,但可能会导致聚集现象,即连续的冲突会增加查找的时间复杂度。

3. 再哈希法(Rehashing):当发生冲突时,重新计算关键字的哈希值,并将数据存储在计算得到的新位置上。

这种方法需要额外的存储空间来保存原始数据,但可以避免聚集现象,并减少冲突的概率。

4. 建立公共溢出区(Primary Clustering):将哈希表分为两个区域,一个区域用于存储主要数据,另一个区域用于存储冲突的数据。

当发生冲突时,将数据存储在冲突区域中。

这种方法可以减少聚集现象的发生,但需要额外的存储空间来存储冲突数据。

5. 完全散列(Perfect Hashing):在构建哈希表时,通过一系列算法和数据预处理,使得每个关键字都映射到唯一的位置,从而避免冲突。

这种方法需要较高的计算成本和空间消耗,但可以实现最佳的查找和插入性能。

以上所述的方法都是常见的哈希表处理冲突的方式。

在选择合适的方法时,需要考虑数据的特点、内存限制和性能需求等因素。

哈希表与一般查找方法的比较及冲突的解决

哈希表与一般查找方法的比较及冲突的解决

录 。 这 个理 想的 情 况 可 以 通过 哈 希 表 来 实现 。 [ 键 词 ] 哈 希 表 ; 希 函数 ; 突 ; 找 ; 关 哈 冲 查 关键 字 [ 中图 分 类 号 ] T 3 1 6 [ 献 标识 码 ] A [ P 0. 文 文章 编 号 ]
1 一般查 找方法 的介绍
找成 功 。反 之 , 直 至 最 后 一 个 记 录 , 关 键 字 和 给定 值 的 应 。因 而 在查 找 时 , 若 其 只要 根 据这 个 对 应 关 系 F就 能 找 到 给定 比较都 不 相 等 , 则表 明 表 中没 有 给 定 值 , 种 方 法 可 用 在 学 值 K 的 像 F K 。若 表 中存 在 关 键 字 和 K 相 等 的 记 录 , 必 这 () 则 生 成 绩 表 中查 找 某 一 学 生 的 成绩 。 定 在 F K) 存 储 位 置 上 。其 实 换 个 说 法 , 是 通 过 函数 F ( 的 就 从 上 面 的例 子 可 知 顺序 查 找 方 法 效 率 不 高 , 但是 我 们 还 ( , 出要 查 找 关键 字 K 的 存 储 位 置 F K) 这 样 就 实 现 了 )算 ( , 有其他查找方法 , : 如 折半 查 找 , 是 建 立 在 数 据 存 放 有 序 的 不 需 要进 行 比较 便 可 直 接 取 得 查 找 记 录 。在 此 , 们 称 这 个 它 我
第2 O卷第 5 期
哈希 表 与 一 般 查 找 方 法 的 比较 及 冲 突 的解 决
骆剑 锋
( 东 技 术 师 范学 院 天 河 学 院 计 算 机 系 , 东 广 州 ,1 50 广 广 504)
[ 摘
要 ] 众 所 周 知 , 表 中查找 记 录 时 需进 行 查找 值 和 关键 字的 比较 。这 一 类 查 找 方 法 建 立 在 “ 较 ” 在 比 的基 础

哈希碰撞解决方式

哈希碰撞解决方式

哈希碰撞解决方式哈希碰撞是指在哈希表中,两个或多个不同的键值被哈希函数映射到了同一个索引位置的情况。

这种情况会导致哈希表性能下降,因为它会使得访问哈希表中的某些元素变得很慢。

为了解决哈希碰撞问题,有以下几种方式:1. 链地址法链地址法是一种简单而常用的解决哈希碰撞问题的方法。

它将每个桶(或槽)都视为一个链表头,并将所有散列到该桶的元素都添加到该链表中。

当需要查找某个元素时,只需要遍历对应桶中的链表即可。

2. 开放地址法开放地址法是另一种解决哈希碰撞问题的方法。

它将所有元素都存储在哈希表中,并使用一些特定规则来处理发生碰撞时应该如何处理。

其中最常用的三种规则是线性探测、二次探测和双重散列。

- 线性探测:当发生碰撞时,线性探测会检查下一个空槽是否可用,如果可用,则将该元素插入该位置;否则,它会继续检查下一个槽,直到找到一个可用的位置为止。

- 二次探测:与线性探测类似,但是它使用二次函数来计算下一个探测位置。

这样可以更有效地避免聚集现象。

- 双重散列:当发生碰撞时,双重散列会使用第二个哈希函数来计算下一个槽的位置。

这种方法可以更好地分散元素。

3. 建立完美哈希建立完美哈希是一种解决哈希碰撞问题的高级方法。

它基于一些特殊技巧和数据结构来构建哈希表,使得每个键值都被映射到唯一的索引位置上。

这种方法需要预处理输入数据,并且在构建哈希表时需要进行复杂的计算,但是一旦完成,它可以提供非常快速和高效的查询性能。

总之,以上三种方法都可以用来解决哈希碰撞问题。

选择哪种方法取决于具体情况和要求。

例如,链地址法适用于存储大量元素的情况;开放地址法适用于存储较少元素的情况;而建立完美哈希则适用于需要快速查询大量数据的情况。

散列表冲突处理方案

散列表冲突处理方案

散列表冲突处理方案散列表(Hash Table)是一种重要的数据结构,它能够快速地进行插入、查找和删除等操作。

然而,在实际应用中,冲突(Collision)是散列表中常见的问题之一。

本文将介绍散列表冲突处理的几种常见方案,以及它们的优缺点。

一、开放定址法开放定址法是一种解决冲突的常见方法。

其原理是,当发生冲突时,通过一定的探测序列找到下一个可用的空槽,将待插入的元素放入该槽内。

常用的探测序列有线性探测、二次探测以及双重散列等。

1. 线性探测线性探测是最简单的开放定址法策略。

当发生冲突时,直接往后查找下一个空槽,并将待插入元素放入该槽内。

即使数组中只有少数位置被占用,线性探测也可能导致长时间的查找。

此外,线性探测容易产生一次聚集(Primary Clustering)现象,即冲突后的元素倾向于聚集在一起,进一步影响散列表的性能。

2. 二次探测二次探测对线性探测进行了改进。

当发生冲突时,根据一个二次探测序列进行查找下一个空槽,并将待插入元素放入该槽内。

二次探测的探测序列可以是平方探测、斐波那契探测等。

相比线性探测,二次探测能够减少聚集现象,但仍然存在聚集的问题。

3. 双重散列双重散列是一种更为高效的开放定址法策略。

当发生冲突时,通过计算另一个散列函数的值,并将其与原始散列值相加,得到下一个空槽的位置。

双重散列能够更好地解决聚集问题,提高散列表的性能。

二、链表法链表法是另一种常见的散列表冲突处理方案。

基本思想是,将散列得到的相同索引值的元素存储在同一个链表中。

当插入元素时,只需要将其插入到对应索引位置的链表尾部即可。

链表法对于散列冲突的处理效果较好,但在插入和查找操作上需要额外的链表遍历开销。

三、再散列法再散列法是一种结合链表法和开放定址法的冲突处理方法。

当发生冲突时,使用一个新的散列函数对待插入的元素进行再散列,并将其放入新的散列位置。

再散列法能够在一定程度上减少冲突的概率,提高散列表的性能。

综上所述,散列表冲突处理的方案有开放定址法、链表法以及再散列法等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) 哈希表的行数与列数不一定相同 ,比如可建立 A (10 ,3) 这样的表 ,但要存储的数据的个位数就不能大于 3 了 。所以应先估计数据的范围 ,再去建立表 。 3. 2 性能分析
一个查找方法的好坏通常是以其关键字和给定值进行
比较过的记录个数的平均值来衡量的 。而平均查找长度
ASL (Average Search Lengt h) 就是进行比较的关键字个数 的期望值 。ASL 值越小 ,查找平均速度越快 。
知道 ,顺序查找和折半查找的性能会随着数据量的增加而降 ( HX) ,提高按 ID 号查找某学生数据的速度 。
低 ,而用哈希表来查找是不会这样的 。
表 2 XS 表
行号 第1行 第2行 第3行
:
ID
姓名
2
黄秋燕
4
李翔
5
罗卓浪
:
:
身份证号 441702198609114440 441702198512191553 441702198606180338
那么 ASL = 1 000/ N ,而当 N = 10 000 时 ,ASL = 0. 1 。从这
假设有以下学生表 ( XS) ,表中有 1 000 个学生记录 ,其
我们就可知道 ,当数据比较多的时候 ,一般的查找方法与我 中的 ID 号是关键字 ,并以升序排列 ,行号并非是表中的内
们的哈希表查找方法性能相差甚远 。并且从它们的 ASL 中 容 ,是用 来 帮 助 我 们 理 解 用 的 。现 为 它 建 立 一 个 哈 希 表
然数在存储时出现的冲突问题 。
以上只是解决冲突的一个例子 ,当然要在这作一下补充 和说明 :
(1) 从要存储的数据来看 ,数据越集中 ,哈希表就越小 。 但是 ,就算数据不集中 ,我们仍然可以用这种思想来存储数 据 ,只是可能造成不少储存空间的浪费 。
(2) 以上只是一种思想 ,哈希表不一定是一个 A (10 ,10) 的表 ,应该按照数据的范围来决定表的大小 。比如 ,上例的 数据可以用 A (7 ,7) 的二维数组来存储 。
(3) 两个哈希函数 FX( X) = X MOD 10 和 F Y( Y) = IN T ( Y/ 10) 中的 10 不一定是 10 ,要根据要存储数据的范围和哈 希表的大小来决定 。其实哈希函数可以写成这样 : FX( X) = X MOD N 和 F Y( Y) = IN T ( Y/ N) ,N 就是哈希表的行数或 列数 ,取其中的较大者 。
A
31 32
45
77 28
0123456789
图 1 A (10) 数组 数组 A (10) 就是由哈希函数 F ( X) 构成的哈希表 。假如
3 [ 收稿日期 ] 2007208230 [ 作者简介 ] 骆剑锋 (1981 - ) ,男 ,广东技术师范学院天河学院计算机系教师 、软件设计师 。
2007 年 10 月 十 堰 职 业 技 术 学 院 学 报 Oct . ,2007 第 20 卷第 5 期 Jo urnal of Shiyan Technical Instit ute Vol . 20 No . 5
ASL = P1 ×1 + P2 ×2 + P3 ×3 + ……+ PN - 1 ×( N - 1) + PN ×N
假设每个记录的查找概率相等 : Pi = 1/ N 则在等概率情况下顺序查找的平均查找长度为
N
N
∑ ∑ ASL =
Pi Ci
i =1
=
1
i = (1 + N) / 2[1]
N i =1
(3 ,2) (2 ,2) (4 ,5) (6 ,6) 的 A (10 ,10) 二维数组中。如下图 :
图 2 A (10 ,10) 示意图
这样 ,二维数组 A ( 10 , 10) 就是由哈希函数 FX ( X) 和 F Y( Y) 构成的哈希表 ,假如要查找给定值 45 ,只需通过函数 F Y(45) = 4 和 FX(45) = 5 ,就知道 45 放在二维数组 A 中下 标为 (4 ,5) 的位置 。这样 ,我们就可以不需要进行任何的比 较就能在表中找到相应的数据 。这种存储方法可以解决自
3
1 一般查找方法的介绍
在现实生活中有不少查找数据的例子 ,如在学生成绩表中 查找某一学生的成绩 ;在集体宿舍的名单中找到某个人所在的 宿舍等 。前人已在这些现实的例子中找到不少适合用计算机去 查找的方法 ,如 :顺序查找、折半查找等。
最容易理解的莫过于按照顺序查找 ,它的查找过程为 : 从表中的第一个记录开始 ,逐个地进行记录的关键字和给定 值的比较 ,若某个记录的关键字和给定值的比较相等 ,则查 找成功 。反之 ,若直至最后一个记录 ,其关键字和给定值的 比较都不相等 ,则表明表中没有给定值 ,这种方法可用在学 生成绩表中查找某一学生的成绩 。
然这里介绍的方法也有前提 :
第一 :要存放的数据要尽量集中 ,不能太过分散 ,如 : 7 ,
13 ,20 ,17 这些数据的数值差距不大 ,比较集中 。
第二 :需要计算机的储存容量比较大 。
第一个前提并非是绝对的 ,也就是说数据也可以分散 ,
但这就需要很大的计算机储存容量 。第二个前提的实现可
能不存在问题 ,当今计算机的储存硬件已经日新月异 ,容量
键字中假设还有一个关键字为 22 ,那么 F (22) = 2 ,这正好与
关键字 32 的地址一样 F (32) = 2 ,这种现象称为冲突 。那么
22 这个新的数应放到哪里呢 ?
然而 ,在以住 ,我们都认为冲突只能尽可能地少 ,而不能
完全地避免 。
3 解决冲突的前提
任何方法的可行性都有前提 ,没有完全绝对的方法 。当
— 96 —
哈希表与一般查找方法的比较及冲突的解决
我们要查找关键字 77 ,只需通过函数 F (77) = 7 ,就知 77 放
在数组 A 中下标为 7 的位置 。这样我们就可以不需要进行
任何比较就能很快地在表中找到相应的数据 。
2. 2 哈希函数的冲突
对不同的关键字可能得到同一个哈希地址 ,如上例的关
对于含有 N 个记录的表 ,查找成功时的平均查找长度为
N
∑ ASL =
Pi Ci
i 记录的概率 。Ci 为找到表中
其关键字与给定值相等的第 i 个记录时 ,和给定值已进行过
比较的关键字个数 。
从顺序查找可见 , Ci 取决于所查记录在表中的位置 。 如 :查找表中第一个记录时 ,仅需比较一次 ;第二个记录时 , 要两次 ……最后一个记时 ,要 N 次 ,一般情况下 Ci 等于 i 。
不是应该多用点容量来换取我们的速度呢 ?
3. 1 冲突解决方案的提出
假设有这些关键字 :25 ,32 ,22 ,45 ,66 。用 A (10 ,10) 二
维数组作为存放关键字的哈希表 ,我们分别构造两个哈希函
FX( X) = X MOD 10 和 F Y( Y) = IN T ( Y/ 10) 。( F Y( Y) 的
就拿顺序查找方法来看 ,假如表中有大量的数据 ,用这 个方法效率很低 ,最差的情况就是要查找的数据在表的最 后 ,这样就需要把所有的数据都读一遍 。而折半查找方法虽 然比顺序查找方法快很多 ,但对于大量数据来说 ,比较次数 也会随着数据的数量变大而增多 ,并且如果要查找的数据在 表的开始 ,反而这时的查找速度还不如顺序查找方法 。 1. 2 哈希表的提出
序查找优胜 。
而用哈希表来查找 ,假如 Pi 仍然为 1/ N ,Ci 可以说是为 0 ,因为在查找过程中无需与任何关键字进行比较 。但现实 情况来说 ,由于哈希函数的计算需要时间 ,那么我们作最差
— 97 —
十堰职业技术学院学报
2007 年第 5 期
第 20 卷第 5 期
的打算 ,Ci = 1 000 (这个数已经被放大差不多 100 倍了) 。 4 应用举例
哈希表与一般查找方法的比较及 冲突的解决
骆剑锋
(广东技术师范学院 天河学院 计算机系 ,广东 广州 ,510540)
[ 摘 要 ] 众所周知 ,在表中查找记录时需进行查找值和关键字的比较 。这一类查找方法建立在“比较”的基础 上 。一般的查找方法有 :顺序查找 、折半查找 、二叉查找 。查找的效率依赖于查找过程中所进行的比较次数 ,甚 至有一些数据的位置会影响某一次查找效率 。理想的是希望不经任何比较 ,一次存取便能得到所需查找的记 录 。这个理想的情况可以通过哈希表来实现 。 [ 关键词 ] 哈希表 ;哈希函数 ;冲突 ;查找 ;关键字 [ 中图分类号 ] TP301. 6 [ 文献标识码 ] A [ 文章编号 ] 100824738 (2007) 0520096203
从上面的方法来看 ,影响查找速度的关键因素是在查找
的过程中 ,记录的关键字和给定值的比较的次数 。所以可以 这样说 :比较的次数越多 ,查找时间越长 。理想的情况是希 望不经任何比较 ,一次存取便能得到所查找的记录 。而这个 理想的情况可以用哈希表和它的算法来实现 。
2 哈希表的概念
如果希望不经过任何比较 ,一次存取便能得到所查记 录 ,那就必须在记录的存储位置和它的关键字之间建立一个 确定的对应关系 F ,使每个关键字和唯一的存储位置相对 应 。因而在查找时 ,只要根据这个对应关系 F 就能找到给定 值 K 的像 F ( K) 。若表中存在关键字和 K 相等的记录 ,则必 定在 F ( K) 的存储位置上 。其实换个说法 ,就是通过函数 F () ,算出要查找关键字 K 的存储位置 F ( K) ,这样就实现了 不需要进行比较便可直接取得查找记录 。在此 ,我们称这个 对应关系 F 为哈希函数 ,按这个思路而建立的表为哈希表 。
从上面的例子可知顺序查找方法效率不高 ,但是我们还 有其他查找方法 ,如 :折半查找 ,它是建立在数据存放有序的 基础上的 ,过程是 :先确定待查记录所在范围 ,然后逐步缩小 范围直到找到或找不到该记录为止 。这类似我们在书中找 某一页的过程 ,比如有一本非常厚的书 (3 000) ,要找到 1 076 页 ,我们一般会翻到书的中间 ,看一下当前页数为多少 , 假如是 1 400 页 ,那么你就会缩小查找的范围 (从第 1 页到 1 400 页) ,接着又在这个范围中用相同的方法找 。 1. 1 一般的查找方法存在的缺点
相关文档
最新文档