哈希表(hash table)

hash表

哈希表(散列表)原理详解:https://blog.csdn.net/duan19920101/article/details/51579136

B站 讲解视频: https://www.bilibili.com/video/av17500428?from=search&seid=12765918089840512042
根据设定的哈希函数处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表

要点

  • 构造hash函数
  • 处理冲突的方法

构造hash函数的方法

1.直接定址法
2.数字分析法
3.平方取中法
4.折叠法
5.除留余数法

处理冲突的基本方法

处理冲突是指对于一个待插入的哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按一定规则求下一哈希地址,如此重复,直至找到下一个可用的地址以保存该元素。

1.建立一个缓冲区,把凡是拼音重复的人放到缓冲区中。当我通过名字查找人时,发现找的不对,就在缓冲区里找。

2.进行再探测。就是在其他地方查找。探测的方法也可以有很多种。

(1)在找到查找位置的index的index-1,index+1位置查找,index-2,index+2查找,依次类推。这种方法称为线性再探测。

(2)在查找位置index周围随机的查找。称为随机在探测。

(3)再哈希。就是当冲突时,采用另外一种映射方式来查找。

这个程序中是通过取模来模拟查找到重复元素的过程。对待重复元素的方法就是再哈希:对当前key的位置+7。最后,可以通过全局变量来判断需要查找多少次。我这里通过依次查找26个英文字母的小写计算的出了总的查找次数。显然,当总的查找次数/查找的总元素数越接近1时,哈希表更接近于一一映射的函数,查找的效率更高。

  1. 哈希函数的构造不是越复杂越好,因为往往哈希函数越复杂,取得关键字地址所消耗的时间越长,可能对哈希法性能造成一定的影响,因此选取哈希函数的时候,应该多方面权衡,选择合适的哈希函数(即不存在特别好与坏的哈希函数,需视情况而定)。

  2. 哈希函数有一个共同的性质,即哈希值应当以同等概率取其值域的每个值。

常用的构造哈希函数的方法:

  1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key) = key或H(key) = a * key + b,其中a和b为常数(这种散列函数叫做自身函数)。

  2. 数字分析法:分析一组数据,比如某班学生的出生年月日时发现出生年月日的前几位数字大体相同,这样的话,冲突的几率会很大,但是发现年月日的后几位表示月份和具体日期的数字差别比较大,如果用后几位构成散列地址,则冲突的几率会明显降低。因此数字分析法是找出数字的规律,尽可能利用这些数字构造冲突几率低的散列地址。

  3. 平方取中法:先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。

  4. 除余法:该方法是最为简单常用的一种方法。它是以表长m来除关键字,取其余数作为散列地址,即 h(key) = key % m。

该方法的关键是选取m。选取的m应使得散列函数尽可能与关键字的各位相关。m最好为素数。

  1. 相乘取整法:该方法包括两个步骤:首先用关键字key乘上某个常数A(0<A<1),并抽取出key.A的小数部分;然后用m乘以该小数后取整

Hashtable
(1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
(2)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
(3)HashTable直接使用对象的hashCode。
HashMap
(1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
(2)不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
(3)HashMap重新计算hash值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值