[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.

posted @   郝壹贰叁  阅读(189)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示