class HashTable:
def __init__(self, size=11):
self.size = size
self.slots = [None] * self.size
self.data = [None] * self.size
def put(self, key, value):
if isinstance(key, str):
newkey = ord(key)
else:
newkey = key
hashvalue = self.hashfunction(newkey, self.size)
if self.slots[hashvalue] == None:
self.slots[hashvalue] = key
self.data[hashvalue] = value
else:
if self.slots[hashvalue] == key:
self.data[hashvalue] = value
else:
nextslot = self.rehash(hashvalue, self.size)
while self.slots[nextslot] != None and self.slots[nextslot] != key:
nextslot = self.rehash(nextslot, self.size)
if self.slots[nextslot] == None:
self.slots[nextslot] = key
self.data[nextslot] = value
else:
self.data[nextslot] = value
def hashfunction(self, key, size):
return key % size
def rehash(self, oldhash, size):
return (oldhash + 1) % size
def get(self, key):
if isinstance(key, str):
newkey = ord(key)
else:
newkey = key
startslot = self.hashfunction(newkey, self.size)
pos = startslot
while 1:
if self.slots[pos] == key:
return self.data[pos]
else:
pos = self.rehash(pos, self.size)
if pos == startslot:
raise KeyError(f'{key} not found')
def __getitem__(self, key):
return self.get(key)
def __setitem__(self, key, value):
self.put(key, value)
def len(self):
count = 0
for i in self.slots:
if i != None:
count += 1
return count
def __delitem__(self, key):
if isinstance(key, str):
newkey = ord(key)
else:
newkey = key
startslot = self.hashfunction(newkey, self.size)
pos = startslot
while 1:
if self.slots[pos] == newkey:
self.slots[pos] = None
self.data[pos] = None
break
else:
pos = self.rehash(pos, self.size)
if pos == startslot:
raise KeyError(f'{key} not found')
def __contains__(self, key):
if isinstance(key, str):
newkey = ord(key)
else:
newkey = key
startslot = self.hashfunction(newkey, self.size)
pos = startslot
while 1:
if self.slots[pos] == newkey:
return True
else:
pos = self.rehash(pos, self.size)
if pos == startslot:
return False
# def __iter__(self):
# return iter(self.slots)
def __repr__(self):
s = '{'
for i in self.slots:
if i is not None:
value = self.data[self.slots.index(i)]
if isinstance(i, str):
if isinstance(value, str):
s = s + f"'{i}' : '{value}' , "
else:
s = s + f"'{i}' : {value} , "
else:
if isinstance(value, str):
s = s + f"{i} : '{value}' , "
else:
s = s + f"{i} : {value} , "
s = s.rstrip(', ')
s = s + '}'
return s
散列表(哈希表)HashTable
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- hash table 中文叫做散列表或者是哈希表,其实是一个意思https://github.com/googeg...