题目来源
题目描述
哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。
现在想加加一个setAll功能,就是把所有记录的val都设为统一的值,要求是时间复杂度也为O(1)。
应该如何实现呢?
题目解析
加入一个时间戳结构。步骤如下:
- 把每一个记录都加上一个时间,标记每条记录是如何建立的
- 设置一个setAll记录也加上一个时间,标记setAll记录建立的时间
- 查询记录时,如果某条记录早于setAll记录的时间,说明setAll是最新的数据,返回setAll记录的值;否则,说明该条记录是最新的数据,返回本条记录
实现:
class HashMap{
struct MyValue{
int value;
long time;
};
std::unordered_map<int, MyValue> hash;
long clock;
MyValue record;
public:
HashMap() : clock(0){
record.time = -1; //一开始是为-1,表示没有进行过setAll
}
bool containesKey(int key){
return hash.count(key) == 1;
}
void put(int key, int val){
hash[key] = {val, this->clock++}; //放入当前记录的时间是clock,然后clock++
}
void setAll(int val){
record.value = val;
record.time = this->clock++;
}
int get(int key){
if(containesKey(key)){
MyValue val = hash[key];
if(val.time > record.time){
return val.value;
}else{
return record.value;
}
}
return -1;
}
};
int main() {
int N;
int opt;
int x; int y;
HashMap hashMap;
std::cin >> N;
while (N--){
std::cin >> opt;
if(opt == 1){
std::cin >> x >> y;
hashMap.put(x, y);
}else if(opt == 2){
std::cin >> x;
std::cout << hashMap.get(x);
}else if(opt == 3){
std::cin >> x;
hashMap.setAll(x);
}
}
return 0;
}