【问题标题】:unordered_map vs vector + custom hashing for small number of elementsunordered_map vs vector + 少量元素的自定义散列
【发布时间】:2016-09-26 23:36:29
【问题描述】:

当前我有一个嵌套的哈希图。内部映射键的范围非常大,但外部映射键只有 10 个不同的可能字符串。

unordered_map<string, unordered_map<int, list<string>>> nestedHashMap;

切换到我会不会更有效率

vector<unordered_map<int, list<string>>> 

并拥有自己的哈希函数

static int hashFunc(string stringToBeHashed){
        switch(stringToBeHashed){
            case "example1":
                return 0;
            .
            .
            .
            case "example10":
                return 9;
            default:
                return -1;
        }
    }

在每次查找之前做我自己的散列?在空间复杂度方面,由于 unordered_map 是基于节点的容器,我认为这种向量方法将为我节省一些 unordered_map 所需的每个节点内存。另外,我假设即使键是 int,内部哈希图也能保证最快的检索。密钥的范围很大,所以我认为在这里使用向量不会提高性能。正确的?任何 cmets/提示将不胜感激。

内存在这里不是问题。

【问题讨论】:

  • 尝试各种变体并衡量它们的性能。然后回来告诉其他人,这样我们都可以学习。
  • 当您使用它时,请考虑使用vector&lt;string&gt; 代替list&lt;string&gt;。结果可能会令人震惊和沮丧。

标签: c++ vector hashmap unordered-map


【解决方案1】:

内部地图键的范围非常大

这正是 hashmap 在这里是正确选择的原因

但外部映射键只有 10 个不同的可能字符串

你误用了哈希图。
将其替换为树(std::map)。
(是的,如果您想自己编写查找函数,可以选择std::vector
顺便说一句,您不应该担心空间复杂度当你只有 10 个元素时的主题:) 更新:
您的外部容器的目的基本上是存储 10 个元素。
这是一个很小的数字,所以理论上你可以选择任何
你想要的容器(数组、树、哈希表)。
所以你应该选择最合适的。
选择是:

  • std::map: 编写代码最少,自动对元素进行排序
  • std::vector:空间的最佳利用,但是你应该自己写一个查找函数
  • std::hashmap:从大炮射出麻雀。您不需要它提供的 99% 的功能。这个容器和你的用途不同

【讨论】:

  • 10 个元素,作为外部哈希图的 10 个可能元素。我正在处理散列到 10 个不同位置的数百万个数据,然后内部的 hashmap 是事情变得相当大的地方。但是在有 10 个可能的映射的情况下,为什么我更喜欢 map 而不是 unordered_map?
  • 有道理。谢谢!
【解决方案2】:

如果有人想知道,请使用

进行快速代码分析
vector<unordered_map<int, list<string>>
map<string, unordered_map<int, list<string>>
unordered_map<string, vector<unordered_map<int, list<string>>

vector 的平均时间最快,其次是 unordered_map,其次是 map。

【讨论】:

  • 如果它说差异是 2% 还是 2000%,这个答案会更加有用和有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2014-10-04
  • 2013-01-30
相关资源
最近更新 更多