如何搜索哈希表?

时间:2012-10-22 23:14:57

标签: hash hashmap hashtable

我刚刚开始学习哈希表,我知道如何插入但不知道如何搜索。这些是我将基于这个问题的算法:

哈希密钥

int Hash (int key) {
    return key % 10;  //table has a max size of 10
}

线性探测碰撞解决方案。

假设我使用键1,11和21调用插入两次。这将返回所有3个键的插槽1。在冲突解决后,表格将在第1,2和3位具有值1,11和21.这就是我对插入的理解会发生的情况。

完成此操作后,如果我搜索11和21键,我将如何获得插槽2和3?从我读到的搜索哈希表应该与插入完全相同的事情,除非你到达所需的插槽,你返回该插槽的值而不是插入一些东西。

如果我从字面上理解并应用相同的算法,如果我搜索密钥11,我将到达第4个插槽,因为它将从插槽1开始并继续探测直到找到空插槽。它不会在第2个插槽停止,即使它是我想要的,因为它不是空的。

即使我使用单独的链接,我也在努力解决这个问题。所有3个密钥都将存储在插槽1中,但使用相同的算法进行搜索将返回插槽1,而不是链接列表中的哪个节点。

2 个答案:

答案 0 :(得分:1)

每个插槽都存储一个键/值对。当您搜索每个插槽时,请检查该键是否与您要搜索的键相同。找到相同的密钥时停止搜索并返回值。

使用单独的链接,您可以在列表中进行线性搜索,检查列表中每个键的键。

答案 1 :(得分:0)

我通常更喜欢将表中的每个条目都作为一个结构,这样我就可以创建一个链表来处理冲突。这大大减少了碰撞。这样的事情。

struct hashtable
{
    int key;
    struct hashtable *pList;
};

struct hashtable ht[10];

void Insert(int key);
{
    index = Hash(key);
    if (!ht[index].key)
    {
        ht[index].key = key;
        ht[idnex].pList = 0;
    } 
    else
    {
        struct hashtable *pht;
        pht = ht[index].pList; 
        while (pht->pList)
            pht = pht->pList;
        pht->pList = new struct hashtable;
        pht->pList->key = key;
        pht->pList->pList = 0;
    }
    return;
}

如果找不到第一个条目的关键匹配,查找函数当然必须遍历列表。如果性能至关重要,您可以对链表使用其他策略,例如对它们进行排序和使用二进制搜索。