Python数据结构实战——哈希表(HashTable)

1.定义哈希转换函数

def get_hash(key):
	hash = 0
	for char in key:  #遍历key的每一个char
		hash += ord(char)   #计算所有char的ASCII值的和
	return hash % 100    #计算hash值
get_hash('march 6')

在这里插入图片描述
此处特别强调哈希值的计算过程,后面会将此函数封装到哈希表类中。

2.定义哈希表类

2.1.不使用__setitem__

class HashTable:
    def __init__(self):
        self.MAX = 10   #定义哈希表长度为10
        self.arr = [None for i in range(self.MAX)]   #初始化hash数组全为None
        
    #获取哈希值    
    def get_hash(self,key):   
        hash = 0      
        for char in key:
            hash += ord(char)
        return hash % self.MAX
    
    #将hash值以及对应val放入哈希表中
    def add(self,key,val):
        h = self.get_hash(key)
        self.arr[h] = val
        
    #通过key获得对应的val,中间用了一个哈希转换   
    def get(self,key):
        h = self.get_hash(key)
        return self.arr[h]      #返回哈希值在arr中的值

测试:

t = HashTable()        #实例化
t.add('March 1',100)   #添加key、value
t.add('March 2',200)
t.add('March 3',300)
t.add('March 4',400)

t.arr     #打印哈希数组
t.get('March 4')  #查找key对应的val

在这里插入图片描述

2.2.使用__setitem__

class HashTable:
    def __init__(self):
        self.MAX = 10   #定义哈希表长度为100
        self.arr = [None for i in range(self.MAX)]   #初始化hash数组全为None
        
    #获取哈希值    
    def get_hash(self,key):   
        hash = 0      
        for char in key:
            hash += ord(char)
        return hash % self.MAX
        
    #添加key,value
    def __setitem__(self, key, val):   
        h =self.get_hash(key)
        self.arr[h] = val
        
    #通过key查value
    def __getitem__(self,key):
        h = self.get_hash(key)
        return self.arr[h]
    
    #删除某个key(在arr中将其设为None即可)
    def __delitem__(self,key):
        h = self.get_hash(key)
        self.arr[h] = None

测试:

t = HashTable()
t['March 1'] = 100   #添加key,value
t['March 2'] = 200
t['March 3'] = 300
t['March 4'] = 400
t['March 5'] = 500

t['March 5']  #查找March 5
t['March 4']  #查找March 4
del t['March 3']   #删除March 3
t.arr   #将发现March 3对应的值变成None

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值