【问题标题】:What is a hash table that doesn't know the keys?什么是不知道键的哈希表?
【发布时间】:2016-09-19 01:10:50
【问题描述】:

例如,如果我在 python 中创建一个字典,我可以使用d.keys() 来检索键。

什么是散列表/字典没有这种访问?存储可能是个问题,而密钥可能是最不重要的。

编辑(澄清):我想要一个可以通过键访问值但不知道键的数据结构,只知道哈希。例如:

Hash                                                             Value
-----------------------------------------------------------------------
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae|hey!
c9fc5d06292274fd98bcb57882657bf71de1eda4df902c519d915fc585b10190|hello!

如果我尝试使用“this is a key”键访问数据结构,它将对其进行哈希处理并得到“hello!”。如果我尝试使用键“foo”访问它,我会得到“嘿!”。

我们无法从这个哈希表中检索键,但我们可以访问数据。这在存储很重要的情况下很有用。

通常,这将是表格:

Hash                                                             Value  Key
-------------------------------------------------------------------------------------
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae|hey!  |foo
c9fc5d06292274fd98bcb57882657bf71de1eda4df902c519d915fc585b10190|hello!|this is a key

【问题讨论】:

  • 我不确定你的意思。只有键的哈希表是一个集合,但您似乎要求一个只有值的哈希表?或者您的意思是存储键/值对但您无法获得键列表的东西?您能否提供一些伪代码来展示您正在寻找的内容?另外,您能解释一下为什么要寻找这样的数据结构吗?
  • 为什么你认为你所问的甚至是一件事?有多种方法可以模糊地获得您所询问的内容,但这有点像问什么是没有轮子的汽车。您必须对它进行重大重新设计才能使结果有意义,并且当您完成时,它并不是真正的“不知道密钥的哈希表”,就像船是没有轮子的汽车一样。

标签: dictionary hashtable


【解决方案1】:

这称为Set - 在这种情况下,值是键,实现通常在将项目添加到集合之前对项目使用哈希码和相等操作。

Set 的一些实现可以排序,一般称为SortedSet。将Set<T> 视为等同于Dictionary<T,T>(而SortedSet<T> 在C# 用语中近似于SortedDictionary<T,T>

排序的变体通常使用二叉树实现,而未排序的实现使用哈希表。由于键是值,因此大多数实现只存储值本身。

您使用的是哪种平台/语言?爪哇?

【讨论】:

  • 这比“不知道键的哈希表”更接近“没有值的哈希表”。就个人而言,我首先想到的是布隆过滤器,但虽然它符合“不知道键”,但严格来说它不是哈希表。
  • 我希望能够通过键访问元素,数据结构根本不知道键——它有自己的哈希。这也是一个理论问题。
  • 理论上,如果不提供执行 value => 键转换的函数,您将无法做到这一点,因为散列函数可能会发生冲突。所以“foo”和“this is a key”可以有相同的哈希值。这种情况下,需要存储hash=>values[],找到hash后,从value中提取key,进行相等比较。
  • @CrazyPython:它必须存储足够的信息才能识别密钥,一般来说,没有比存储密钥更有效的方法了。
  • @FlorianDoyon 可以创建变通方法,例如在添加到哈希表时检测到重复值的辅助哈希函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2011-07-12
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多