让我们考虑对于两个不同的输入("tomas"
,"peter"
),哈希函数产生相同的密钥(3)。
请更正我的假设如何在引擎盖下使用单独的链接:
在哈希表中,索引3包含指向链表头的指针。该列表包含两个节点,例如:
struct node{
char value_name[];
int value;
node* ptr_to_next_node;
};
搜索机制会记住输入名称("peter"
)并比较节点中的value_name
。当它等于"peter"
时,机制将返回值。
这是对的吗?我已经知道普通的链表并不包含节点的名称,所以我不知道,如何找到列表中的对应的值,这些节点有不同的名称({ {1}},"tomas"
):
"peter"
答案 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
};
这不会浪费时间来比较字符串,除非它们的长度相同。