当前位置: 首页 > 知识库问答 >
问题:

如何搜索哈希表?

厍光霁
2023-03-14

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

散列密钥

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个答案

张和豫
2023-03-14

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

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;
}

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

柯曦
2023-03-14

每个槽存储一个键/值对。当您搜索每个槽时,检查键是否与您搜索的键相等。停止搜索,并在找到相等的键时返回值。

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

 类似资料:
  • 问题内容: 我有一个哈希表,其键的模式为USER_TEL,例如: 现在,我想获取密钥中具有相同TEL的所有用户的地址。 我想出的是: 我得到而不是价值观。 问题答案: 您应该使用HSCAN命令。 例如: 更新资料 Python实现:

  • 问题内容: 我正在尝试处理JSON文件: 我希望能够: 更新键值对上的值 删除键/值 删除或插入一个数组值 我已经做了很多事情来解决这个问题。 我的简化代码思路是: 生成的JSON应该是: 我不确定如何使用这种结构的JSON。 问题答案: 我了解您的JSON可能如下所示: 我建议使用OpenStruct来组织数据: 然后,您得到了所有想要的东西。对于您显示的操作: 然后,进行更改后,可以使用: 您

  • 如果我实现一个哈希表,我理解插入是在恒定的时间内完成的。我也明白,如果没有碰撞,我可以在不变的时间内找到物品。然而,如果我插入一个项目,并在任意索引中使用链表链接它,它最终在位置2,但它在列表下链接了3个链接,这是O(n)时间,进行搜索吗?

  • 当人们说Hashmap比列表更快时,我对Hashmap或Hashtable的概念更困惑。我很清楚散列的概念,其中的值存储在给定密钥的散列代码中。 但是,当我想检索数据时,例如,它是如何工作的,我在一个HashMap中存储n个带有n个不同键的字符串。如果我想检索与特定键关联的特定值,它将如何在O(1)的时间内返回它?因为散列密钥将与所有其他密钥进行比较,对吗?

  • Hashmaps通常使用桶的内部数组(表)来实现。在通过键访问hashmap时,我们使用键类型特定(逻辑类型特定)的hash函数获得键的hashcode。然后我们需要将hashcode映射到实际的内部桶表索引。 有时,内部表可能会收缩和扩展,这取决于hashmap填充率。那么可能是散列码- 例如,我们的哈希函数返回32位无符号整数值 时刻A:内表容量为10000 时刻B:内工作台容量为100000