哈希——设计RandomPool结构

设计一种结构, 在该结构中有如下三个功能:
insert(key): 将某个key加入到该结构, 做到不重复加入。
delete(key): 将原本在结构中的某个key移除。

getRandom():等概率随机返回结构中的任何一个key。
【要求】 Insert、 delete和getRandom方法的时间复杂度都是O(1)

解:使用两个hash表进行操作,

map1中存放的 key value 分别是 相应的值  和对应的插入顺序

map2中正好相反, key value 分别是 对应的插入顺序,和 相应的值

insert(key):即是上面的操作方法

getRandom():就是利用size,使用Math.random() * size 产生一个随机数,范围就是[0, size )的一个值,然后从map2中获取相应的数字对应的值即可

delete(key):需要注意的是,如果直接在map1和map2中进行删除操作的话,会产生很多空缺的地方,此时,如果getRandom()的话,产生的随机数的位置很可能是空的,这样就不能保证O(1)的时间复杂度

正确的做法是:(将最后一个覆盖到相应的删除位置)若删除的是其中位置x处的值,则把map1中倒数第一个值赋到x处的key中,把map2中对应位置的value也赋成相应的值

猜你喜欢

转载自www.cnblogs.com/SkyeAngel/p/8949491.html
今日推荐