[Algorithm] Hashing for search
Hashing Process
关于hash本身,解决冲突是一个小重点,如下图。
代码实现分析
—— 定义HashTable类
一、数据结构
def __init__(self): self.size = 11 self.slots = [None] * self.size self.data = [None] * self.size
二、Hashing策略
注意,因“冲突”而导致的rehash不是原本的"key+1",而是"key的hash结果+1"。用的是”线性解决冲突“的策略。
def bashfunction(self, key, size): return key%size def rehash(self, oldhash, size): return (oldhash+1)%size
三、设置
理解的关键,有冲突时找下一个位置,
def put(self, key, data):
hashvalue = self.hashfunction(key, len(self.slots)) if self.slots[hashvalue] == None # 第一次出现,则直接添加 self.slots[hashvalue] = key self.data[hashvalue] = data else: if self.slots[hashvalue] == key: #已经有了则“更新”数值 self.data[hashvalue] = data else:
# 有值但key不是,说明“被占”了,那就循环直到”没冲突“时 nextslot = self.rehash(bashvalue, len(self.slots)) while self.slots[nextslot] != None and self.slots[nextslot] != key: # ”被占“:非空,且key不对 nextslot = self.rehash(nextslot, len(self.slots)) # 找到位置后,看位置的具体情况; if self.slots[nextslot] == None: # append new key. self.slots[nextslot] = key self.data[nextslot] = data else: # update existing key's value. self.data[nextslot] = data
四、获取
值得注意的是:”没找到“的标示是又回到了原来的起始位置。这也是线性探测的特点。
def get(self, key):
startslot = self.hashfuncion(key, len(self.slots)) data = None stop = False found = False position = startslot while self.slots[position] != None and not found and not stop: if self.slots[position] == key: found = True data = self.data[position] else: # update 'position', 冲突解决之‘线性探测’ position = self.rehash(position, len(self.slots)) if position == startslot: # 是真没有这个key stop = True return data
五、类的 ”字典化“
def __getitem__(self, key): return self.get(key) def __setitem__(self, key, data): self.put(key, data)
一个简单的例子:
class Tag:
def __init__(self):
self.change={'python':'This is python'}
def __getitem__(self, item):
print('这个方法被调用')
return self.change[item]
a=Tag()
print(a['python'])
End.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律