我刚刚开始学习哈希表,我知道如何插入但不知道如何搜索。这些是我将基于这个问题的算法:
哈希密钥
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,而不是链接列表中的哪个节点。
答案 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;
}
如果找不到第一个条目的关键匹配,查找函数当然必须遍历列表。如果性能至关重要,您可以对链表使用其他策略,例如对它们进行排序和使用二进制搜索。