【问题标题】:Hashtable underlying place holder?哈希表底层占位符?
【发布时间】:2018-05-20 00:31:07
【问题描述】:

我正在尝试理解 HashTable 数据结构。据我了解,在HashTable 中,我们首先使用HashFunction 将密钥转换为哈希代码,然后使用模运算符将Hash code 转换为整数索引,用于获取HashTable 中放置数据的位置。

在高层次上,流程是这样的?

Key -> Hash Function -> Hash code -> Modulo operator -> integer index -> Store in HashTable

由于密钥是根据模运算符发出的索引存储的,我的疑问是,用于保存实际数据的底层数据结构是什么?是数组吗,数组可以用Index来访问。

谁能帮我理解这个?

【问题讨论】:

    标签: data-structures hash hashtable


    【解决方案1】:

    虽然它完全取决于实现,但我同意底层数据结构将是带有链表的数组,因为数组可以方便地以低成本访问元素,而链表是处理哈希冲突所必需的。

    这是在java openjdk Hashtable中实现的详细示例
    最初它创建具有初始容量的数组:

    table = new Entry<?,?>[initialCapacity];
    

    每次添加新元素时都会检查容量阈值。当达到阈值限制时,它会执行重新散列并创建一个新数组,该数组大小是旧数组的两倍

        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;
    

    您可能需要检查other more simple Hashtables 的实现以更好地理解。

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多