Algorithm 跟踪数字状态的算法

Algorithm 跟踪数字状态的算法,algorithm,system-design,Algorithm,System Design,要设计API get(),它将返回随机数,并且该数字不应重复,这意味着它始终是唯一的 put(randomvalue),它将从get()中放回生成的随机数,如果放回,get()函数可以将此数重新用作输出 它必须是高效的,没有太多的资源被高度利用 有没有办法实现这个算法?不建议使用hashmap,因为如果此API生成数十亿个请求,保存生成的随机数仍然会占用太多空间 我无法计算出这个算法,请帮助给出一个线索,提前谢谢 如果没有额外的空间,我想不出任何解决方案。对于空格,一种选择是使用TreeMap,

要设计API

  • get()
    ,它将返回随机数,并且该数字不应重复,这意味着它始终是唯一的
  • put(randomvalue)
    ,它将从
    get()
    中放回生成的随机数,如果放回,
    get()
    函数可以将此数重新用作输出
  • 它必须是高效的,没有太多的资源被高度利用

    有没有办法实现这个算法?不建议使用hashmap,因为如果此API生成数十亿个请求,保存生成的随机数仍然会占用太多空间


    我无法计算出这个算法,请帮助给出一个线索,提前谢谢

    如果没有额外的空间,我想不出任何解决方案。对于空格,一种选择是使用TreeMap,首先将TreeMap中的所有元素添加为false。访问元素时,将其标记为true。与put类似,将值更改为false。 下面的代码片段

    public class RandomNumber {
    
    public static final int SIZE = 100000;
    public static Random rand;
    public static TreeMap<Integer, Boolean> treeMap;
    
    public RandomNumber() {
        rand = new Random();
        treeMap = new TreeMap<>();
    }
    
    static public int getRandom() {
        while (true) {
            int random = rand.nextInt(SIZE);
            if (!treeMap.get(random)) {
                treeMap.put(random, true);
                return random;
            }
        }
    }
    
    static public void putRandom(int number) {
        treeMap.put(number, false);
    }
    }
    
    公共类随机数{
    公共静态最终整数大小=100000;
    公共静态随机变量;
    公共静态树映射树映射;
    公众号码(){
    rand=新随机数();
    treeMap=新的treeMap();
    }
    静态公共int getRandom(){
    while(true){
    int random=rand.nextInt(大小);
    如果(!treeMap.get(random)){
    树映射put(随机,真);
    返回随机;
    }
    }
    }
    静态公共随机(整数){
    树映射put(数字,假);
    }
    }
    
    您使用的是哪种语言?您的努力是什么?如果您不使用映射或集合,如何确保一个数字不会生成两次?您可以尝试存储已在中选择的随机数(来自javadoc:
    此实现为基本操作(添加、删除和包含)提供有保证的日志(n)时间成本(
    )。因此,它比
    HashMap
    更节省时间和空间。这是一个考试题,还是类似的问题?出于实际目的,我看不出有什么理由需要
    put()
    函数。只需忽略已过时的数字。使用句点为2^64的。即使每秒有10亿个
    get()。
    put()
    请求是一个请求,请忽略它。你“可以重用这个号码”的说法并不意味着你“必须重用这个号码”。