将元素插入到具有恒定数量的桶的完整哈希 table
Inserting an element to a full hash table with a constant number of buckets
我目前正在研究散列 table,并且有一个关于其使用固定大小的桶实现的问题。
假设我们有一个包含 23 个元素的散列 table(例如)。让我们使用最简单的散列函数 (hash_value = key%table_size
),键是整数 only。如果我们说一个桶最多只能有 1 个元素(没有单独的链接),这是否意味着当所有桶都满时我们将不再能够在 table 中插入任何元素?或者我们是否必须实际用新元素替换具有相同哈希值的元素?
我知道我设置了很多限制条件,实际的实现可能永远不会像那样,但我想确保我理解那个特殊情况。
真正的实现通常允许散列 table 能够调整大小,但这通常需要很长时间并且是不希望的。考虑到一个固定大小的散列 table,它可能会 return 一个错误代码或抛出一个异常供用户处理或不处理该错误。
Or will we have to actually replace element that has the same hash value with a new element?
在 Java 的 HashMap 中,如果您添加的键等于散列中已存在的另一个键 table 只有与该键关联的值将被新的,但如果两个键散列到相同的散列。
是的。 "open" 散列 table - 您正在描述的 - 具有固定大小,因此它可以填满。
然而,实现通常会通过将所有内容复制到一个更大的新 table 来响应。事实上,通常他们不会等到完全填满,而是使用一些标准——例如使用的所有 space 的一小部分(有时称为 "load factor")——来决定何时扩展。
如果加载因子由于删除而变得太小,一些实现也会 "shrink" 自己变得更小 table。
您可能会发现阅读 Google's hash table implementation 是一种很好的学习体验,其中包括一些内部文档。
我目前正在研究散列 table,并且有一个关于其使用固定大小的桶实现的问题。
假设我们有一个包含 23 个元素的散列 table(例如)。让我们使用最简单的散列函数 (hash_value = key%table_size
),键是整数 only。如果我们说一个桶最多只能有 1 个元素(没有单独的链接),这是否意味着当所有桶都满时我们将不再能够在 table 中插入任何元素?或者我们是否必须实际用新元素替换具有相同哈希值的元素?
我知道我设置了很多限制条件,实际的实现可能永远不会像那样,但我想确保我理解那个特殊情况。
真正的实现通常允许散列 table 能够调整大小,但这通常需要很长时间并且是不希望的。考虑到一个固定大小的散列 table,它可能会 return 一个错误代码或抛出一个异常供用户处理或不处理该错误。
Or will we have to actually replace element that has the same hash value with a new element?
在 Java 的 HashMap 中,如果您添加的键等于散列中已存在的另一个键 table 只有与该键关联的值将被新的,但如果两个键散列到相同的散列。
是的。 "open" 散列 table - 您正在描述的 - 具有固定大小,因此它可以填满。
然而,实现通常会通过将所有内容复制到一个更大的新 table 来响应。事实上,通常他们不会等到完全填满,而是使用一些标准——例如使用的所有 space 的一小部分(有时称为 "load factor")——来决定何时扩展。
如果加载因子由于删除而变得太小,一些实现也会 "shrink" 自己变得更小 table。
您可能会发现阅读 Google's hash table implementation 是一种很好的学习体验,其中包括一些内部文档。