**【题目】**设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。
delete(key):将原本在结构中的某个key移除。getRandom():等概率随机返回结构中的任何一个key。
**【要求】**Insert、delete和getRandom方法的时间复杂度都是O(1)
思路:要求增删时间复杂度均为O(1),很容易想到哈希表,但哈希表不具备严格等概率返回结构中的任何一个key。本题不需要定制哈希表。而是使用两张哈希表。
使用key-index和index-key两张哈希表,需要indexKey表来根据random函数得出的位置随机删除key,需要keyIndex来 获取删除的key的位置,并且把最后一个位置的元素填充到这个位置。
import java.util.HashMap;
public class RandomPool<K> {
// 需要indexKey表来随机删除key
private HashMap<Integer,K> indexKey;
// 需要keyIndex来 获取删除的key的位置,并且把最后一个位置的元素填充到这个位置
private HashMap<K, Integer> keyIndex;
//记录最后一个元素所在的位置
private int size;
public RandomPool(){
indexKey=new HashMap<>();
keyIndex=new HashMap<>();
this.size=0;
}
public void insertKey(K key){
if (!keyIndex.containsKey(key)){
keyIndex.put(key,size);
indexKey.put(size++,key);
}
}
public void deleteKey(K key){
if (keyIndex.containsKey(key)){
int deleteIndex=keyIndex.get(key);
K lastKey=indexKey.get(size);
//将最后一个元素 插入 到要删除的元素的位置
keyIndex.put(lastKey,deleteIndex);
indexKey.put(deleteIndex,lastKey);
// 删除要删除的元素【keyIndex哈希表中删除要删除的key,
// indexKey表中已经用最后一个元素覆盖了要删除的元素,因此删除最后一个元素就行了】
keyIndex.remove(key);
indexKey.remove(--size);
}
}
public K getRandomKey(){
if (size==0){
return null;
}
int randomIndex=(int)(Math.random()*size);
return indexKey.get(randomIndex);
}
}