利用哈希函数设计RandomPoll实现增删查
1.题目
设计一种结构,在该结构中有三个功能:
- insert(key):将某个key加入到该结构,做到不重复加入。
- delete(key):将原本在结构中的某个key移除。
- getRandom():等概率随机返回结构中的任何一个key。
**要求:**这三个功能的时间复杂度都为O(1)
2.算法思路
建立两张哈希表
map1 | map2 | |
---|---|---|
key | String | Interger |
value | Integer | String |
- 对于insert函数,只需要先判断哈希表中是否含有该key,若无,调用HashMap的put方法即可。
- 对于delete函数,删除了哈希表中的某一键值对后,只需要将最后一组键值对补充到删除的缺口上即可。
注: HashMap的put方法,若以前已包含了键值对,则替换圆键值对。 - getRandom函数,(int)Math.random()*mapSize可以在0~size-1中随机生成一个数。
3.算法代码
public static class RandomPool{
HashMap<String,Integer> map1;
HashMap<Integer,String> map2;
int mapSize;
public RandomPool(){
map1 = new HashMap<String,Integer>();
map2 = new HashMap<Integer,String>();
mapSize = 0;
}
public boolean insert(String str){
if(!map1.containsKey(str)){
map1.put(str,++mapSize);
map2.put(mapSize,str);
return true;
}
return false;
}
public void delete(String str){
if(map1.containsKey(str)){
int deleteIndex = map1.get(str);
int lastIndex = --mapSize;
map1.put(map2.get(lastIndex),deleteIndex); //map1中用最后一组键值对填充被删掉键值对的位置
map2.put(deleteIndex,map2.get(lastIndex)); map1中用最后一组键值对填充被删掉键值对的位置
map1.remove(str);
map2.remove(lastIndex); //把最后一组键值对删除,因为该键值对已经拿去填充了
}
}
public String getRandom(){
return map2.get((int)Math.random()*mapSize);
}
}