Bootstrap

设计RandomPool结构【代码实现】

**【题目】**设计一种结构,在该结构中有如下三个功能: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);
    }
}

;