Description:
散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
本題請使用散列函數:除留餘數法(取關鍵字被某個不大於散列表表長m的數p除後所得的餘數爲散列地址)建立哈希表,並判斷給定值是否在散列表中。
注意:本題請考慮衝突情況,即碰撞。本題請使用鏈衝突法解決衝突,即散列到相同地址後以建立子鏈的方式解決元素衝突,因此本題不考慮總元素大於散列表大小而溢出的情況。重複元素只存一個。
Solution:
# Filename : hashTable.py
class hashTable():
"""docstring for hashT"""
# 回頭再加註釋吧
def __init__(self,size):
self.table = [None] * size
self.size=size
#插入元素,使用鏈式方法
def insert(self,value):
index = value % self.size # 哈希函數在此
#print('value:',value,' self.table[index]:',self.table[index])
if value == self.table[index]:
return True
if isinstance(self.table[index],int):
self.table[index] = [self.table[index]]
self.table[index].append(value)
elif isinstance(self.table[index],list):
if value in self.table[index]:
return True
self.table[index].append(value)
else:
self.table[index] = value
# 刪除表內元素
def delete(self,value):
index = value % self.size
if self.table[index] == None:
print('Delete Error')
return False
elif isinstance(self.table[index],int):
if self.table[index] == value:
self.table[index] = None
else:
print('Delete Error')
return False
elif isinstance(self.table[index],list):
if value in self.table[index]:
value_index = self.table[index].index(value)
self.table[index][value_index] = None
else:
print('Delete Error')
return False
#搜索該元素是否存在
def search(self,value):
index = value % self.size
if self.table[index] == None:
return False
elif isinstance(self.table[index],int):
if self.table[index] == value:
return True
else:
return False
elif isinstance(self.table[index],list):
if value in self.table[index]:
return True
else:
return False
self.size = int(input())
table = hashTable(self.size)
inputdata = input().split()
data = list(map(int,inputdata))
for eachdata in data:
table.insert(eachdata)
#print('table element:',table.table)
addmore = int(input())
for addelement in range(0,addmore):
table.insert(int(input()))
#print('table element:',table.table)
deletesome = int(input())
for deleteit in range(0,deletesome):
table.delete(int(input()))
#print('table element:',table.table)
searchit = int(input())
for searchit in range(0,searchit):
print(table.search(int(input())))