映射的应用:哈希表,多维哈希表,多级映射实现字典

Posted aininot260

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了映射的应用:哈希表,多维哈希表,多级映射实现字典相关的知识,希望对你有一定的参考价值。

看了标题之后你会发现原来映射的功能竟然如此强劲

我们通常所用的map其实就是一棵红黑树,如果有平衡树问题能够用它来解决一定要用,不要手写了,因为红黑树的效率是非常棒的

先看几个定义:

map<string,int> m1;
map<string,map<string,int> >m2;
multiset<string> s1;
multimap<string,string> m3;

其中m1就是一个关联数组,为了模拟普通哈希表

(这里的所有的都是用红黑树实现的,如果你想用哈希表实现,请直接把map替换成hash_map,在空间足够的情况下)

m2是二维哈希表

s1在之前介绍集合的时候没有提到,这里再提一下,这是允许有重复元素的STL集合,学名多级集合

m3就是一个多级映射,允许一个x对应多个y的情况,这样便于实现字典

我们一个一个介绍,s1就不介绍了,和set的用法完全一致

首先是实现最简单的哈希表功能:

    string word;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>word;
        ++m1[word];
    }
    int m;
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>word;
        if(m1.count(word))
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }

我们可以看到完全不用手写哈希了,而且如果你想改哈希函数,那么替换成hash_map之后直接重载就好了,这里就不多介绍了

如果我们想删除一个键值对,也非常简单,按键删除就行了

    int l;
    cin>>l;
    for(int i=1;i<=l;i++)
    {
        cin>>word;
        m1.erase(word);
    }

如果你想枚举当前所有的映射情况的话:

    for(map<string,int>::iterator it=m1.begin();it!=m1.end();++it)
        cout<<"key: "<<it->first <<" value: "<<it->second<<endl;

知道iterator写后面就没问题了

然后介绍二维哈希表:

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        string t1,t2;
        int num;
        cin>>t1>>t2>>num;
        m2[t1][t2]+=num;
    }
    
        for(map<string,map<string,int> >::iterator it=m2.begin();it!=m2.end();it++)
        {
            cout<<it->first<<",";
            for(map<string,int>::iterator it_2=it->second.begin();it_2!=it->second.end();it_2++)
            {
                cout<<it_2->first<<":"<<it_2->second<<endl;
            }
        }

记住这个for循环的操作还是很有必要的,用的时候记得替换成hash_map,不然就是树套树了

如果你想实现字典的话,要注意的是多级映射不能直接用下标那么赋值,需要Insert的是pair类型的变量

    typedef pair<string,string> dic;
    dic d1("smart","klug");
    dic d2("clever","raffiniert");
    dic d3("smart","seltsam");
    m3.insert(d1);
    m3.insert(d2);
    m3.insert(d3);
    word="smart";
    for(multimap<string,string>::iterator pos=m3.lower_bound(word);pos!=m3.upper_bound(word);++pos)
    {
        cout<<pos->second<<endl;
    }

这样就可以,下面贴出来完整的代码:

 1 #include<iostream>
 2 #include<map>
 3 #include<string> 
 4 #include<iterator>
 5 #include<set>
 6 using namespace std;
 7 map<string,int> m1;
 8 map<string,map<string,int> >m2;
 9 multiset<string> s1;
10 multimap<string,string> m3;
11 int main()
12 {
13     string word;
14     int n;
15     cin>>n;
16     for(int i=1;i<=n;i++)
17     {
18         cin>>word;
19         ++m1[word];
20     }
21     int m;
22     cin>>m;
23     for(int i=1;i<=m;i++)
24     {
25         cin>>word;
26         if(m1.count(word))
27             cout<<"Yes"<<endl;
28         else
29             cout<<"No"<<endl;
30     }
31     int l;
32     cin>>l;
33     for(int i=1;i<=l;i++)
34     {
35         cin>>word;
36         m1.erase(word);
37     }
38     
39     for(map<string,int>::iterator it=m1.begin();it!=m1.end();++it)
40         cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
41     cin>>n;
42     for(int i=1;i<=n;i++)
43     {
44         string t1,t2;
45         int num;
46         cin>>t1>>t2>>num;
47         m2[t1][t2]+=num;
48     }
49     
50         for(map<string,map<string,int> >::iterator it=m2.begin();it!=m2.end();it++)
51         {
52             cout<<it->first<<",";
53             for(map<string,int>::iterator it_2=it->second.begin();it_2!=it->second.end();it_2++)
54             {
55                 cout<<it_2->first<<":"<<it_2->second<<endl;
56             }
57         }
58     typedef pair<string,string> dic;
59     dic d1("smart","klug");
60     dic d2("clever","raffiniert");
61     dic d3("smart","seltsam");
62     m3.insert(d1);
63     m3.insert(d2);
64     m3.insert(d3);
65     word="smart";
66     for(multimap<string,string>::iterator pos=m3.lower_bound(word);pos!=m3.upper_bound(word);++pos)
67     {
68         cout<<pos->second<<endl;
69     }
70     return 0;
71 }

当你会用这些东西之后,很多以前做不到的东西,就都十分简单了

以上是关于映射的应用:哈希表,多维哈希表,多级映射实现字典的主要内容,如果未能解决你的问题,请参考以下文章

哈希表——swift字典的实现原理

超高性能 C/C++ 哈希映射(表、字典)[关闭]

Python字典_术语

我如何将 djb2 映射到哈希表?

没有动态分配的哈希表/映射实现

python 字典为啥这么快