数据结构 | 详解 HashTable 和 HashSet

本文介绍了哈希表的基本概念,包括哈希函数、负荷系数、容量、阈值和再散列。详细阐述了哈希表在HashSet和HashMap中的应用,如插入、查找和避免碰撞的方法。还提供了Java中HashSet和HashMap的使用示例,展示了它们在存储和检索数据时的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

在实际开发当中,我们常常使用哈希函数了组织数据,以便能够快速地插入和搜索数据。

通常,我们会用到两种数据结构。

  • HashSet: 哈希集合,没有重复的数据
  • HashMap: 哈希映射,由键值对组成

2 哈希表中使用的概念

2.1 哈希函数

哈希函数能够将一个大数或字符串映射为一个小整数,这个整数可用作哈希表的索引。

2.2 负荷系数

负荷系数是表中存储的 元素数/桶数
在这里插入图片描述
它的主要作用就是权衡时间与空间复杂性。

在这里插入图片描述

2.3 容量与初始容量

一般而言,桶的初始容量为 16。比如 Java 中的 HashMap

2.4 阈值

阈值的计算公式是 容量 * 负荷系数。在 java 中,Hashmap 的初始容量为16,负荷系数为0.75。因此阈值是16 * 0.75 = 12。所以,向 HashMap 添加第12个元素之后,HashMap 的容量将从16增加到32。

2.5 再散列

如果负荷系数是1.0,当容量消耗完时,会触发再散列。所有的 hashcode 将会被重新计算。

3 哈希表

哈希表使用哈希函数映射到桶中。

3.1 插入新键

  • 哈希函数决定分配哪个桶键
  • 键值存储在相应的桶中

3.2 查找键值

  • 通过哈希函数找到相应的桶
  • 在桶里查找键值
    在这里插入图片描述
    如果以 y = x % 5 作为哈希函数,那么1987 和 2 将会被放在同一个桶里。

3.3 设计哈希表

哈希函数

理想情况下,key 和 bucket 是一对一的映射。然而,在桶的数量和桶的容量之间总是存在一个权衡。所以,好的哈希函数必须满足下面的要求:

  • 计算效率高
  • 键值能够均匀分布
减少碰撞或者冲突

冲突意味着两个键值,映射到同一个桶里。

那么,如何处理碰撞呢?

采用链表

如下图所示:
在这里插入图片描述

可以看到,使用链表会增加额外的存储。

4 Java 中的 HashSet 和 HashMap

HashSet 里,不存在重复值。下面是它的典型用法:

Set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟华328

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值