【题目】设计一种结构,在该结构中有如下三个功能:
intsert(key):将某个key加入到该结构,做到不重复加入。
delete(key):将原本在结构中的某个key移除.
getRandom():等概率随机返回结构中的任何一个key。、
【要求】Insert、Delect和getRandom方法的时间复杂度都是O(1)
insert和getRandom都没什么好说的,delete方法要注意下不要直接删除,需要把最后一条填到要删除的位值,然后边界收缩一下,否则形成空洞会影响getRandom
class RandomPool{
public:
hash_map<string,long long int> map1;
hash_map<long long int,string> map2;
int size;
RandomPool(){
size=0;
}
void add(string str){
map1.insert(pair<string,long long int>(str,size));
map2.insert(pair<long long int,string>(size,str));
size++;
}
string getRandom(){
default_random_engine e;
uniform_real_distribution<>u(0,size);
int index=u(e);
return map2[index];
}
void Delete(string str){
if(map1.find(str)!=map1.end()){
int deleteIndex=map1[str];
int lastIndex=--size;
string lastKey=map2[lastIndex];
map1.erase(str);
map2.erase(deleteIndex);
map1.insert(pair<string,long long int >(lastKey,deleteIndex));
map2.insert(pair<long long int,string >(deleteIndex,lastKey));
}
}
};