我正在尝试了解HashTable
数据结构。我理解在HashTable
中我们首先使用HashFunction
来转换哈希代码的密钥,然后使用模运算符将Hash code
转换为整数索引,并用于获取HashTable中的位置数据被放置。
在高水平,流程是这样的吗?
Key
- > Hash Function
- > Hash code
- > Modulo operator
- > integer index
- > Store in HashTable
由于密钥是根据模运算符发出的索引存储的,我的疑问是,用于保存实际数据的底层数据结构是什么?它是一个数组,可以使用Index访问数组。
任何人都可以帮我理解这个吗?
答案 0 :(得分:1)
虽然它完全取决于实现,但我同意底层数据结构是带有链表的数组,因为数组很容易以低成本访问元素,而链表是处理哈希冲突所必需的。
以下是java openjdk Hashtable中如何实施的详细示例 最初它创建具有初始容量的数组:
table = new Entry<?,?>[initialCapacity];
每次添加新元素时都会检查容量阈值。达到阈值限制时,它会执行rehashing并创建一个新数组,它是旧数组的双倍大小
int newCapacity = (oldCapacity << 1) + 1;
if (newCapacity - MAX_ARRAY_SIZE > 0) {
if (oldCapacity == MAX_ARRAY_SIZE)
// Keep running with MAX_ARRAY_SIZE buckets
return;
newCapacity = MAX_ARRAY_SIZE;
}
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];
modCount++;
threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
table = newMap;
Hashtable Entry
形成一个链接列表。它用于哈希冲突的情况,因为2个不同值的索引将变得相同,并且通过链表检查所需的值。
private static class Entry<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Entry<K,V> next;
您可能需要检查Hashtables的other more simple实现,以便更好地理解。