广州住房和城乡建设部网站,微信公众号前端开发,找工作用什么平台最好,西安专业得网站建设公司哈希表的概念
哈希表又名散列表#xff0c;官话一点讲就是#xff1a; 散列表#xff08;Hash table#xff0c;也叫哈希表#xff09;#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构。也就是说#xff0c;它通过把关键码值映射到表中一个位置来访问记…
哈希表的概念
哈希表又名散列表官话一点讲就是 散列表Hash table也叫哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说它通过把关键码值映射到表中一个位置来访问记录以加快查找的速度。这个映射函数叫做散列函数存放记录的数组叫做散列表。 给定表M存在函数f(key)对任意给定的关键字值key代入函数后若能得到包含该关键字的记录在表中的地址则称表M为哈希Hash表函数f(key)为哈希(Hash) 函数。 —— 摘自百度百科 那么通俗一点讲哈希表就是一张映射表通过哈希映射将关键字映射到哈希表中使得关键字与哈希值具有一一对应的关系。 图片出处 算法数据结构基础——哈希表Hash Table-CSDN博客 这样我们就可以直接通过找到
哈希函数
哈希函数的一个关键就是通过哈希方法来得到一个映射值理论上关键字与映射值一一对应。一般来说哈希方法大致有如下这些 直接定址法 取关键字的某个线性函数为散列地址HashKey A*Key B 优点简单、均匀 缺点需要事先知道关键字的分布情况 使用场景适合查找比较小且连续的情况除留余数法 设散列表中允许的地址数为m取一个不大于m但最接近或者等于m的质数p作为除数按照哈希函数Hash(key) key% p(pm)将关键码转换成哈希地址平方取中法 假设关键字为1234对它平方就是1522756抽取中间的3位227作为哈希地址 再比如关键字为4321对它平方就是18671041抽取中间的3位671(或710)作为哈希地址平方取中法比较适合不知道关键字的分布而位数又不是很大的情况折叠法 折叠法是将关键字从左到右分割成位数相等的几部分(最后一部分位数可以短些)然后将这几部分叠加求和并按散列表表长取后几位作为散列地址。 折叠法适合事先不需要知道关键字的分布适合关键字位数比较多的情况随机数法 选择一个随机函数取一个随机值作为关键字的哈希值即H(key) random(key)其中random为随机数函数(伪代码)。通常应用于关键字长度不等时采用此法数学分析法 设有n个d位数每一位可能有r种不同的符号这r种不同的符号在各位上出现的频率不一定相同可能在某些位上分布比较均匀每种符号出现的机会均等在某些位上分布不均匀只有某几种符号经常出现。可根据散列表的大小选择其中各种符号分布均匀的若干位作为散列地址。 其中直接定址法、除留余数法是两种较为常用的哈希方法。而直接定址法有非常多的实现方式比如各种字符串Hash函数 - clq - 博客园 (cnblogs.com)所以哈希表的大体思路很好理解但具体实现上却大有讲究。
哈希冲突及其解决方案
不管是哪种哈希方法随着数据量的增大必然会造成哈希冲突。哈希冲突就是多个关键字映射的是同一个哈希值的情况。一般来说解决哈希冲突通常有两种方式闭散列和开散列。
闭散列 - 开放定址法
简单来说如果当前哈希映射值对应的位置已经有数据了就产生了哈希冲突。开放定址法的做法是再找一个映射位置。常用的有线性探测和二次探测两种方式 线性探测法$F(i) 1, 2, 3, ..., m - 1$。 二次探测法$F(i) 1^2, -1^2, 2^2, -2^2, ..., \pm n^2(n \le m / 2)$。 简单来说就是线性探测在发生哈希冲突之后线性地向后寻找直到找到一个空位为止。二次探测是指第一个在哈希值上加上一个1的平方如果发生哈希冲突第二次就减去一个1的平方第三次加上2的平方第四次……这样以此类推。那么查找时也是按照对应的探测方式进行查找的。
开散列 - 链地址法(开链法)
而开散列则相对更容易接受一些。开散列又称连地址法是指的每个哈希表中存放的数据不再是一个单纯的数据而是一个链表所有映射值相同的关键字都被这个链表所链起来就像下面这样 图片出处 算法数据结构基础——哈希表Hash Table-CSDN博客 注意事项与总结 哈希表的两个核心内容在于哈希函数与哈希冲突的解决。哈希函数大致有如下这几类直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。哈希冲突的解决常用的有开放地址法和链地址法。在哈希表的具体实现中因为扩容操作会改变哈希的映射关系所以扩容时每一个元素都需要重新插入。在具体实现时可以通过负载因子有效值与最大容量的比值来控制扩容的时机。哈希与哈希表的区别是哈希是一种思想哈希表是哈希这种思想的一种实现方式其它的还有比如位图、布隆过滤器等也是哈希思想的一种体现。