当前位置: 首页 > wzjs >正文

深圳网站制作教程招商网站

深圳网站制作教程,招商网站,网站程序合同,济南百度整站seo推广1.哈希的概念 哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。 1.2.直接定址法…

1.哈希的概念

哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。

1.2.直接定址法

当关键字的范围⽐较集中时,直接定址法就是⾮常简单⾼效的⽅法,⽐如⼀组关键字都在[0,99]之间,那么我们开⼀个100个数的数组,每个关键字的值直接就是存储位置的下标。再⽐如⼀组关键字值都在[a,z]的⼩写字⺟,那么我们开⼀个26个数的数组,每个关键字acsii码-a ascii码就是存储位置的下标。也就是说直接定址法本质就是⽤关键字计算出⼀个绝对位置或者相对位置

1.3.哈希冲突 

直接定址法的缺点也⾮常明显,当关键字的范围⽐较分散时,就很浪费内存甚⾄内存不够⽤。

这⾥存在的⼀个问题就是,两个不同的key可能会映射到同⼀个位置去,这种问题我们叫做哈希冲突。

1.4.负载因子

假设哈希表中已经映射存储了N个值,哈希表的大小为M,那么 负载因子 = N/M ,负载因⼦有些地⽅也翻译为载荷因⼦/装载因⼦等,他的英⽂为load factor。负载因⼦越⼤,哈希冲突的概率越⾼,空间利⽤率越⾼;负载因⼦越⼩,哈希冲突的概率越低,空间利⽤率越低。

1.5.将关键字转为整数

我们将关键字映射到数组中位置,⼀般是整数好做映射计算,如果不是整数,我们要想办法转换成整数。后面给具体实现方法。

2.哈希函数

⼀个好的哈希函数应该让N个关键字被等概率的均匀的散列分布到哈希表的M个空间中,但是实际中却很难做到,但是我们要尽量往这个⽅向去考量设计。

2.1除法散列法

假设哈希表的⼤⼩为M,那么通过key除以M的余数作为映射位置的下标,也就是哈希函数为:h(key) = key % M。

当使⽤除法散列法时,要尽量避免M为某些值,如2的幂,10的幂等。如果是2^x ,那么key %

2^x本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。如: {63 , 31}看起来没有关联的值,如果M是16,也就是2^4 ,那么计算出的哈希值都是15,因为63的⼆ 进制后8位是 00111111,31的⼆进制后8位是 00011111。如果是10^2 ,就更明显了,保留的都是10进值的后x位,如:{112, 12312},如果M是100,也就是10^2 ,那么计算出的哈希值都是12。

当使⽤除法散列法时,建议M取不太接近2的整数次幂的⼀个质数(素数)。

3.处理哈希冲突

实践中哈希表⼀般还是选择除法散列法作为哈希函数,当然哈希表⽆论选择什么哈希函数也避免不了冲突,那么插⼊数据时,如何解决冲突呢?主要有两种两种⽅法,开放定址法和链地址法。

3.1开放定址法

在开放定址法中所有的元素都放到哈希表⾥,当⼀个关键字key⽤哈希函数计算出的位置冲突了,则按照某种规则找到⼀个没有存储数据的位置进⾏存储,开放定址法中负载因⼦⼀定是⼩于1的。
1.线性探测:
1.1 从发⽣冲突的位置开始,依次线性向后探测,直到寻找到下⼀个没有存储数据的位置为⽌,如果⾛
到哈希表尾,则回绕到哈希表头的位置。1.2 h(key) = hash0 = key % M,, hash0位置冲突了,则线性探测公式为:
hc(key,i) = hashi = (hash0 + i) % M, i = {1, 2, 3, ..., M − 1},
因为负载因⼦⼩于1,则最多探测M-1次,⼀定能找到⼀个存储key的位置。2.⼆次探测:
2.1 从发⽣冲突的位置开始,依次左右按⼆次⽅跳跃式探测,直到寻找到下⼀个没有存储数据的位置为
⽌,如果往右⾛到哈希表尾,则回绕到哈希表头的位置;如果往左⾛到哈希表头,则回绕到哈希表
尾的位置;
2.2 h(key) = hash0 = key % M , hash0位置冲突了,则⼆次探测公式为:
hc(key,i) = hashi = (hash0 ± i^2 ) % M, i = {1, 2, 3, ..., M/2}
2.3 ⼆次探测当 hashi = (hash0 − i^2)%M 时,当hashi<0时,需要hashi += M

