【问题标题】:Hashing table design in CC中的哈希表设计
【发布时间】:2013-09-17 22:57:06
【问题描述】:

我有一个关于 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 找到插槽

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

【问题讨论】:

  • 提供示例和代码sn-p。您使用的是哪个哈希表实现?
  • 散列键是要插入的值的标识符,所以用B搜索A是不正确的。或者你可以设计一个神奇的散列函数,使 A 和 B 的散列值相同。
  • 我很困惑为什么你用part1作为散列键插入,却通过其他部分生成的键找到槽。这是散列表的工作原理en.wikipedia.org/wiki/Hash_table
  • @MYMNeo 流程设计使得我必须使用part1 作为键来插入数据。可能会使用part1, part2 or part3 中的任何一个来完成搜索。使用part1 搜索不是强制性的,因为代码要检查part2/3 是否已经在表中。或者它是否与part1 关联或不在表中。
  • 有什么东西阻止你为每个部分创建一个哈希表吗?插入所有内容,然后使用正确的实例查找特定部分。

标签: algorithm hash hashmap hashtable


【解决方案1】:

除非您打算逐个元素进行搜索(在这种情况下,您不需要哈希,只需一个普通列表),那么您基本上要问的是 - 我可以有一个哈希这样的哈希(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)

【讨论】:

  • 谢谢!我想到了这个解决方案,但正在考虑一种更好的方法来处理它,而不是牺牲内存。
  • 嗯,这是您应该考虑的权衡 - 使用更多内存可以帮助您更快地定位元素,而不是您可以逐个键搜索单个哈希并匹配您想要的部分但是没有用作关键。如果说 90% 的查找是使用某个键完成的,那么它可能是值得的。另请注意,出于空间考虑,您可以使用单个结构,并让所有 3 个哈希指向它。
猜你喜欢
  • 2017-03-26
  • 2011-07-21
  • 2012-07-12
  • 2023-03-04
  • 2013-08-20
  • 2012-10-03
  • 2019-03-26
  • 2013-03-15
相关资源
最近更新 更多