【问题标题】:What storage policy is being used in the bucket of boost::intrusive::unordered_set?boost::intrusive::unordered_set的bucket中使用了什么存储策略?
【发布时间】:2012-09-30 05:37:49
【问题描述】:

我知道提升存储桶在内部是作为点赞列表实现的,对吧?至少在http://www.boost.org/doc/libs/1_50_0/doc/html/unordered/buckets.html看来是这样的。

我的问题是,这些桶中元素的顺序是什么?如果它们是无序的,是否有任何方法可以对这些存储桶中的项目顺序强制执行 MRU(最近使用的)或其他一些向前移动的启发式方法?

编辑:我理解反对在存储桶内强制执行 MRU 的论点。但在我的具体情况下,我知道,执行 MRU [或什至具有后进先服务] 将优于负载因子较小的情况。问题是,顺序是什么?有没有一种简单的方法来强制执行至少后插入先出和服务。

【问题讨论】:

标签: c++ performance boost hashmap unordered-map


【解决方案1】:

存储桶未排序。桶未排序的原因令人信服。虽然我相信您已经意识到这一点,但我将列举几个来帮助该网站的未来访问者。

  1. 哈希映射类型的数据结构不应使迭代器无效,除非插入导致重新哈希
  2. 为了保持快速查找,存储桶应该很小;理想情况下,每个桶应该只有一个元素。

在我看来,强制执行存储桶的 MRU 排序似乎首先违背了哈希映射类型结构的整个想法。这个想法是保持桶小,这样平均来说,桶中的第一个项目就是你真正要找的那个。

因此,我怀疑是否有任何内置方法可以在存储桶中强制执行 MRU 排序。我建议改为调整您的哈希算法,也许会降低您的最大负载因子。

【讨论】:

  • 我对哈希表的访问具有强大的 MRU 和位置统计信息。所以我真的更喜欢 MRU 友好的哈希集。
  • 不幸的是,您可能必须创建自己的。我知道没有提供您正在寻找的哈希映射实现。
  • 谢谢!你知道内部使用的是什么订单吗?后进先出?还是先进先出?我在哪里可以查到?我尝试了 bucket_type、bucket_traits,但相关文件却让我望而却步……
  • 我不能肯定地说,但由于哈希映射插入不应该使迭代器无效,除非有重新哈希,我猜他们一定是在做push_back
  • 2 约翰。感谢您的 cmets 和出色的建议。我会在几天内接受你的回答,我的 50/50...
【解决方案2】:

经过一些黑客攻击,回答我自己的问题。

Boost 存储桶实现位于:http://www.boost.org/doc/libs/1_51_0/boost/unordered/detail/buckets.hpp

虽然这是特定于实现的并且可能随时更改,但目前,对于侵入性 unordered_set,桶遍历 [in .find()] 从最后插入的项目开始

例如,如果您要声明一个包含 1000 个桶的 unordered_set:

class A : public unordered_set_base_hook<> { ... }
unordered_set<A>::bucket_type buckets[1000];
unordered_set<A> a(unordered_set<A>::bucket_traits(buckets, 1000));

并插入 10000 个随机抽样的项目 [负载因子 10 高得离谱],最后插入的项目将有更快的 [按数量级] 访问 [查找] 时间

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多