什么散列方法在标准无序容器中实现?

时间:2015-07-07 11:01:03

标签: c++ data-structures hashtable

由于语言标准很少要求实现方法,我想知道C ++标准库实现(libc ++,libstdc ++和dinkumware)使用的真实世界哈希方法是什么。

如果不清楚,我希望答案是这样的方法:

  • 使用链接哈希
  • 分区/乘法哈希
  • Universal hashing
  • 完美散列(静态,动态)
  • 使用开放式寻址进行哈希(线性/二次探测或双重哈希)
  • Robin-Hood哈希
  • 布隆过滤器
  • Cuckoo哈希

了解为什么选择特定方法而不是其他方法也是一件好事。

1 个答案:

答案 0 :(得分:6)

  • libstdc ++:链接,只有两个表的大小,默认(如果它是可配置的)重新加载的加载阈值是1.0,桶都是单独的分配。过时。我不知道现状。
  • Rust:Robin Hood,rehashing的默认负载阈值为0.9(开放寻址,BTW太多)
  • Go:表格插槽指向5(7?)个插槽的“bins”,不知道如果bin已满,会发生什么情况,AFAIR会以vector / ArrayList方式增长
  • Java:链接,只有两个表的大小,默认负载阈值是0.75(可配置),桶(称为条目)都是单独的分配。在Java的最新版本中,超过某个阈值,链被更改为二叉搜索树。
  • C#:chaining,buckets是从一个扁平的桶结构阵列中分配的。如果此数组已满,则会以vector / ArrayList方式对其进行重新处理(我认为是表格)。
  • Python:开放式寻址,具有自己独特的冲突解决方案(不是很幸运,恕我直言),只有两个表的大小,重新加载的负载阈值是0.666 ..(好)。但是,插槽数据在一个单独的结构数组中(如在C#中),i。即哈希表操作触摸至少两个不同的随机存储器位置(在表中和插槽数据的数组中)

如果描述中遗漏了一些要点,并不意味着它们缺席,这意味着我不知道/记住细节。