基本数据结构—Hash哈希

理论概念

这玩意一直都是个好东西,但是我总觉得玄学的一批。今天借着专题学习的劲头,把Hash好好梳理一下。

定义/作用

哈希这东西应该都不陌生。将复杂的信息映射到一个容易维护的值域之内。那么Hash函数就有点类似于一个映射关系。通过这个函数来产生一个关键值(Key),通过关键值与值(value)的对应关系,制作一个对应表。即哈希表(Hash table)。他可以实现通过Key快速的查找Value。

那么其最大作用也就显而易见。查重。也就是说,查找当前的值是否已经存在。难点在于,如何去产生这个对应关系?简单的映射关系是有相当的可能产生“两组不同的值生成同一个关键值”的错误(我们称其为哈希冲突)。如果哈希函数的设计太水,那么这个哈希冲突也就非常容易产生了。

整数(int)哈希举例

引用了一个对整数数组生成Hash的方法,这里只做举例。在本例中,不关心数组中数的序列问题。即只考虑数组内值不同为不同状态,如果值相同但顺序不同,我们仍认为他是同一状态。(会产生相同的关键值)

对于一组数,其乘积与其累加之和与任意较大质数P取模。

//这里是针对于某一个题目所引入的,所以具体原因会在下方的题目展示中阐释。

字符串哈希

定义与技巧

常用的字符串哈希分两类(没错,我觉得该分两类的!)

自然溢出式Hash与多重Hash。一般来讲,前者虽然发生哈希冲突的几率非常小,但总会被刁钻(诶嘿嘿)的出题人卡几个数据。是的,他们是具备能卡你自然溢出单哈希的能力的。所以稳妥起见,后者运用频率偏高一些。

什么是字符串哈希?就是把一个任意长度的字符串映射成一个非负整数,并且其冲突概率几乎为0

把字符串看作P进制数,并分配一个大于0的数值,代表每种字符。啥意思啊?比如a对应1,b对应2,c对应3。取一个固定的值M,求出该P进制数对于M的余数,作为该字符串的哈希值。一般来说,P取131或者13331,这样冲突几率就极低。一般M取264,也就是一个自然溢出的unsigned long long。就让你溢出,取代低效的取模运算。

这也就是第一类Hash。为了避免被卡,我们多取一些适当的P与M。(例如大质数),进行多组Hash运算。如果结果都相同,我们就认定这是一个相等的字符串。

性质

对没错!我觉得这是性质!!

有了以下两种性质,我们便可以做到在O(N)的时间内预处理所有前缀Hash值,并在O(1)的时间内完成查询任意字串的哈希值。

一、

对于任意新字符串S+C,他的Hash值就是

H(S+C)=(H(S)*P+Value[C])mod M

为什么?我们来进行一个简单的模拟。

例如,S="abc",C=“d”

S表示为P进制的数:1 2 3

H(S)=1*P2+2*P+3

H(S+C)=1*P3+2*P2+3*P+4=H(S)*P+4

这里可以把*P的操作视为在P进制下的左移运算。Value[c]是我们为c选定的代表数值。

二、

如果已知字符串S的Hash值为H(S),字符串S+T的Hash值为H(S+T),那么字符串T的Hash值

H(T)=(H(S+T)-H(S)*Plength(T)) mod M

那么我们继续之前的模拟。

例如,S="abc",C=“d”,T=“xyz”

S表示为P进制的数:1 2 3

S+T的P进制数为:1 2 3 24 25 26

H(S)=1*P2+2*P+3

H(S+T)=1*P5+2*P4+3*P3+24*P2+25*P+26

S在P进制下左移length(T)位:1 2 3 0 0 0

两者相减就是T表示为P进制数:24 25 26

H(T)=H(S+T)-(1*P2+2*P+3)*P3=24*P2+25*P+26

在题目中的Show Time

Snowflake Snow Snowflakes  POJ3349

等待补充

兔子与兔子 CH1401

由于目标题库被查表…等待恢复。

好文章 2015模拟题By nodgd

等待补充

原文地址:https://www.cnblogs.com/Uninstalllingyi/p/11191045.html

时间: 2024-11-11 22:18:37

基本数据结构—Hash哈希的相关文章

Hash哈希(一)

Hash哈希(一) 哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知识.本文参考了很多博文,感谢大家的无私分享. 基本概念 Hash,一般翻译做“散列”,也有直接音译为“哈希”的.那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系. 大家使用的最多的就是哈希表(Hash table,也叫散列表),是

【算法与数据结构】哈希表-链地址法

哈希表的链地址法来解决冲突问题 将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量 Chain  ChainHash[m]; 数据结构 //链表结点 typedef struct _tagNode { int data; //元素值(关键字) struct _tagNode* next; //下一个结点 }Node, *PNode; //哈希表结点 typedef struct _tagHashTable { //这里

数据结构之哈希表--预习篇

数据结构实验:哈希表 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在n个数中,找出出现次数最多那个数字,并且输出出现的次数.如果有多个结果,输出数字最小的那一个. 输入 单组数据,第一行数字n(1<=n<=100000). 接下来有n个数字,每个数字不超过100000000 输出 出现次数最多的数字和次数. 示例输入 3 1 1 2 示例输出 1 2 首先声明本渣还没学会哈希,这篇就当哈希的预习篇吧 写的不好大家见谅 首

数据结构之哈希表实现浅析

看了下JAVA里面有HashMap.Hashtable.HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和HashMap.Hashtable的区别 HashMap和Hashtable的实现原理 HashMap的简化实现MyHashMap HashMap和Hashtable的区别 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全Hashtable的实现方法里面都添加了synchron

数据结构【哈希表】

哈希表(Hash Table)基本概念 哈希表(Hash Table)是一种根据关键字(Key value)直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种映射对应关系,这个映射函数叫做散列函数,存放数据的数组叫做散列表. 哈希函数构造方法 哈希表的构造方法是: 假设要存储的数据元素个数为n,设置一个长度为m(m≥n)的连续存储单元,分别以每个数据元素的关键字 Ki(0<= i <=n-1) 为自变量,通过哈希函数 hash(Ki) 把 Ki 映射

上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中

/// <summary> /// 上传企业logo /// </summary> /// <returns></returns> public ActionResult UploadLogo(string comid) { HttpFileCollection files = System.Web.HttpContext.Current.Request.Files; if (files.Count == 0) return Json("没有没文件

MySQL源码 数据结构hash

MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/hash.c] typedef uint my_hash_value_type; typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*my_hash_free_key)(void *); type

Hash(哈希)

一.基本概念 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value

浅谈算法和数据结构: 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单