Python 哈希表(Hash Table)

一、哈希表基本概念

哈希表(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值