Leetcode setAll的哈希表

问题描述

哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。

对于hash其底层采取链地址法的方式作为物理存储,即通过key取模运算定位到所在的bucket然后在bucket中进行操作。现需要具备O(1)时间的setALL操作。

在这里插入图片描述

具体的做法是每一次对数据的改动设定时间戳,标记当前数据的上一次修改时间。

具体的做法为:
当set的时候:

设定map<int,node> node的数据时间戳为最新的时间

当get的时候:

若node的时间戳比上一次setAll时间更早,那么返回setALL的值
若node的时间戳比上一次setAll时间更晚,那么返回node的值

当setAll的时候:

不去修改每一个node的值,而是记录下时间和setAll的数值

struct node
{
    int value;
    int time;
    node(){value=0;time=INT_MIN;}
    node(int _v,int _t)
    {
        value=_v;
        time=_t;
    }
};
int main()
{
    int n;
    int opt;
    cin>>n;
    unordered_map<int,node> mp;
    node all;
    for(int i=0;i<n;i++)
    {
        cin>>opt;
        if(opt==1)
        {
            int x,y;
            cin>>x>>y;
            mp[x]=node(y,i);//(x,y)的改动时间为i
        }
        else if(opt==2)
        {
            int x;
            cin>>x;
            if(mp.find(x)==mp.end())  //并没有该值
            {
                cout<<-1<<endl;
            }
            else
            {
                if(all.time>mp[x].time)  //如果setALL的时间更晚
                {
                    cout<<all.value<<endl;
                }
                else
                {
                    cout<<mp[x].value<<endl;
                }
            }
        }
        else
        {
            int y;
            cin>>y;
            all.value=y;
            all.time=i;  //setALL的时间戳为i 设定的值为y  
        }
    }
    

}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页