浅谈字符串Hash

本篇随笔讲解Hash(散列表)的一个重要应用:字符串Hash。

关于Hash

Hash是一种数据结构,叫做Hash表(哈希表),也叫散列表。关于Hash的实现,其实与离散化颇为类似。就是把若干的复杂的信息映射到一个比较容易维护的值域去。具体的实现方式是散列函数,即Hash函数,其原理是对于一个数据,选取一个关键键值\(k\),那么这个数据在Hash表中的位置就是\(f(k)\)。那么这个对应关系(\(f()\))就是哈希函数。

哈希冲突

因为我们只是定义了一个\(f()\)作为哈希函数,并没有定义这个\(f()\)到底是什么样的函数。所以显然地,可能会出现一个函数\(f(k)\),使得两个不同的\(k(k_1\not=k_2)\)而出现函数值相等的情况\(f(k_1)=f(k_2)\)(比如二次函数)。这种情况被称作哈希冲突。导致答案错误。

关于字符串Hash

字符串哈希就是在字符串上进行哈希。字符串哈希的用处是快速判断两个字符串是否相等

一个简单的思想:将一个字符串转化为一个整数,这样,只需要比较整数相不相等就可以判断这个串是否重复出现过(不考虑哈希冲突)。

但是这个思想不考虑哈希冲突,不代表我们实现的时候也肯定不会出现哈希冲突。那么,我们当然希望我们哈希的东西(哈希映射,散列函数)是一个单射。

那么,我们用什么方法来避免哈希冲突呢?

自然溢出

给定一个字符串\(S=s_1s_2s_3\cdots s_n\),我们规定:\(f(x)=x-'a'+1\).

那么,自然溢出的哈希公式可以如此这么表示:
\[
hash[i]=hash[i-1]*p+f(i)
\]
注意,这里的哈希数组是\(unsigned\, long\, long\)范围的,所以可以通过自然溢出而自动取模\(2^{64}-1\)。

单Hash法

单Hash法的哈希公式可以这么表示:
\[
hash[i]=(hash[i]*p)+f(i)\%mod\quad (p<mod)
\]
显然,\(mod\)越小越容易冲突,所以我们把\(p,mod\)都尽量取大即可。

这种方法仍然存在哈希冲突的概率,只不过特别低。实际运用的时候可以使用这种方法。除非你RP低到一定境界,否则不会被卡掉。

例如:

\(p=13,mod=101\),对\(abc\)进行如上所示的\(hash\)。

\(hash[0]=1\)(从0开始计算)

\(hash[1]=15\)

\(hash[2]=97\)

那么97就是\(abc\)的hash值。

双hash法

hash一遍可能还会出现冲突,那我hash两遍。这就是双Hash法。

开一个二元组,用两个不同的\(mod\)来分别\(Hash\),得到的两个结果存进二元组,作为哈希的结果。

同理,你还可以开一个结构体,多哈希几遍(强迫症患者)(滑稽.jpg)

子串Hash

字符串子串是个常见的问题,变式很多。

但是,显然的是,如果我们求出了一个大串的hash,就能以\(O(1)\)的时间求解其子串的哈希值。

来让我们解释一下这个“显然”的含义:

\(hash[1]=s1\)
\(hash[2]=s1∗p+s2\)
\(hash[3]=s1∗p2+s2∗p+s3\)
\(hash[4]=s1∗p3+s2∗p2+s3∗p+s4\)
\(hash[5]=s1∗p4+s2∗p3+s3∗p2+s4∗p+s5\)
现在展示的是1-5的哈希。

如果我们要求s3s4的哈希,容易得出(根据哈希公式):\(s_3\times p+s_4\)。我们把\(hash[4],hash[2]\)进行消元处理的话,就能将结果中带有\(s_1,s_2\)的系数消掉,而这个操作只需要乘上\(p^2\)即可。

那么:
\[
hash[4]-hash[2]\times p^{4-3+1=2}
\]
那么我们处理出通项公式:
\[
hash[i]-hash[j-1]\times p^{i-j+1}
\]
取模的时候为了防止减法运算出现负数,还要做如下处理:
\[
hash=((hash[i]-hash[j-1]\times p^{j-i+1})\%mod+mod)\%mod
\]
这就完事了。

浅谈字符串Hash的更多相关文章

  1. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...

  2. 浅谈字符串哈希 By cellur925

    前言 蒟蒻最近在复习字符串算法...但正如之前所说,我OI太菜被关起来了,本蒟蒻只能从最简单的哈希入手了TAT.而别的dalao都在学习AC自动机/后缀数组等高到不知哪里去的算法qwq. 基本思想 映 ...

  3. 浅谈NTLM Hash

    认识Windows Hash 早期SMB协议在网络上传输明文口令.后来出现LAN Manager 挑战/响应验证机制(LM),其很容易破解,因此微软提出了WindowsNT挑战/响应验证机制(NTLM ...

  4. 浅谈一致性Hash原理及应用

    在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/同一表中. 大佬 ...

  5. 浅谈一致性hash

    相信做过互联网应用的都知道,如何很好的做到横向扩展,其实是个蛮难的话题,缓存可横向扩展,如果采用简单的取模,余数方式的部署,基本是无法做到后期的扩展的,数据迁移及分布都是问题,举个例子: 假设采用取模 ...

  6. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  7. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  8. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  9. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

随机推荐

  1. 03-Node.js学习笔记-系统模块path路径操作

    3.1为什么要进行路径拼接 不同操作系统的路径分隔符不统一 /public/uploads/avatar window 上是 \ / 都可以 Linux 上是 / 3.2路径拼接语法 path.joi ...

  2. Re-stheasy

    https://dn.jarvisoj.com/challengefiles/ctf2.b93676be23733b2fcda3988c1133c1c1 用IDA-32bit 打开,找到main函数 ...

  3. 洛谷 SP14932 LCA - Lowest Common Ancestor

    洛谷 SP14932 LCA - Lowest Common Ancestor 洛谷评测传送门 题目描述 A tree is an undirected graph in which any two ...

  4. Note | 用Hugo搭建博客并部署到GitHub Pages

    目录 1. 本地搭建 1.1 安装Hugo 1.2 创建站点 1.3 新建页面和文章 1.4 使用主题 1.5 修改配置文件 1.6 预览 2. 部署 之前担心过现有博客平台(如博客园,CSDN)突然 ...

  5. Java开发笔记汇总

    Java语法与.Net对比 Java规范与约定 Kotlin Maven笔记 SpringBoot笔记2 SpringCloud笔记 MyBatis笔记 发布Jar包到中央仓库

  6. Python连载44-XML其他注意点

    一.XML文件注意点 1.内容中不能出现尖括号 例如:下面是不合法的 <grade>成绩<90</grade> 解决方案:使用实体引用<EntityReferenc ...

  7. RadioButtonList

    RadioButtonList <asp:Label ID="txt_Gender" runat="server" Text="性别" ...

  8. 数据库——数据库设计 E-R图向关系模型的转换

    1.将下列物资管理E-R图转换为关系模式: 转换原则 ⒈  一个实体型转换为一个关系模式.关系的属性:实体型的属性关系的码:实体型的码   ⒉ 一个m:n联系转换为一个关系模式(初步,以后可能调整). ...

  9. python爬取小说

    运行结果: 代码: import requests from bs4 import BeautifulSoup from selenium import webdriver import os cla ...

  10. java高并发系列 - 第5天:深入理解进程和线程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.程序是指令.数据及其组织形式的描述,进程是程序的实体. 进程具有的 ...