【问题标题】:non STL hash table type structure非 STL 哈希表类型结构
【发布时间】:2011-05-06 22:19:28
【问题描述】:

有没有办法编写简单的哈希表,键为“字符串”,值为频率,这样就不会发生冲突?不会从哈希表中删除,如果对象已经存在于哈希表中,则只需更新其频率(将它们加在一起)。

我在想可能有一种算法可以从将用作索引的字符串中计算出唯一的数字。

是的,我正在避免使用所有 STL 结构,包括 unordered_map。

【问题讨论】:

  • 我认为,也许,带有计数的布隆过滤器可能能够做到这一点。但最后你会得到一大堆线性方程组。

标签: c++ hashtable


【解决方案1】:

您可以使用任何完美的哈希生成器,例如 gperf

查看这里的列表:http://en.wikipedia.org/wiki/Perfect_hash_function

PS。如果映射的域变得太大/稀疏,您仍然可能希望使用映射而不是平面数组/向量

【讨论】:

  • gperf 不需要在编译时知道输入字符串吗? @Jake 没有以一种或另一种方式说明他的字符串在当时是已知的,还是仅在运行时才知道。
  • @Rob:嗯,对我来说很明显密钥不是动态/随机的:没有人可以保证随机有效负载的无冲突哈希函数。如果这不是 OP 的意图,那么我的回答没用也没关系:他还有其他事情要担心。也就是说,如果确实需要这样做,其中一些生成器可能会适应运行时生成
【解决方案2】:

这真的取决于你所说的“简单”。

std::map 是一个相当简单的类。尽管如此,它还是使用了一个红黑树,所有的插入、删除和平衡都很好地隐藏起来,并且它被模板化以处理任何可排序的类型作为键和任何类型作为值。大多数地图类使用类似的实现,并避免使用任何类型的散列功能。

没有冲突的散列无论如何都不是一件小事。也许最简单的方法是Pearson Hashing

您似乎有 3 个选择:

  1. 实现您自己的完美哈希类。这将是一个相当不错的类,具有很多功能和一些相当复杂的算法。我不认为这很简单。

  2. 下载并使用已经存在的完美哈希库。当然,您必须担心可部署性。

  3. 使用 STL 的地图类。它是嵌入式的、有据可查的、易于使用、类型灵活且完全跨平台的。这似乎是“最简单”的解决方案。

如果我可以问,你为什么要避免 STL?

【讨论】:

    【解决方案3】:

    如果事先知道可能的字符串集,则可以使用完美的哈希函数生成器来执行此操作。但否则,你问的都是不可能的。

    现在,通过使用良好的散列函数并确保您的表很大,可以将发生冲突的可能性极低。您基本上需要一个足够大的表来使调用Birthday Paradox 的可能性足够低以适合您。然后你只需使用 SHA-1 的 n 位输出,2^n 将是你的表大小。

    我还想知道您是否可以使用Bloom filter 并使用实际的计数器而不是位。保留一个列表,列出你填充到布隆过滤器中的所有单词以及它们增加了哪些条目(每次都相同),你就有了一个巨大的线性函数,你可以解决它来获得所有个人再次倒数。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2011-02-21
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多