python dict hashtable_Dict(hashtable, Map) implementation in python

__author__ = 'bozeng'

## this code implements a hashtable.

class Item:

def __init__(self, key, value):

self.key=key

self.value=value

## do it using linear probing and two lists (for easier retrieval of keys and values ). Use Open addressing. Should support resizing

class hashTable:

def __init__(self):

self.arraysize=8

self.itemsize=0

self.itemarray=[-1]*self.arraysize

def update(self,newsize):

oldarray=self.itemarray

oldsize=self.arraysize

self.arraysize=newsize

self.itemarray=[-1]*newsize

self.itemsize=0

for i in range(oldsize):

if oldarray[i]!=-1:

self.put(oldarray[i].key,oldarray[i].value)

def put(self,key,value):

if (self.itemsize+1)*3>=2*self.arraysize:

self.update(self.arraysize*2)

position=self.hashing(key)

if self.itemarray[position]==-1:

self.itemarray[position]=Item(key,value)

self.itemsize=1+self.itemsize

return

else:

nextposition=position

count=1

while True:

if self.itemarray[nextposition]==-1:

self.itemarray[nextposition]=Item(key,value)

self.itemsize=1+self.itemsize

return

elif self.itemarray[nextposition].key==key:

self.itemarray[nextposition].value=value

return

nextposition=self.rehash(nextposition,count)

count=count+1

def rehash(self,hashvalue,count):

return (hashvalue+count**2)%self.arraysize

def hashing(self,key):

return hash(key)%(self.arraysize-1)

def get(self,key):

position=self.hashing(key)

if self.itemarray[position]==-1:

return None

else:

nextposition=position

count=1

while True:

if self.itemarray[nextposition]==-1:

return None

elif self.itemarray[nextposition].key==key:

return self.itemarray[position].value

nextposition=self.rehash(nextposition,count)

count=count+1

def __getitem__(self,key):

return self.get(key)

def __setitem__(self,key,value):

return self.put(key,value)

def __len__(self):

return self.itemsize

def __contains__(self, key):

return self.get(key)!=None

def __delitem__(self, key):

position=self.hashing(key)

if self.itemarray[position]==-1:

raise KeyError("%sdoes not exist" % key)

else:

nextposition=position

count=1

while True:

if self.itemarray[nextposition]==-1:

raise KeyError("%sdoes not exist" % key)

elif self.itemarray[nextposition].key==key:

self.itemarray[nextposition]=-1

self.itemsize=self.itemsize-1

return

nextposition=self.rehash(nextposition,count)

count=count+1

def keys(self):

for i in range(self.arraysize):

if self.itemarray[i]!=-1:

yield self.itemarray[i].key

def values(self):

for i in range(self.arraysize):

if self.itemarray[i]!=-1:

yield self.itemarray[i].value

hs=hashTable()

hs["man"]='adman22'

hs["man2"]='adman'

hs["man3"]='adman'

hs["man4"]='adman'

hs["man5"]='adman'

hs["man6"]='adman'

hs["man7"]='adman'

print(hs.itemarray)

for i in hs.keys():

print(i in hs)

print(hs[i])

print(len(hs))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值