单独链接哈希

时间:2017-03-10 17:34:23

标签: c++ list hashtable chaining

让我们考虑对于两个不同的输入("tomas""peter"),哈希函数产生相同的密钥(3)。 请更正我的假设如何在引擎盖下使用单独的链接: 在哈希表中,索引3包含指向链表头的指针。该列表包含两个节点,例如:

struct node{
    char value_name[];
    int value;
    node* ptr_to_next_node;
};

搜索机制会记住输入名称("peter")并比较节点中的value_name。当它等于"peter"时,机制将返回值。

这是对的吗?我已经知道普通的链表并不包含节点的名称,所以我不知道,如何找到列表中的对应的值,这些节点有不同的名称({ {1}},"tomas"):

"peter"

2 个答案:

答案 0 :(得分:0)

是的,这是正确的,这是哈希表的一部分可能的实现。

当您说“普通链表不包含节点名称”时,如果实现语言允许,我希望链表是通用的。在C ++中,它将是一个模板。

它将是某个类型的链接列表,每个元素将具有该类型的实例或句柄,以及指向下一个元素的指针,如第二个代码片段所示,除了用类型替换int。

在这种情况下,类型很可能是键值对 因此,在这种情况下链接列表不直接包含名称 - 它包含一个包含名称(和值)的对象

这只是一种可能的实现方式。还有其他选择

答案 1 :(得分:-1)

是的,基本上:一个结构表,哈希函数限制为返回0和表大小之间的值 - 1,并用作表的索引。

这将使您进入链式元素列表的顶部,其数量将大于或等于零。

为了节省时间和空间,通常table元素本身就是一个链表元素。由于您将字符串指定为存储在哈希表中的数据,因此结构通常更像是:

struct hash_table_element {
    unsigned int length;
    char *data_string;
    struct hash_table_element *next;
}

和动态分配的字符串空间,可能使用标准库函数之一。当然,有许多方法可以管理可以优化您的特定用例的字符串表,如果您使用捷径评估,首先检查长度通常可以加快搜索速度:

if (length == element->length &&
    memcmp(string, element->data_string, length))
{
    found = TRUE
};

这不会浪费时间来比较字符串,除非它们的长度相同。