哈希表 今天药忘吃喽~ 2022-02-01 14:36 422阅读 0赞 哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。 对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。 哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。 而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。 然而如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。 **哈希表算法-哈希表的概念及作用** 一般的[线性表][Link 1],树中,记录在结构中的相对位置是[随机][Link 2]的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和[关键字][Link 3]的比较。这一类查找方法建立在“比较“的基础上,查找的[效率][Link 4]依赖于查找过程中所进行的比较次数。 理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。 哈希表最常见的例子是以学生学号为关键字的成绩表,1号学生的记录位置在第一条,10号学生的记录位置在第10条... 如果我们以学生姓名为关键字,如何建立查找表,使得根据姓名可以直接找到相应记录呢? [![哈希表算法][01300000185725121508404762618_s.jpg]][01300000185725121508404762618_s.jpg 1]**哈希表算法** 用上述得到的数值作为对应记录在表中的位置,得到下表: [![哈希表算法][01300000185725121508414213337_s.jpg]][01300000185725121508414213337_s.jpg 1]**哈希表算法** 上面这张表即哈希表。 如果将来要查李秋梅的[成绩][Link 5],可以用上述方法求出该记录所在位置: 李秋梅:lqm 12+17+13=42 取表中第42条记录即可。 问题:如果两个同学分别叫 刘丽 刘兰 该如何处理这两条记录? 这个问题是哈希表不可避免的,即冲突现象:对不同的关键字可能得到同一哈希地址。 ** 哈希表算法-哈希表的构造方法** 1、直接定址法 例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。 但这种方法效率不高,时间复杂度是O(1),空间复杂度是O(n),n是关键字的个数 [![哈希表算法][01300000185725121508427196756_s.jpg]][01300000185725121508427196756_s.jpg 1]**哈希表算法** 2、数字分析法 有学生的生日数据如下: 年.月.日 75.10.03 75.11.23 76.03.02 76.07.12 75.04.21 76.02.15 ... 经分析,第一位,第二位,第三位重复的可能性大,取这三位造成冲突的机会增加,所以尽量不取前三位,取后三位比较好。 3、平方取中法 取关键字平方后的中间几位为哈希地址。 4、折叠法 将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法。 例如:每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,可采用此法构造一个四位数的哈希函数。如果一本书的编号为0-442-20586-4,则: [![哈希表算法][01300000185725121508435076717_s.jpg]][01300000185725121508435076717_s.jpg 1]**哈希表算法** 5、除留余数法 取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。 H(key)=key MOD p (p<=m) 6、随机数法 选择一个随机函数,取关键字的随机函数值为它的哈希地址,即 H(key)=random(key) ,其中random为随机函数。通常用于关键字长度不等时采用此法。 5、除留余数法 取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。 H(key)=key MOD p (p<=m) 6、随机数法 选择一个随机函数,取关键字的随机函数值为它的哈希地址,即 H(key)=random(key) ,其中random为随机函数。通常用于关键字长度不等时采用此法。 5、除留余数法 取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。 H(key)=key MOD p (p<=m) 6、随机数法 选择一个随机函数,取关键字的随机函数值为它的哈希地址,即 H(key)=random(key) ,其中random为随机函数。通常用于关键字长度不等时采用此法。 **哈希表算法-处理冲突的方法** ![哈希表算法][01300000185725121508414213337_s.jpg] 如果两个同学分别叫 刘丽 刘兰,当加入刘兰时,地址24发生了冲突,我们可以以某种规律使用其它的存储位置,如果选择的一个其它位置仍有冲突,则再选下一个,直到找到没有冲突的位置。选择其它位置的方法有: 1、开放定址法 Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1) 其中m为表长,di为增量序列 如果di值可能为1,2,3,...m-1,称线性探测再散列。 如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k\*k,-k\*k(k<=m/2) 称二次探测再[散列][Link 6]。 如果di取值可能为伪随机数列。称伪随机探测再散列。 例:在长度为11的哈希表中已填有关键字分别为17,60,29的记录,现有第四个记录,其关键字为38,由哈希函数得到地址为5,若用线性探测再散列,如下: [![哈希表算法][01300000185725121508448780256_s.jpg]][01300000185725121508448780256_s.jpg 1]**哈希表算法** 2、再哈希法 当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。 3、链地址法 将所有关键字为同义词的记录存储在同一线性链表中。 [![哈希表算法][01300000185725121508453778315_s.jpg]][01300000185725121508453778315_s.jpg 1]**哈希表算法** 4、建立一个公共溢出区 假设哈希函数的值域为\[0,m-1\],则设向量HashTable\[0..m-1\]为基本表,另外设立存储空间向量OverTable\[0..v\]用以存储发生冲突的记录。 文章来源:[http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html][http_www.cnblogs.com_jiewei915_archive_2010_08_09_1796042.html] [Link 1]: http://www.hudong.com/wiki/%E7%BA%BF%E6%80%A7%E8%A1%A8 [Link 2]: http://www.hudong.com/wiki/%E9%9A%8F%E6%9C%BA [Link 3]: http://www.hudong.com/wiki/%E5%85%B3%E9%94%AE%E5%AD%97 [Link 4]: http://www.hudong.com/wiki/%E6%95%88%E7%8E%87 [01300000185725121508404762618_s.jpg]: http://a1.att.hudong.com/84/40/01300000185725121508404762618_s.jpg [01300000185725121508404762618_s.jpg 1]: http://tupian.hudong.com/a1_84_40_01300000185725121508404762618_jpg.html [01300000185725121508414213337_s.jpg]: http://a3.att.hudong.com/40/41/01300000185725121508414213337_s.jpg [01300000185725121508414213337_s.jpg 1]: http://tupian.hudong.com/a3_40_41_01300000185725121508414213337_jpg.html [Link 5]: http://www.hudong.com/wiki/%E6%88%90%E7%BB%A9 [01300000185725121508427196756_s.jpg]: http://a2.att.hudong.com/17/42/01300000185725121508427196756_s.jpg [01300000185725121508427196756_s.jpg 1]: http://tupian.hudong.com/a2_17_42_01300000185725121508427196756_jpg.html [01300000185725121508435076717_s.jpg]: http://a0.att.hudong.com/04/43/01300000185725121508435076717_s.jpg [01300000185725121508435076717_s.jpg 1]: http://tupian.hudong.com/a0_04_43_01300000185725121508435076717_jpg.html [Link 6]: http://www.hudong.com/wiki/%E6%95%A3%E5%88%97 [01300000185725121508448780256_s.jpg]: http://a1.att.hudong.com/33/44/01300000185725121508448780256_s.jpg [01300000185725121508448780256_s.jpg 1]: http://tupian.hudong.com/a1_33_44_01300000185725121508448780256_jpg.html [01300000185725121508453778315_s.jpg]: http://a4.att.hudong.com/26/45/01300000185725121508453778315_s.jpg [01300000185725121508453778315_s.jpg 1]: http://tupian.hudong.com/a4_26_45_01300000185725121508453778315_jpg.html [http_www.cnblogs.com_jiewei915_archive_2010_08_09_1796042.html]: http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html
相关 哈希表 ![Center][] [Center]: /images/20220731/1379dbdc6efb4a42a0b011f0b3aa4455.png 「爱情、让人受尽委屈。」/ 2022年08月14日 04:56/ 0 赞/ 197 阅读
相关 哈希表 什么是哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的[数据结构][Link 1]。也就是说,它通过把关键码 悠悠/ 2022年07月15日 12:14/ 0 赞/ 213 阅读
相关 哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速 系统管理员/ 2022年06月10日 01:26/ 0 赞/ 270 阅读
相关 哈希表 我们知道,通过对数组进行直接寻址(Direct Addressing),可以在 O(1) 时间内访问数组中的任意元素。所以,如果存储空间允许,可以提供一个数组,为每个可能的关键 快来打我*/ 2022年06月05日 02:20/ 0 赞/ 376 阅读
相关 哈希表 1. 什么是哈希表 我们先来做个题(leetCode上387题) ![70][] public class Solution_387 { 朱雀/ 2022年05月16日 10:11/ 0 赞/ 310 阅读
相关 哈希表 哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0 今天药忘吃喽~/ 2022年02月01日 14:36/ 0 赞/ 423 阅读
相关 【哈希表】 char FirstNotRepeatingChar(char pString) { // invalid input if(! r囧r小猫/ 2022年01月06日 11:33/ 0 赞/ 343 阅读
相关 哈希表 一、简介 如果所有的键都是小整数,那么我们可以用一个数组来实现无序的符号表,将键作为数组的索引i而数组中i(键)处储存的就是对应的值。 这样就可以快速地访问任意键的值, 旧城等待,/ 2021年12月22日 01:21/ 0 赞/ 419 阅读
相关 哈希表 【一】哈希表 > 他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。 ![watermark_type_ZmFuZ3poZW5na 傷城~/ 2021年08月11日 17:13/ 0 赞/ 572 阅读
还没有评论,来说两句吧...