设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。 getRandom():等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1)

解题思路:创建hashmap,一个存K,数字,另一个存数字,K,每当插入元素时,将元素非别对应插入两个hashmap中目的是能够方变随机查找。
public class RandomPool {    public static class Pool<K>{        private HashMap<K,Integer> keyIndexMap;        private HashMap<Integer,K> indexKeyMap;        private int size;        public Pool(){            keyIndexMap = new HashMap<>();            indexKeyMap = new HashMap<>();            size = 0;        }        public void insert(K key){            if(!keyIndexMap.containsKey(key)){                 keyIndexMap.put(key,size);                indexKeyMap.put(size++,key);            }

}        // A 0 0 A        // B 1 1 B        //C 2 2 C        //D 3 3 D        //先确定删除的索引,以及最后面的值,把最后面的值补充到删除的地方        //之后删除开始应该删除的        public void delete(K key){            if(keyIndexMap.containsKey(key)){                int deleteIndex = keyIndexMap.get(key);                int lastIndex = --size;                K lastKey = indexKeyMap.get(lastIndex);                keyIndexMap.put(lastKey,deleteIndex);                indexKeyMap.put(deleteIndex,lastKey);                keyIndexMap.remove(key);                indexKeyMap.remove(lastIndex);            }        }        public K random(){            if(size==0){                return null;            }            int num = (int) (Math.random()*size);            return indexKeyMap.get(num);        }    }}总结:多积累。

原文地址:https://www.cnblogs.com/liuwentao/p/9404305.html

时间: 2024-10-08 18:43:58

设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。 getRandom():等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1)的相关文章

字节序转换与结构体位域(bit field)值的读取 Part 2 - 深入理解字节序和结构体位域存储方式

上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比

python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。

python有一个比较有意思的内置函数-----zip,可以把传入的两组list进行一个组合变形,再输出子元素为tuple的list,不过变形的方式比较抽象. 举个例子: A=[1,2,3,4,5,6] B=['a','b','c','d'] v1=zip(A,B) v1的结果为: [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')] 比较直观的理解就是,A和B是两道拉链上的扣子,生成的list的子tuple,每一组tuple就是一对扣好了的扣子,并且从每组list的

【C语言】用结构体数组实现:有三个候选人,每个选民只能选一个人,编写一个选票程序,最终输出候选人的票数

//用结构体数组实现:有三个候选人,每个选民只能选一个人,编写一个选票程序,最终输出候选人的票数(假设有十个选民) #include <stdio.h> #include <stdio.h> struct Person //声明结构体 { char name[20]; int count; }leader[3]={"li",0,"zhang",0,"sun",0}; //定义结构体数组并初值化 int main() { i

设计一种100%可用性服务的架构--适用于任何系统(B/S,C/S)[中英文版本]

设计一种100%可用性服务的架构--适用于任何系统(B/S,C/S)[中英文版本] -- How to design an architecture which have 100 percent availability service? 版权所有,转载请注明出处http://blog.csdn.net/yangzhenping,谢谢! 本篇原创非译文,有需要设计和部署这种架构的,请私信我,谢谢! 最近一直在想怎样设计一种100%可用性的服务,于是有了最初的版本: 如上图,有多个备份的网页服务器

常规功能和模块自定义系统(cfcmms)—006Extjs的目录结构和mvvm介绍

常规功能和模块自定义系统(cfcmms)-006Extjs的目录结构和mvvm介绍 在eclipse中打开cfcmms项目,展开后目录结构如下图所示,图中简单的注释了一下各个目录和文件的说明.由于extjs6默认使用的是mvvm架构,如果想要使用extjs的MVC,需要在app下加入controller目录,把所有的控制器都放在此目录之下即可. 打开浏览器,输入网址 http://localhost:1841/,则会显示此项目默认生成的示例.如下图所示. 系统的文件加载过程,在浏览器输入网址后,

根据数字的出现的概率随机生成

今天的做项目用到了 根据数字出现的概率随机生成,看了一些园子里面大哥们的文章,总结一下, 示例:随机生成一个整数,该整数以50%的几率生成1,以40%的几率生成2,以10%的几率生成3.实现的代码如下: int n5 = r.nextInt(100); int m; //结果数字 if(n5 < 50){ //50个数字的区间,50%的几率 m = 1; }else if(n5 < 90){//[50,90),40个数字的区间,40%的几率 m = 2; }else{ m = 3; } 另外的

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算

package interview_10_10; import org.junit.Test; public class T1 { /** * 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算). */ @Test public void test1() { String number1 = "4324328732789"; String number2 = "2383244324324325898

求Fibonacci数的三种方法和时间复杂度解析

题目: 定义Fibonacci数列如下: f(0)=1 f(1)=1 f(n)=f(n-1)+f(n-2), n>=2 输入n,用最快的方法求该数列的第n项. 解答一: 直接用公式写递归函数.很简单,很低效,就不写了.时间复杂度T(N) = T(N-1) + T(N-2); 也是f(n)本身,2^(n/2)<f(n)<2^n. 解答二: 用循环求,也很直接,效率很高了,时间复杂度是O(n). int f(int n) { if(n <= 1) return 1; int f0=1,

ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况

ROC和AUC介绍以及如何计算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,对两者的简单介绍见这里.这篇博文简单介绍ROC和AUC的特点,以及更为深入地,讨论如何作出ROC曲线图以及计算AUC. ROC曲线 需要提前说明的是,我们这里只讨论二值分类器.对