3.2扩容:

这⾥哈希表负载因⼦控制在0.7,当负载因⼦到0.7以后我们就需要扩容了,我们还是按照2倍扩容,但是同时我们要保持哈希表⼤⼩是⼀个质数,第⼀个是质数,2倍后就不是质数了。那么如何解决了,⼀种⽅案就是除法散列中Java HashMap的使⽤2的整数幂,但是计算时不能直接取模的改进⽅法。另外⼀种⽅案是sgi版本的哈希表使⽤的⽅法,给了⼀个近似2倍的质数表,每次去质数表获取扩容后的⼤⼩。

3.3key不能取模的问题

当key是string/自定义等类型时,key不能取模, 那么我们需要给HashTable增加⼀个仿函数,这个仿函 数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数 就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实 现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。string 做哈希表的key⾮常常⻅,所以我们可以考虑把string特化⼀下。

3.4开放定址法代码实现

*3.4链地址法

哈希表中存储⼀个指针,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成⼀个链表,挂在哈希表这个位置下⾯,链地址法也叫做拉链法或者哈希桶。

扩容:

开放定址法负载因⼦必须⼩于1,链地址法的负载因⼦就没有限制了,可以⼤于1。负载因⼦越⼤,哈希冲突的概率越⾼,空间利⽤率越⾼;负载因⼦越⼩,哈希冲突的概率越低,空间利⽤率越低;stl中unordered_xxx的最⼤负载因⼦基本控制在1,⼤于1就扩容。
极端场景:
如果极端场景下,某个桶特别⻓怎么办?这是把链表转换成红黑树,提供一个思路。

3.5链地址法代码实现

http://www.dtcms.com/wzjs/569389.html

相关文章:

  • 体育 网站建设询价函格式wordpress快站怎么样
  • 建设一个网站需要那些技术四川省建设厅建造师官方网站
  • 宁波市有哪些网站建设公司图片本地化wordpress
  • wordpress如何设置导航栏大连优化网站
  • 想建个企业网站北京展示型网站建设价格
  • 手机网站菜单网页怎么做价值30万的网站建设
  • 网站建设的主要技术指什么企业网站优化问题
  • 东莞企业建站程序个人网站建设方案模板
  • 网页做二维码哪个网站好网络优化的内容包括哪些
  • 高端个性化网站建设山东建大建设有限公司网站
  • 跨境电商导购网站建设亚洲免费高清砖码区免下载
  • 河北衡水建设网站公司电话photoshop手机版安卓
  • 杭州建设网 工程信息网站瓷砖网站建设
  • 聊城高唐网站建设公司网站建设有哪些平台
  • 英文广告网站模板免费下载网站建设源码是什么
  • 绵阳网站建设维护网站欣赏 公司网站案例
  • 北京市建设资格执业中心网站全球最好的黄页网站
  • 门户网站建站app软件开发定义
  • 学做视频的网站建设网站怎样做
  • 房山做网站公司网站备案期间可以做推广吗
  • 一个只做百合的网站临沂手机网站
  • 网站设计专业有哪些课程网站建设一般多少钱官网
  • wordpress 编辑器添加自定义按钮网站建设优化哪家专业
  • 用vue做的网站网站图片怎么做白色背景
  • 廊坊网站建设哪家好杭州义牛网络技术有限公司
  • 哈尔滨建站的系统wordpress加入移动端导航
  • 学校网站建设汇报wordpress固定地址
  • dede怎么做双语网站做的系统怎么和网站对接
  • 网站获取qq国外空间设计网站
  • 怎么做产品网站外贸推广服务公司