【问题标题】:Using a map to check if an id exists使用地图检查 id 是否存在
【发布时间】:2016-07-29 08:00:02
【问题描述】:

我正在实施一种锁定机制,为此我需要快速查找给定 ID 是否已被锁定。现在我正在考虑使用地图,我想知道是否有更好的结构。基本上我真的不需要地图,因为没有完成映射。但是,如果我要使用向量,我将不得不进行线性搜索,这对于许多条目来说会变得很昂贵。

现在我想知道是否有某种结构可以让我进行类似的快速查找,而无需存储 etra 数据的额外开销。

i.E.

std::map<IdType, bool> locked;

// Prevent deadlock by checking if this thread already locked. Otherwise
// it can pass through.
if(locked.find(Id) != locked.end())
    lock();

如您所见,我并不真正需要映射值。我知道对于std::vector,使用bool,它被压缩为比特。现在我想知道我是否浪费了大量内存来维护这些布尔值,而我什至不需要它们。 char 会更好还是其他一些结构可以让我在没有额外数据的情况下进行密钥查找?

【问题讨论】:

  • 如果不需要关联性,使用set 怎么样?在这之间,您也应该使用vector 对其进行分析。如果您的线性搜索性能优于 set::find,请不要感到惊讶
  • 这应该在一些内存受限的硬件上运行吗?如果要在 PC 上运行,请不要费心优化几个字节,您的检查中也存在竞争条件
  • @slawekwin safaribooksonline.com/library/view/c-coding-standards/… 这适用于这里:编写 std::set 而不是 std::map 可以更好地以程序员零成本捕获代码的意图,而不会让未来的程序员想知道什么是未使用的值可能用于。
  • @Arunmu,我曾经分析过这样一个案例,发现对于低于 10 左右的项目数,向量更快。但是,我需要数百个 ID,所以我知道一棵树更快。我猜set 是我要找的。谢谢!
  • @H.Guijt 我并不是说 map 是这里的最佳选择,我是说过早和微优化不是一件好事。然而,我确实同意可读和可理解的代码是对使用的结构三思而后行的好理由,尽管这个问题与此无关。

标签: c++ dictionary lookup-tables


【解决方案1】:

如果你有 C++0x,你可以使用std::unordered_set,平均查找是 O(1)

来自 cppreference.com 文档(重点是我的):

...搜索、插入和删除具有平均恒定时间复杂度

在内部,元素不按任何特定顺序排序,而是组织成桶。将元素放入哪个桶完全取决于其值的哈希值。这允许快速访问单个元素,因为一旦计算了哈希值,它就会指向元素所在的确切存储桶。

如果你没有 C++0x,unordered_set 应该在TR1

#include <tr1/unordered_set>
std::tr1::unordered_set<IdType> locked;

你也可以使用unordered_map,但我猜你代码的读者很难理解映射值的用途。


P.S.:记住Rules Of Optimization ;)

【讨论】:

  • 如果没有,请改用std::set - 查找时间为 O(log n)。
  • @MartinBonner 或使用 TR1 中的unordered_set
【解决方案2】:

您可以在以下情况下使用std::vector&lt;bool&gt;boost::dynamic_bitset

  1. IdType是整数类型

  2. 所有 id 值都适合一个足够短的范围。内存使用量将为(length of that range)/8,这可能比包含该范围内所有元素的std::unordered_set&lt;int&gt;std::set&lt;int&gt; 消耗的内存少几个数量级。

  3. 您不必迭代集合中的元素(只需插入/删除/检查是否存在),否则迭代很少发生,并且性能重点是插入/删除/包含测试操作。

在这种情况下,动态位集是一种更合适的数据结构(速度更快,内存效率更高)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多