Hash初步

本文初步介绍Hash的原理及用途,萌新的博客不比那些神犇,网上的大佬的博客实在是让萌新佩服得五体投地,但是萌新还是想发表一篇博客来陶冶一下自己的情操(说得很高大上)。

现在Hash已经广为程序员所知,但是Hash的由来确鲜为人知,所以作为蒟蒻的我肯定也不知道,毕竟连百度百科也没有解答这一疑问。而且作为一个蒟蒻旨在写出简单易懂、益于初学者理解的博客,我自然不可能把百度百科上的玄学东西放上来。Hash,一般翻译做“散列”,通过散列算法,变换成固定长度的输出,该输出就是散列值。(一言不合就放百度百科)。

这里写图片描述

    好吧,我错了。

举个例子,我们要查找数组里的值是否出现过,一般的方法是把数组遍历一遍就可以找到是否出现过,这样的时间复杂度为O( n),在很多题目中你敢这样干就意味着数据干把你卡爆。
最快的方法是直接利用元素的值作为数组的下标,可以直接查找,这样的时间复杂度为O( 1 ),但是大部分时间你敢这样干,内存绝对会爆掉。
岂不是很尴尬????

这个Hash就会发挥出它的作用。当我们要储存的元素为10^9时,即使开bool数组内存也会爆掉,这个时候就学要用一个函数建立一个映射关系(数学知识在这里就不详讲了)。把10^9变成一个小一点的数,我们就可以用数组来进行储存(是不是很棒棒)。如果你曾经看过我的离散优化初步的博客,你可能就会恍然大悟。离散优化也是一种Hash。我们是把线段的长度映射为端点进行储存达到节约空间的目的,同时也用O(1)的时间就完成了查找。
看到这里,你可能大概明白了Hash是什么。Hash就是个映射。

这里写图片描述

用某种神奇的函数建立某种神奇的映射关系。——摘自大佬Apache553

同样不同的Hash,也有不同的等级之分,这主要是取决于Hash函数的优劣。一个Hash函数的优劣由这个Hash函数冲突的多少有关。冲突越多Hash就越垃圾,冲突越少Hash就越好。所以Hash的关键在于Hash函数的选择。网上大佬的博客里对如何建立一个优秀的Hash映射关系的建立已经介绍得很详细了。这里就不在赘述。

对Hash冲突的会在接下来博客中为大家介绍,如果大家急切地想知道,就去看点击重新加载的博客,里面详细介绍了Hash拉链法(有冲突发生就把这个元素链在后面,大致与邻接表相同,如图)解决冲突(据他说是很详细)。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值