Leetcode13题unordered_map的使用

  1. map

内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。
  
2. hash_map

基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。

插入操作:得到key -> 通过hash函数得到hash值 -> 得到桶号(hash值对桶数求模) -> 存放key和value在桶内
取值过程:得到key -> 通过hash函数得到hash值 -> 得到桶号(hash值对桶数求模) -> 比较桶内元素与key是否相等 -> 取出相等纪录的value
当每个桶内只有一个元素时,查找时只进行一次比较,当很多桶都没有值时,查询更快。
用户可以指定自己的hash函数与比较函数。
  1. unordered_map

C++ 11标准中加入了unordered系列的容器。unordered_map记录元素的hash值,根据hash值判断元素是否相同。map相当于java中的TreeMap,unordered_map相当于HashMap。无论从查找、插入上来说,unordered_map的效率都优于hash_map,更优于map;而空间复杂度方面,hash_map最低,unordered_map次之,map最大。

对于STL里的map容器,count方法与find方法,都可以用来判断一个key是否出现,count统计的是key出现的次数,因此只能为0/1,而find基于迭代器实现,以mp.end()判断是否找到要求的key。
为什么要使用unordered_map代替hash_map?
因为标准化的推进,unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
另外,使用之后,感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
gxx需要添加编译选项:–std=gnu++0x或者–std=c++0x

#include 
#include 
#include 
using namespace std;
class Solution {
public:
    int romanToInt(string s) {
    unordered_map<string,int > m={{"I",1},{"IV",3},{"V",5},{"IX",8},{"X", 10}, {"XL", 30}, {"XC", 80}, {"L", 50}, {"C", 100}, {"CD", 300}, {"CM", 800}, {"D", 500}, {"M", 1000}};
    int r=m[s.substr(0,1)];
    for (int i=1 ;i<s.size() ;i++){
        string one = s.substr(i, 1);
        string two = s.substr (i-1,2);
        r+=m[two]?m[two]:m[one];
    }
    cout<<r<<endl;
    return r;

    }
    int romanToInt2 (string s){
       /* unordered_mapm2={
                {"I",1},
                {"V",5},
                {"X",10},
                {"L",100},
                {"C",1000},
                {"D" ,500},
                {"M" ,1000}};
        int r=0;
        for (int i=s.size();i>0;i--){
            string bef=s.substr(i-1,1);
            if (i+1 m2[bef]) {
                    r -= m2[bef];
                } else r += m2[bef];
            }
*/
        if(s.empty()) return 0;
        unordered_map<char,int> hash;
        hash['I'] = 1;
        hash['V'] = 5;
        hash['X'] = 10;
        hash['L'] = 50;
        hash['C'] = 100;
        hash['D'] = 500;
        hash['M'] = 1000;

        int x=0;
        for(int i=s.size();i>=0;--i){
            if(i+1<s.size() && hash[s[i+1]] > hash[s[i]]){
                x -= hash[s[i]];
            }else x += hash[s[i]];
        }
        cout<<x;
        return x;
    }
};
int main() {
    Solution S;
    S.romanToInt2("IV");
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

你可能感兴趣的:(Leetcode13题unordered_map的使用)