一、哈希表基本概念
哈希表(Hash Table)是一种键-值(key-value)映射的数据结构,它通过哈希函数将键映射到表中一个位置来访问记录,使得查找、插入和删除操作的平均时间复杂度达到 O(1)。
核心组成
- 哈希函数:将任意大小的数据映射到固定大小的值
- 数组(桶):存储数据的底层结构
- 冲突解决机制:处理不同键映射到同一位置的情况
二、Python中哈希表的实现
Python 内置的dict 类型就是基于哈希表实现的。
# 创建字典(哈希表)
student_scores = {
"Alice": 85,
"Bob": 92,
"Charlie": 78,
"Diana": 95
}
# 访问元素 - O(1)
print(student_scores["Bob"]) # 输出: 92
# 添加/更新元素 - O(1)
student_scores["Eve"] = 88
student_scores["Bob"] = 90
# 删除元素 - O(1)
del student_scores["Charlie"]
# 检查键是否存在 - O(1)
print("Alice" in student_scores) # 输出: True
# 遍历字典
for name, score in student_scores.items():
print(f"{name}: {score}")
三、自定义一个简单的哈希表
class HashTable:
"""自定义哈希表实现"""
def __init__(self, size=10):
self.size = size
self.table = [[] for _ in range(size)] # 使用链表法解决冲突
def _hash(self, key):
"""简单哈希函数:取ASCII码之和模表大小"""
if isinstance(key, int):
return key % self.size
return sum(ord(c) for c in str(key)) % self.size
def put(self, key, value):
"""插入键值对"""
hash_key = self._hash(key)
bucket = self.table[hash_key]
# 检查是否已存在该键
for i, (k, v) in enumerate(bucket):
if k == key:
bucket[i] = (key, value) # 更新现有键
return
bucket.append((key, value)) # 添加新键
def get(self, key):
"""获取键对应的值"""
hash_key = self._hash(key)
bucket = self.table[hash_key]
for k, v in bucket:
if k == key:
return v
raise KeyError(key) # 键不存在
def remove(self, key):
"""删除键值对"""
hash_key = self._hash(key)
bucket = self.table[hash_key]
for i, (k, v) in enumerate(bucket):
if k == key:
del bucket[i]
return
raise KeyError(key) # 键不存在
def __str__(self):
"""可视化哈希表"""
return "\n".join(f"{i}: {bucket}" for i, bucket in enumerate(self.table))
# 测试自定义哈希表
ht = HashTable()
ht.put("apple", 5)
ht.put("banana", 8)
ht.put("orange", 10)
ht.put("apple", 6) # 更新apple的值
print("\n自定义哈希表内容:")
print(ht)
# 示例输出:
# 0: []
# 1: [('orange', 10)]
# 2: []
# 3: []
# 4: []
# 5: [('apple', 6), ('banana', 8)]
# ...
print("\n获取值:")
print("apple:", ht.get("apple")) # 输出: 6
print("banana:", ht.get("banana")) # 输出: 8
ht.remove("banana")
print("\n删除后:")
print(ht)
四、哈希函数设计原则
- 一致性:相同键总是产生相同哈希值
- 均匀性:键应均匀分布在哈希表中
- 高效性:计算速度快
Python的 __hash__ 方法
Python 中可哈希对象必须实现 __hash__() 方法:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
def __hash__(self):
return hash((self.name, self.age)) # 使用元组的哈希值
p1 = Person("Alice", 25)
p2 = Person("Alice", 25)
print(hash(p1) == hash(p2)) # 输出: True
2087

被折叠的 条评论
为什么被折叠?



