import time
import random
# ranlist = [random.randint(1, 10000) for i in range(0, 2000)]#生成的一个伪随机数序列
# list=[0]#平方探测法
# for i in range(1,5000):
# list.append(i**2)
# list.append(-i**2)
# print(list)
#第一个哈希函数为
class HashTable:
# 表的长度定位11
def __init__(self):
self.hash_table = [[None, None] for i in range(10000)]
# 散列函数
def hash_function1(self,key):
k_num = 0
for j in key:
k_num = ord(j) + k_num
h_value = k_num % 9991
return h_value
# def rehash(self,key,i):#线性探测
# key=(key+i)%10000
# return key
# def rehash(self,key,rand_i):#伪随机序列探测
# key=(key+ranlist[rand_i])%10000
# return key
# def rehash(self,key,i):#平方探测法
# key=(key+list[i])%10000
# return key
# def rehash(self, key, i): # 平方探测法
# key=(key+list[i])%10000
# return key
def rehash(self, old_hash, key, i):
return (old_hash + i * self.hash_function2(key)) % 10000
def hash_function2(self, key):
k_num = 0
for j in key:
k_num = ord(j) + k_num
return 2*k_num+1 # 选择一个与哈希表大小互质的数作为第二个哈希函数
def put(self, k, v):
i=0
hash_v = self.hash_function1(k)
if self.hash_table[hash_v][0]==None:
self.hash_table[hash_v][0] = k
self.hash_table[hash_v][1] = v
elif self.hash_table[hash_v][0]!=k:
i += 1
hash_v=self.rehash(hash_v,k,i)
while self.hash_table[hash_v][0]!=None and self.hash_table[hash_v][0] != k:
i += 1
hash_v=self.rehash(hash_v,k, i)
if self.hash_table[hash_v][0]==None:
self.hash_table[hash_v][0] = k
self.hash_table[hash_v][1] = v
def get(self, k):
i=0
h_value=self.hash_function1(k)
p=h_value
if self.hash_table[h_value][0] == k:
return self.hash_table[h_value][1]
else:
i += 1
h_value = self.rehash(h_value,k,i)
while self.hash_table[h_value][0]!=None and h_value != p:
i+=1
h_value = self.rehash(h_value,k, i)
if self.hash_table[h_value][0] == k:
return self.hash_table[h_value][1]
return "该字典中无此词"
if __name__ == '__main__':
hashtable = HashTable()
with open('CET4.csv', 'r', encoding='utf8') as f:
stime = time.time()
for i, row, in enumerate(f):
arr = row.split(',')
if len(arr) < 7:
continue
word = arr[3]
meaning = arr[8]
hashtable.put(word, meaning)
etime = time.time()
print('生成词典消耗时间:' + str(etime - stime) + 's,总词数:' + str(i))
print('请输入查询单词:')
w = input()
word = hashtable.get(w)
print(word)
利用哈希表制作一个词典(数据集在评论区)
最新推荐文章于 2024-06-18 16:10:07 发布