【问题标题】:C++ efficient way to map a group of integer variables to values将一组整数变量映射到值的 C++ 有效方法
【发布时间】:2016-12-08 07:34:05
【问题描述】:

为了将一组整数变量映射到值(假设我有 a1, a2, a3, a4, a5, a6 来确定一个值 v 这是一个像 map<tuple<int, int, int, int, int, int>,VALUE_TYPE>map<struct{int, int, int, int, int, int},VALUE_TYPE> 这样的映射),我们可以用

  1. 以整数为键的字符串
  2. 元组作为键
  3. 结构或类作为键
  4. 等等...

我对这些方法的性能很好奇。在我的情况下,

  1. 少插入,多查询
  2. 整数键的范围广泛但分布稀疏
  3. 时间更关心我,记忆更少
  4. 地图访问是最消耗资源的部分,因此即使是 10% 的加速也很重要

问题是哪种方式在我的情况下表现更好?
如果选择了结构或类键,是否有任何技巧可以使比较器更有效?
unordered_map 是否更适合这种情况?我应该如何计算键的哈希?

对于解决方案的任何建议或评论,我将不胜感激。也欢迎讨论更一般的情况。提前致谢。

【问题讨论】:

  • 将变量映射到值?只需将值存储在其中。
  • 一个 std::map 可以将整数映射到值。为什么要考虑字符串、元组或自定义类?将您的整数放入地图中。
  • Key 是多个整数,如 [x, y, z] 如果使用 3 个变量来确定值。我已经编辑了问题以消除歧义。@nvoigt @storyteller
  • 在您的整数变量组(a1, a2, a3, a4, a5, a6) 中,每个变量ai 的位置是否重要? (1, 2, 3, 4, 5, 6)(3, 2, 4, 1, 6, 5) 一样吗?
  • 订单很重要。 @sameerkn

标签: c++ dictionary std stdmap c++-standard-library


【解决方案1】:

基本上:实现不同的解决方案,编写性能测试程序并进行测量!

肯定的:

  • 将整数用作整数将比将它们转换为字符串更快。
  • 结构(或类)应该比元组更快(我的经验)。
  • 也可以试试std::array<> 容器(已经提供了比较运算符)。
  • 哈希映射 (std::unordered_map<>) 比排序映射 (std::map<>) 更快,但当然只能在不需要使用部分键进行搜索时使用。

【讨论】:

  • 另外:std::unordered_map 对于长键可能不如std::map 有效:< 的两个数组的比较通常只使用几个第一个元素,而哈希的计算要多得多昂贵的。例如,在我的机器上,std::array<int, 10000>std::map 的 10 000 次插入比 std::unordered_map 快 3 倍。但是,这可能不是主题启动器的情况。
  • 在我看来,使用数组作为键类型是一个绝妙的主意。即使我不是那个问的人,也谢谢你。
  • 如果array 中的元素顺序很重要,那么使用std::array 会很好。
  • 感谢您的建议,我同意使用 std::array 作为键。
【解决方案2】:

此外,如果您的数字相对较小并且密钥中有很多,请考虑实施trie 数据结构。就像std::unordered_map 一样,这将允许您在O(l) 时间访问元素,其中l 是键的长度,而且它还允许您迭代以升序抛出所有值并通过a 找到一个值部分键。这里的问题是您的内存消耗将与字母大小成正比(当然,您可以将内部边缘存储在一些复杂的数据结构中,但这会对性能产生负面影响)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多