你有没有遇到过这样的情况:想找一本书,书架上有几百本,只能一本本翻,特别慢?数据结构里也有类似的问题——如果用数组存数据,想找某个元素时,可能得从头翻到尾,这就是“顺序查找”,速度很慢。那有没有办法让查找像“按编号找抽屉”一样快?答案就是哈希表!
哈希表是什么?¶
哈希表(也叫散列表)是一种能让存储和查找数据更快的工具。它的核心是通过一个“哈希函数”,把要存的数据“翻译”成一个固定的位置(我们叫它“桶”),这样下次找数据时,直接算这个位置就能找到,不用再翻遍所有数据。
核心工具:哈希函数¶
哈希函数就像一个“翻译器”:输入是数据,输出是一个数字(哈希值),这个数字对应着哈希表中的一个“桶”(可以理解为数组的一个格子)。比如你要存学生的学号,哈希函数可以是“取学号的最后两位数字”,或者“学号除以100的余数”,然后把这个余数作为桶的编号。
举个例子:
假设我们要存学号12345的学生信息,哈希函数设计为“取学号后两位”,那么12345的最后两位是45,哈希值就是45,对应哈希表的第45号桶。
数据是怎么存到哈希表的?¶
存数据就像“把钥匙放进对应的抽屉”,步骤很简单:
1. 准备数据¶
先确定要存的数据,比如一条数据包含“学号(key)”和“姓名(value)”,我们用学号作为查找的“钥匙”。
2. 计算哈希值¶
把学号输入哈希函数,得到哈希值。比如学号23456,用“取后两位”的哈希函数,23456%100=45,哈希值就是45。
3. 定位桶的位置¶
哈希值45就是桶的编号(假设哈希表是一个数组,桶的编号就是数组的下标)。
4. 处理冲突¶
如果多个数据算出的哈希值相同(比如学号12345和23456都算出哈希值45),就会出现“冲突”(多个数据想进同一个桶)。解决冲突的常用方法有两种:
- 链表法:每个桶里挂一个链表,新数据直接“挂”在链表末尾(比如桶45里先放12345,再把23456挂在它后面)。
- 开放寻址法:如果桶45已满,就找下一个空桶(比如46号桶),把数据存进去。
哈希表为什么查找快?¶
比如你想找学号12345的学生:
1. 用哈希函数算:12345%100=45;
2. 直接定位到第45号桶;
3. 在桶里找学号12345(如果桶里是链表,就顺着链表找;如果是空桶,直接找到)。
整个过程不用遍历所有数据,只需要算一次哈希值,再在桶里找,速度快得像“按编号开锁”!
总结¶
哈希表通过哈希函数把数据“翻译”成桶的位置,让查找从“翻遍所有”变成“直接定位”。它就像图书馆的“图书分类编号”,你只需根据编号(哈希值)就能快速找到书(数据)。从手机通讯录到网站缓存,哈希表无处不在,核心就是用“哈希函数”让查找变简单。