【数据结构:从0到1】-14-直接寻址与哈希函数

引言

还在为数组查找慢而烦恼吗?还在为链表遍历效率低而头疼吗?今天我们来聊聊数据结构中的神器——哈希表。它以其平均O(1)时间复杂度的增删改查效率,成为了底层架构中不可或缺的一部分。

举个例子:假设你是学校图书馆的管理员,需要管理1000本图书的借阅信息。每本书有唯一的ISBN号,范围是0000000000到9999999999。

方法一:顺序查找

# 在一堆无序的文件中查找
books = [
    {
   
   "isbn": "7531234567", "title": "数据结构", "borrower": "高老师"},
    {
   
   "isbn": "7531234568", "title": "算法", "borrower": "祁厅长"},
    # ... 更多书
]

def find_book(isbn):
    for book in books:  # 最坏情况有1000本书要查1000次
        if book["isbn"] == isbn:
            return book
    return None

方案二:直接寻址

# 准备10亿个位置放1000本书?
books = [None] * 10000000000  # 10亿长度的数组!

def add_book(isbn, info):
	  # 直接把ISBN当索引
    index = int(isbn)  
    books[index] = info  

def find_book(isbn):
    return books[int(isbn)]  

哈希表的解决思路

哈希表的解决方案更像图书馆的图书管理系统:

  1. 分区管理:把10亿可能的ISBN号映射到1000个书架上
  2. 快速定位:通过一个计算规则直接找到对应书架
  3. 处理冲突:同一个书架上的书用链表管理
图书馆布局
书架0: ISBN以000-999结尾
书架1: ISBN以000-999结尾
书架...
书架999: ISBN以999-999结尾
输入ISBN号
哈希函数计算
得到书架编号
到对应书架查找
找到目标书?
成功借阅
查找失败

一、 哈希表

1.1 什么是哈希表?

哈希表是一种通过键值对存储数据的数据结构,它使用哈希函数将键映射到数组的特定位置,从而实现快速访问。

下面参考核心组件关系图:

contains
linked list
uses
HashTable
-buckets: Bucket[]
-capacity: int
-size: int
+put(key, value)
+get(key)
+remove(key)
Bucket
-head: Node
Node
-key: Object
-value: Object
-next: Node
«interface»
HashFunction
+hash(key)

1.2 哈希表的工作流程

下面我们画一个详细的流程图来理解哈希表的工作原理:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QuantumLeap丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值