数据结构——哈希表【Java代码】

哈希表

1. 什么是哈希表

  1. 哈希表:也称为散列表,是一种数据结构,用于实现“键值对”映射关系。
  2. 哈希函数:为了使存储位置与关键字之间确立一个一一对应的关系,我们需要构造对应的哈希函数 f(key)
  3. 哈希冲突:对于不同的关键字可能得到同一个哈希地址,即key1≠key2,而f(key1) = f(key2)。

假设f(key) = key MOD m;(m为哈希表表长,MOD为取余)
有关键字5 与 9,m 长为4,f(5) = f(9) = 1,他们会分配到同一位置,但是不同的关键字的位置应该不同,因此就产生了哈希冲突。

2. 哈希函数构造方法

条件:关键字为数字类型就可以直接进行哈希函数构造,如果是其他类型就要转化为数字形式表达。

  1. 直接定址法

要求:地址集合大小 == 关键字集合大小
方法:取关键字或关键字的某个线性函数值作为哈希地址。
应用情况:实际应用情况很少。

H( key) = key 或 H( key) = a * key + b
  1. 除留余数法

方法:取关键字被某个不大于哈希表表长m的数p除后的余数作为哈希地址。
条件:一般情况下,可以选p为质数或不包含小于20的质因数的合数。
应用情况:简单,应用广泛。

H( key) = key MOD p,p ≤ m

举例:
关键字集合:{1,3,6,7,10} 表长 m = 11
直接定址法:H(key) = key
在这里插入图片描述
除留余数法:H(key) = key MOD 5
在这里插入图片描述
在这个方法中1 与 6 的余数均为1,所以会产生哈希冲突,所以我们在创建哈希表时,不仅要有哈希函数,同时也要有处理冲突的方法。

3. 处理冲突方法

  1. 开放定址法

方法:对哈希函数获取到的值进行一定的处理从而获取到新的位置。

H i = (H( key) + di) MOD m        i = 1,2,...,k (k ≤ m -1)

di的三种赋值方式

(1)线性探测再散列:设置di是i的常数倍

会产生二次聚集,在冲突过程中发生的两个第一个哈希地址不同的记录争夺同一个后继哈希地址。

di = c * i     c为常数

(2)平方探测再散列:di为k从1开始的平方

m必为 4 * j + 3的质数,例:7,11,17

di = 12, -12, 22, -22 ... ,±k2( k ≤ m/2)

(3)随机探测再散列:di为另一个哈希函数,去获得另一个随机的数字

m 要与 di无公因子

d i = H 2( key) = key MOD p,p ≤ m

举例
关键字集合:{19,1,23,14,55,68,11,86,37} 表长 m = 11

  1. 线性探测再散列
    请添加图片描述
  2. 平方探测再散列
    请添加图片描述3. 随机探测再散列请添加图片描述
  1. 链地址法
    定义:将所有关键字为同义词的记录存储在同意线性链表中。

利用链式存储就可以避免冲突,每个关键字都拥有对应的位置。请添加图片描述

4. Java中HashTable与HashMap区别

HashTable和HashMap的区别详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值