在添加几个小数后向 HashSet 添加一个大数:会发生什么?
Add a large number to HashSet after adding several small numbers: what will happen?
我正在学习 HashSet-s,但我不太明白他们是如何构建 tables 的。我阅读的每篇文章都在谈论 % hash set 函数,这似乎暗示我应该将几个小数字(整数)添加到 HasSet(例如 1、7、14)然后添加一个大数字(例如 2732780)-table 因为 HashSet 将立即增长到一个巨大的大小,其中包含大量的空单元格。我对么?如果不是,那么 numbers/elements 以什么形式存储?我在哪里可以详细阅读此内容?
更新:澄清一下:
假设我的散列函数是 x = (input / 10), y = (input % 10),这意味着在我上面的示例中,当您添加 1、7 和 14 时,HashSet 会像这样构建 table:
问题是,如果我加上2732780会怎样? table 应该会爆炸吧?还有很多空号?
在 Java 中,HashSet 是使用 HashMap 实现的(从算法的角度来看,在 C# 中没有理由会有所不同)。
这篇文章解释了 HashMap 如何很好地工作:
https://www.geeksforgeeks.org/internal-working-of-hashmap-java/
关键是有一个地图容量的概念。这是一个包含地图桶的数组。选择哪个索引的计算是:
index = hashCode(key) & (n-1)
n 是容量。这意味着当您向集合/映射中插入更多条目时,实现将增长并且 re-hash 它的条目。
哈希集使用一个哈希函数。这会将任何数据类型转换为 int。然后将此 int 放入桶中。这是通过使用 %
和可用桶的数量来完成的。
说是x % 10
。然后它看起来像这样:
|input |hashcode |bucket
|1 | 1 |1
|7 | 7 |7
|14 | 14 |4
|2732780 | 2732780 |0
如果有两个条目具有相同的桶,则会保留一个列表,并且在该桶内查找是线性的。该实施将根据需要增加存储桶。
我正在学习 HashSet-s,但我不太明白他们是如何构建 tables 的。我阅读的每篇文章都在谈论 % hash set 函数,这似乎暗示我应该将几个小数字(整数)添加到 HasSet(例如 1、7、14)然后添加一个大数字(例如 2732780)-table 因为 HashSet 将立即增长到一个巨大的大小,其中包含大量的空单元格。我对么?如果不是,那么 numbers/elements 以什么形式存储?我在哪里可以详细阅读此内容?
更新:澄清一下:
假设我的散列函数是 x = (input / 10), y = (input % 10),这意味着在我上面的示例中,当您添加 1、7 和 14 时,HashSet 会像这样构建 table:
问题是,如果我加上2732780会怎样? table 应该会爆炸吧?还有很多空号?
在 Java 中,HashSet 是使用 HashMap 实现的(从算法的角度来看,在 C# 中没有理由会有所不同)。
这篇文章解释了 HashMap 如何很好地工作: https://www.geeksforgeeks.org/internal-working-of-hashmap-java/
关键是有一个地图容量的概念。这是一个包含地图桶的数组。选择哪个索引的计算是:
index = hashCode(key) & (n-1)
n 是容量。这意味着当您向集合/映射中插入更多条目时,实现将增长并且 re-hash 它的条目。
哈希集使用一个哈希函数。这会将任何数据类型转换为 int。然后将此 int 放入桶中。这是通过使用 %
和可用桶的数量来完成的。
说是x % 10
。然后它看起来像这样:
|input |hashcode |bucket
|1 | 1 |1
|7 | 7 |7
|14 | 14 |4
|2732780 | 2732780 |0
如果有两个条目具有相同的桶,则会保留一个列表,并且在该桶内查找是线性的。该实施将根据需要增加存储桶。