返回
数学角度理解 HashMap 构建原理,算法与你仅隔一道数学公式!
Android
2023-10-17 11:46:07
碰撞问题
HashMap,即散列表,本质上是一个链表数组,是一个由链表作为值存储在数组中的数据结构。它是一种高效的查找数据结构,在平均情况下,查找、插入和删除操作的时间复杂度为 O(1),即为常数时间。
理解 HashMap 的关键在于理解碰撞问题。当我们向 HashMap 中添加数据时,数据被存储在一个数组中,而数组的大小是有限的。如果两个数据具有相同的键值,则它们将发生碰撞。为解决碰撞问题,HashMap 使用一种称为哈希函数的函数将键值转换为一个哈希值。哈希值是一个整数,它被用作数组中存储数据的索引。
哈希函数
哈希函数是一个将键值转换为哈希值(即索引)的函数。一个好的哈希函数应该满足以下条件:
- 哈希值分布均匀:即对于任何键值,哈希值分布在数组中的所有位置上都具有相同的概率。
- 计算高效:哈希函数的计算应该非常快速,因为它是 HashMap 中所有操作的基础。
- 无碰撞:即对于任何两个不同的键值,哈希函数应该产生不同的哈希值。
链表与红黑树
当两个数据具有相同的键值时,就会发生碰撞。此时,HashMap 使用链表来存储这些具有相同键值的数据。链表是一种线性的数据结构,它由一组节点组成,每个节点包含数据和指向下一个节点的指针。
链表具有以下特点:
- 查找、插入和删除操作的平均时间复杂度为 O(n),其中 n 为链表中的节点数。
- 链表的内存利用率不高,因为每个节点都存储着指向下一个节点的指针。
当链表中的节点数超过 8 个时,HashMap 会将链表转换为红黑树。红黑树是一种自平衡二叉树,它具有以下特点:
- 查找、插入和删除操作的平均时间复杂度为 O(log n),其中 n 为树中的节点数。
- 红黑树的内存利用率比链表高,因为每个节点只存储着指向其左右子树的指针。
查找、插入和删除
HashMap 的查找、插入和删除操作都是基于哈希函数和链表或红黑树实现的。
- 查找:首先,根据键值计算哈希值。然后,使用哈希值作为索引来查找数组中的链表或红黑树。最后,在链表或红黑树中查找具有相同键值的数据。
- 插入:首先,根据键值计算哈希值。然后,使用哈希值作为索引来查找数组中的链表或红黑树。最后,在链表或红黑树中插入具有该键值的数据。
- 删除:首先,根据键值计算哈希值。然后,使用哈希值作为索引来查找数组中的链表或红黑树。最后,在链表或红黑树中删除具有该键值的数据。
应用
HashMap 广泛应用于各种场景中,例如:
- 缓存:HashMap 可以用来存储经常访问的数据,以便快速检索。
- 数据库索引:HashMap 可以用来创建数据库索引,以便快速查找数据。
- 路由表:HashMap 可以用来存储路由表,以便快速查找数据包的最佳路径。
- 哈希表:HashMap 可以用来存储哈希表,以便快速查找数据。