其他题目---设计RandomPool结构
2017-10-19 17:31
225 查看
【题目】
设计一种结构,在该结构中有如下三个功能:
1、 insert(key):将某个key加入到该结构,做到不重复加入
2、delete(key):将原本在结构中的某个key移除
3、getRandom():等概率随机返回结构中的任意一个key
要求所有的操作时间复杂度都是O(1)。
【基本思路】
对每个元素都加上一个下标,第一个元素的下标为0,每加入一个元素,对应的下标加1。如果要删除一个元素,假设该元素的下标为i,将最后的一个元素放到位置i处,同时删除最后一个元素(对应的下标也删除)。这样处理就保证了下标的连续性,在进行getRandom操作的时候,只需要随机产生一个下标,将该下标位置处的元素返回即可。
为了得到key -> index以及index -> key的对应关系,使用两个哈希表来建立两者之间的映射。
【代码实现】
设计一种结构,在该结构中有如下三个功能:
1、 insert(key):将某个key加入到该结构,做到不重复加入
2、delete(key):将原本在结构中的某个key移除
3、getRandom():等概率随机返回结构中的任意一个key
要求所有的操作时间复杂度都是O(1)。
【基本思路】
对每个元素都加上一个下标,第一个元素的下标为0,每加入一个元素,对应的下标加1。如果要删除一个元素,假设该元素的下标为i,将最后的一个元素放到位置i处,同时删除最后一个元素(对应的下标也删除)。这样处理就保证了下标的连续性,在进行getRandom操作的时候,只需要随机产生一个下标,将该下标位置处的元素返回即可。
为了得到key -> index以及index -> key的对应关系,使用两个哈希表来建立两者之间的映射。
【代码实现】
#python3.5 class Pool: def __init__(self): self.keyIndexMap = {} self.indexKeyMap = {} self.index = 0 def insert(self, key): self.keyIndexMap[key] = self.index self.indexKeyMap[self.index] = key self.index += 1 def delete(self, key): if key in self.keyIndexMap: index = self.keyIndexMap[key] lastKey = self.indexKeyMap[self.index-1] self.indexKeyMap[index] = lastKey del self.keyIndexMap[lastKey] del self.indexKeyMap[self.index-1] self.index -= 1 def getRandom(self): if self.index == 0: return None index = int(random.random() * self.index) return self.indexKeyMap[index]
相关文章推荐
- 其他题目---设计一个没有扩容负担的堆结构
- 其他题目---一种消息接受并打印的结构设计
- 设计RandomPool结构
- 其他题目---设计可以变更的缓存结构
- 数据结构课程设计题目
- 数据结构课程设计题目四_二叉树
- 数据结构课程设计题目四_二叉树
- 数据结构课程设计————题目2
- 数据结构课程设计题目四_二叉树
- 数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)
- 数据结构课程设计题目3
- javaAPI深入理解(2)Collection,List的设计,ListIterator与Iterator,RandomAccess,List排序、逆序以及其他
- 数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)
- 企业数据库三层结构模型,MVC模式,设计模式,面向对象设计,接口规范及其他
- 数据结构课程设计-----题目1 程序设计报告(简版)
- 数据结构课程设计 题目 1 (活期储蓄管理系统)
- 数据结构课程设计——题目四电话模拟
- 【哈希表】实现结构RandomPool,用O(1)时间完成插入、删除和随机返回的功能
- 数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)
- 数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)