【问题标题】:Creating a hash map with sorted linked list in each slot在每个槽中创建带有排序链表的哈希映射
【发布时间】:2018-04-14 07:25:36
【问题描述】:

我已经成功地制作了一个哈希映射,每个插槽中都有链接和单链表。当我使用插入时,它将新节点发送到每个链表的后面,但是当我插入一个新节点时,我需要对每个插槽进行排序。如何编辑下面的 insert 函数,以便不必在之后对每个插槽进行排序,而是将其插入到正确的位置开始?

void hashInsert(int key){
    int hashLoc = h(key);
    HashNode* prev = NULL;
    HashNode* entry = hTable[hashLoc];
    while(entry != NULL){
        prev = entry;
        entry = entry->next;
    }
    if(entry == NULL){
        entry = new HashNode(key);
        if(prev == NULL){
            hTable[hashLoc] = entry;
        }
        else{

            prev->next = entry;
        }
    }
    else{
        entry->value = key;
    }
}

【问题讨论】:

  • 你不需要将它添加到链接的最后一个位置,只需将它添加到具有比它更大的值的节点之前。您可以为此使用比较函数或 lambda,而不是小于或大于运算符。您仍然需要为其分配新的 HashNode 并将其之前的节点的下一个指针值设置为它,并将它的下一个值设置为紧随其后的下一个节点。一个到节点之后。
  • 我将要创建的新 HashNode 设置为什么?
  • 您要添加的密钥

标签: c++ hashtable singly-linked-list


【解决方案1】:

保持每个插槽排序的主要技巧是插入正确的位置,在这种情况下,它正好在第一个较大的值之前。

在您的代码中,您使用以下 while 循环强制在列表末尾插入。

while(entry != NULL){
    prev = entry;
    entry = entry->next;
}

相反,我们想要修改这个条件,以便我们不仅寻找列表的末尾(entry == NULL),还寻找更大的值。

while(entry != NULL && entry->value < value_to_insert){
    prev = entry;
    entry = entry->next;
}

这个修改后的 for 循环正确地确定了放置新条目的正确位置,就在 preventry 之间。

在这种情况下的另一个问题是您的插入逻辑中有几个错误。

这是你的插入逻辑:

if(entry == NULL){
    entry = new HashNode(key);
    if(prev == NULL){
        hTable[hashLoc] = entry;
    }
    else{

        prev->next = entry;
    }
}
else{
    entry->value = key;
}

主要问题是 if(entry==NULL) if 语句的 else 分支的逻辑无效。

在这种情况下,您需要创建一个新条目,修复 prev 指针并修复 next 指针。

实际上将其重写为以下内容会更简单:

new_entry = new HashNode(key);
new_entry->value = value_to_insert;
if(prev == NULL){
    hTable[hashLoc] = new_entry;
}
else{
    prev->next = new_entry;
}

new_entry->next = entry;

【讨论】:

  • 在代码的最后一个链接中,你有entry-&gt;prev,我在哈希节点中没有prev,因为我使用的是单链表。
  • 糟糕,我的错。
  • 太棒了,效果很好。我现在看到它如何将新条目的下一个设置为当前已经存在的条目。感谢您的帮助!
  • 好的,既然我已经正确实现了插入,它现在没有正确删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多