Unordered_map vs vector +针对少量元素的自定义散列

unordered_map vs vector + custom hashing for small number of elements

本文关键字:元素 自定义 map vs vector Unordered      更新时间:2023-10-16

目前我有一个嵌套的hashmap。内部映射键有很大的范围,但外部映射键只有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。键有一个很大的范围,所以我不认为在这里使用向量会提高性能。对吧?任何评论/提示将不胜感激。

这里内存不是问题。

内部映射键的范围非常大

这就是为什么hashmap在这里是一个正确的选择

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

你就误用了hashmap。
用树(std::map)代替。
(是的,如果你想自己写一个查找函数,你可以选择std::vector)
BTW,当你只有10个元素时,你不应该关心空间复杂性的话题:)更新:
外部容器的目的基本上是存储10个元素。
这是一个很小的数字,所以理论上你可以选择任何
你想要的容器(数组,树,哈希表)。
所以你应该选择最合适的。
选择是:

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

如果有人想知道,用

做一个快速的代码分析。
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。