西风的数据结构教程(4)——hash表

本文详细讲解了哈希表的重要性和工作原理,包括字符串哈希算法如Times33和ELFHash,以及处理哈希冲突的开地址法(线性探测、二次探测和随机探测)和链地址法。此外,还介绍了优化哈希表性能的hash桶和可扩展哈希表概念,探讨了如何在实际应用中提高哈希表的查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天是教师节,感恩老师们的辛勤工作,让我们不断成长。

今天制作的这份教程十分重要,是我们高中时必会,而且是计算机体系中占有关键地位的一种数据结构——hash表。
要说hash表为何常用,为何厉害,那么我们先来考虑一个问题。

为什么说hash算法重要

计算机中,经常用到很多数学模型,例如,线性表 就是一种非常常用的数学模型,这里,不是在说他的数据结构,而是说,线性存储的这种方式,在很多情况下都用的到。

而另外一种重要的模型,就是 key-value键值对 模型,hash算法,重在构建一个高效的key-value模型。例如,我们有很多网页要浏览,而刚刚浏览过的网页再次打开,一般会快很多,因为浏览器帮我们做了缓存,然而我们细想,如何缓存呢?我们怎么才能知道这个网页我们刚刚访问过么?
那么我们可以建立一个key-value的模型,如果刚刚访问过,我们就将网页内容存放到value处,而key就存放网页的url。

例如我们的手机应用,希望快速的查找一个联系人的相关信息,那么遍历所有人员恐怕不是一个好想法,而用key-value模型根据名字索引找到则更方便。

hash算法除了可以构建key-value模型,更可以作为数据校验和数据加密的重要算法。

hash函数是一种单向不可逆函数,MD5是流行的数据校验用hash算法,下载下来的数据是否和网络上的一致,用hash计算一下结果,然后比较网络上的hash值和本地计算的hash值,一致的话就说明数据不存在异常。

sha系列hash算法,在网站密码的加密上有着重要的作用。一般开发网站的朋友都了解,网站用户的密码是不能明文保存的,因为万一数据泄露后,会对用户隐私造成重大威胁。那么用什么来判断密码是否正确呢?将hash后的密码作为值存储起来,判断密码正确前,也将用户的输入hash一次,这样就可以在不知道用户密码的前提下,判断是否为同一用户。

详解hash表

hash表又称散列表,这个名字就是在说,要将数据分散开存放到一些位置上。一般我们有一个很大的名字空间,例如,200位的英文字母组成的字符串,当然,我们不会全部使用,名字太多了,所以我们使用的,只会是其中的一小部分。同时,每一个名字还对应一条数据,往往名字只是标示,而其中的数据,才是我们最关注的。

而我们需要的是,尽快根据一个名字索引到对应的数据。有人说,简单啊,排序一下,然后根据二分查找的思想,对应判断就可以了。没错,二分查找是一种好思想,但也不是完全没有问题,如果我们的系统是动态的话,就很困难了,先存入两个数据,再删除一条,如果真想按照刚才的思想做,就必须做一棵高效平衡二叉树,普通的排序树有风险,可能退化的。而这样就太复杂了,hash表则提供了一种快速简单的思路,实现这个效果。

简单的链地址法的hash表:

这里写图片描述

hash表的结构其实很简单,就是一个较大的线性表,然后你去将key用一个函数计算一下,让结果分布到整个线性表中。由于hash函数一般都没有什么实际含义,一般希望 分布均匀,具有雪崩效应 (输入变化小,输出变化大),这样的映射函数就比较好了。

字符串hash——Times33

hash算法的基础算法之一,将字符串作为索引,存储key-value型数据。

而在字符串hash中, Times33 算法是一种著名的算法。

算法很简单,就是在不断的×33

int hash(String str)
{
    int hash_ans = 0;
    for (int i = 0; i< str.length; ++i)
        hash_ans = hash_ans*33 + str[i];
    return hash_ans;
}

一般来说,这个算法并没有什么特别深的理论依据,主要是经验性质的判断,对小心英文序列,33这个系数比较合适,对于大小写混合的,65比较好,还有使用31和131作为系数的版本,也都比较常见。

字符串hash——ELFhash算法

这是另外一种流行的hash算法,转自网友 阳光四季 的博文:http://blog.csdn.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值