Java 设计RandomPool结构

题目

设计一种结构,在该结构中有如下三个功能:

  1. insert(key):将某个key加入到该结构,做到不重复加入。
  2. delete(key):将原本在结构中的某个key移除。
  3. getRandom(): 等概率随机返回结构中的任何一个key。

【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1)

思路

由于要求时间复杂度为0(1),因此考虑使用HashMap

  1. 申明两个hashmap进行存储,分别对应map1、map2,同时维护一个size表示大小;
  2. insert方法,往map1中以<Key,Size>形式插入,往map2中以<Size,Key>形式插入
  3. getRandom方法时,利用Math.random函数随机取【0~size】上一个下标,返回map2中对应的K;
  4. delete方法时,将map1、map2 【size-1】位置数据移动到Key位置后,将尾端数据删除,保证数据连续性,避免出现空洞,导致getRandom时不等概率;

代码实现

public class RandomPool<K> {
    private HashMap<K, Integer> keyToIndexMap;
    private HashMap<Integer, K> indexToKeyMap;
    private int size;

    public RandomPool() {
        keyToIndexMap = new HashMap<>();
        indexToKeyMap = new HashMap<>();
        size = 0;
    }

    /**
     * 插入方法
     *
     * @param key
     */
    public void insert(K key) {
        if (keyToIndexMap.containsKey(key)) {
            return;
        }
        keyToIndexMap.put(key, size);
        indexToKeyMap.put(size, key);
        size++;
    }

    /**
     * 随机返回
     */
    public K getRandom() {
        if (size == 0) {
            return null;
        }
        int index = (int) (Math.random() * size);
        return indexToKeyMap.get(index);
    }


    /**
     * 删除方法
     */
    public void delete(K key) {
        if (!keyToIndexMap.containsKey(key)) {
            return;
        }
        //将最后位置的key交换到删除位置的key,移除最后位置key,保证index连续
        int deleteIndex = keyToIndexMap.get(key);
        int lastIndex = --size;
        K lastKey = indexToKeyMap.get(lastIndex);
        keyToIndexMap.put(lastKey, deleteIndex);
        indexToKeyMap.put(deleteIndex, lastKey);
        keyToIndexMap.remove(key);
        indexToKeyMap.remove(lastIndex);
    }


测试用例

  public static void main(String[] args) {
        RandomPool<String> randomPool = new RandomPool<>();
        randomPool.insert("C");
        randomPool.insert("Q");
        randomPool.insert("X");
        System.out.println(randomPool.getRandom());
        System.out.println(randomPool.getRandom());
        System.out.println(randomPool.getRandom());
        System.out.println("----------------------");
        randomPool.delete("Q");

        System.out.println(randomPool.getRandom());
        System.out.println(randomPool.getRandom());
        System.out.println(randomPool.getRandom());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值