题目:
实现一个数据结构,要求:
1 add和删除的复杂度为O(1)
2 get时返回随机的元素
3 可以add重复的数据,但内存中只有一份
分析:
两张hash表
1 记录插入的index-value
2 记录插入的value-index
add方法,插入后分别记录两张表,更新size
get方法,生成随机的index,返回index的value
remove方法,根据传入的值从表2找到index,再从表一找到后删除,两张表都删除,删除后将记录的size位置的元素移动到删除的空位,这样get的时候就会是实现随机
实现:
#!/usr/bin/python
# -*- coding:utf-8 -*-
#wnagzhoufeng
#实现一个数据结构,插入,删除的时间复杂度为O(1),get时随机返回一个值,可以add重复值,但内存中只能有一份
#借助hash表,两个hase表,一个记录v-index。另一个记录index-v
import random
class struct:
m1=dict
m2=dict
size=0
def __init__(self,m1,m2,size):
self.m1=m1
self.m2=m2
self.size=size
def Add(self,n):
if self.size==0:
self.m2[n]=1
self.m1[1]=n
self.size+=1
else:
if self.m2.has_key(n) == 0:
self.m2[n]=self.size+1
self.m1[m2[n]]=n
self.size+=1
def Remove(self,n):
tmp= self.m2.get(n)
if tmp !=0:
del self.m2[n]
del self.m1[tmp]
self.m1[tmp]=self.m1[self.size]
self.m2[self.m1[self.size]]=tmp
del self.m1[self.size]
self.size-=1
def get(self):
n=random.randint(1,self.size)
return self.m1[n]
if __name__=='__main__':
m1={}
m2={}
t=struct(m1,m2,0)
t.Add(7)
t.Add(8)
t.Add(9)
t.Add(10)
t.Add(10)
print t.m1
print t.m2
# # print t.getsize()
t.Remove(7)
print t.m1
print t.m2
print t.get()
# # print t.m2
# # print t.m1
# print t.Get()