-1

我有一个关于 HASH 函数的设计问题。

在我的程序中,我使用 的哈希表size 2^13,其中插槽是根据我要插入的节点(哈希键)的值计算的。

现在,假设我的每个节点都有两个值,|A|B|但是我使用A.

稍后,我想搜索一个特定的节点B not A

有可能这样吗?是的,你能强调一些设计方法吗?约束是我必须A用作哈希键。

抱歉,我不能分享代码。小例子:

Value[] = {Part1, Part2, Part3};
insert(value)
check_for_index(value.part1)

value.part1用于计算槽的索引。

一旦找到插槽,然后插入"value"

稍后的,

search_in_hash(part2)

check_for_index("But here I need the value.part1 to check for slot index")

那么,我怎样才能将part1, part2 & part3这些联系起来,以便以后我可以通过以下方式找到插槽part2 or part3

如果问题陈述含糊不清,请告诉我。

4

1 回答 1

0

除非您打算逐个元素进行搜索(在这种情况下,您不需要哈希,只需要一个普通列表),那么您基本上要问的是 - 我可以有一个哈希,使得 hash(X) == hash(Y),但是 X!=Y,这样你就可以使用 part1 映射到一个位置,然后使用 part2 或 3 映射到同一个位置。这完全违背了散列的含义。

您应该做的是(正如 viraptor 还建议的那样),创建 3 个结构,每个结构使用值的不同部分进行散列,并将完整值推送到所有 3。然后当您需要搜索时,使用您想要的部分使用正确的散列搜索。

例如:

value[] = {part1, part2, part3};
hash1.insert(part1, value)
hash2.insert(part2, value)
hash3.insert(part3, value)

然后

hash2.search_in_hash(part2)

或者

hash3.search_in_hash(part3)

以上 2 应该产生完全相同的值。

还要确保同时在所有 3 个结构上完成所有数据操作(删除值、更改它们)。例如 -

value = hash2.search_in_hash(part2)
hash1.remove(value.part1)
hash2.remove(part2)        // you can assert that part2 == value.part2
hash3.remove(value.part3)
于 2013-09-13T11:27:40.097 回答