利用哈希表制作一个词典(数据集在评论区)

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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值