哈希表

哈希表其实就是建立和存储一种映射关系

离散化、桶排序就是一种简单数值哈希

常见的哈希方法:

除法哈希法  hash(key) = keymod M(M为素数)

乘法哈希法  hash(key) = floor( M/W * ( a * key mod W) )

通常设置M为2的幂次方

W为计算机字长大小(也为2的幂次方)

a为一个非常接近于W的数

若a=W*(√5-1)/2,则为斐波拉契哈希法

相同的输入hash之后一定相同hash值相同的值一定是同一个输入吗?

—— “哈希冲突”。

哈希冲突

是哈希就会冲突,但是合理的选择哈希函数可以让冲突的概率降低真的冲突了怎么办?

冲突解决办法:

拉链法  链表实现,每个位置一个链表,存储冲突的元素

开放地址法  如果冲突,就按一定的规则放到其它位置

字符串哈希

OI里面常常涉及到的时候字符串哈希,字符串哈希的算法也有很多

最著名的就是BKDR Hash具体做法:

•将字符串变成数值,并且最后变成的数值是一个P进制的数(一般取131或者13331)一般来说P最好为素数.

•由于字符串相同,就转化为区间的值相同,所以求一个前缀和

构造方法:

假如给你一个数字1166,形式上你只知道它只是1和6的组合

但你知道它代表的实际大小1*103+1*102+6*101+6*100

同理,给你一个字符串,要把它转换为数字

就可以先把每一个字符都先对应一个数字

然后把它们按照顺序乘以进制的幂进行相加

算法过程

处理过程

•把字符串看成P进制数

•预处理字符串所有的前缀hash值hash[i] = (hash[i-1] * P + str[i])mod Q

•计算区间hash值hash[l, r] = hash[r] -hash[l-1] * p[r -l + 1]这里P一般取131或者13331

•Q一般取1e9+7或1e9+9等大素数,这样冲突的机率极小(姑且视作不冲突)

•如果Q取,可以直接用unsigned long long自然溢出反复求值,提前预处理p[n]:更佳

一本通另一种求区间hash值的方法

H[m]=(C1pm-1+C2pm-2+...+Cmp0)% MOD

H[k]=H[k-1]*p+str[k];

举个例子:

C=“ABCD”

H[1]=1;

H[2]=1*p+2;

H[3]=1*p2+2*p+3;

H[4]=1*p3+2*p2+3*p+4;

然后对于某一段字符串的哈希值,C'=“BC”

H[C']=H[3]-H[1]*p2

对于C'=Ck+1Ck+2...Ck+n

H[C']=H[k+n]-H[k]*pn

双哈希

为什么要双哈希?

单次哈希判断相同容易被hack,也就是说不同的输入会得到相同的结果,所以建议多次哈希经验证明:其实只需要两次哈希就行了,称为双哈希(要是不放心,三哈希也行,但经过历代older的实践,几乎所有时候双哈希就ok了)

h1[i] = (h1[i]*base1+s[i][j]) % mod1;

h2[i] = (h2[i]*base2+s[i][j]) % mod2;

判断是否相等:h1[i]==h1[j]&&h2[i]==h2[j]

双哈希参考代码

#include<bits/stdc++.h>
using namespace std;
const int mod1=10000007,mod2=13333337;
int h1[10002], h2[10002];
char s[10002][1502];
int n;
int p1, p2;
int main() {srand((unsigned)time(0));p1 = rand()%100+200, p2 = rand()%300+400;scanf("%d",&n);for(int i=1; i<=n; i++)scanf("%s", s[i]);for(int i=1; i<=n; i++) {int len=strlen(s[i]);for(int j=0; j<len; ++j) {h1[i]=(h1[i]*p1+s[i][j]) % mod1;h2[i]=(h2[i]*p2+s[i][j]) % mod2;}}int ans= n;for(int i=1; i<=n; ++i)for(int j=i-1; j>=1; --j)if(h1[i]==h1[j] && h2[i]==h2[j]         ) {--ans;break;}printf("%d",ans);return 0;
}

STL:map

在STL里也有一个类似于哈希一样的key-value对应的东西

map

定义:map<key类型,value类型> namemap

hash_map

使用了拉链法的哈希表,可以自定义哈希函数(默认有一个哈希函数)

今年的第三题,可以尝试用map做一下

Hash 浅谈哈希算法相关推荐

  1. 浅谈流处理算法 (1) – 蓄水池采样

    转载自  浅谈流处理算法 (1) – 蓄水池采样 前言 现如今,"大数据 "已经不是什么新概念,"一千个人眼中有一千个大数据".社交网络,智能穿戴设备,智能家居 ...

  2. 浅谈Base64编码算法

    一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...

  3. 浅谈国密算法 SM1、SM2、SM3、SM4

    浅谈国密算法 国密算法是我国自主研发创新的一套数据加密处理系列算法.从SM1-SM4分别实现了对称.非对称.摘要等算法功能.特别适合应用于嵌入式物联网等相关领域,完成身份认证和数据加解密等功能.当然, ...

  4. 数据库浅谈之共识算法

    数据库浅谈之共识算法 HELLO,各位博友好,我是阿呆

  5. java一致性hash api_一致性哈希算法学习及JAVA代码实现分析

    戳上面的蓝字关注我们哦! 本文作者:hapjin 欢迎点击下方阅读原文 1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式 ...

  6. 浅谈标签传播算法LPA

       研究生期间第一次对相关内容做了一个汇报,查找了大量文献,发现很多的介绍对于新手来说都看不懂,这里采用最简单的方法来浅谈一下,如有错误,欢迎指正.   标签传播算法是一种基于图的半监督学习方法,其 ...

  7. 浅谈分布式一致性算法raft

    前言:在分布式的系统中,存在很多的节点,节点之间如何进行协作运行.高效流转.主节点挂了怎么办.如何选主.各节点之间如何保持一致,这都是不可不面对的问题,此时raft算法应运而生,专门 用来解决上述问题 ...

  8. 浅谈最小生成树的算法思路(一)Prim算法

    Prim算法是求最小生成树的一种常见算法,简单谈一下笔者自己的理解. 算法思路 设已经确定的点集为P,初始为空.设还未确定的点集为Q,初始为该图所有点的集合.设已经确定的边为X,初始为空. 选取任意一 ...

  9. 浅谈HyperLogLog底层算法逻辑

    本文是对hyperloglog原理的梳理,整理自知乎答主张戎的回答:大数据领域的近似分析方法(一).内容涉及高中数学的期望,大学的高等数学以及概率论. 就像文章所言,HyperLogLog是大数据基数 ...

最新文章

  1. 机器学习过拟合---范数
  2. 操作系统(十八)进程同步与进程互斥
  3. Android之解决打补丁包后移动端为什么不升级,升级之后出现“应用未安装“,以及更新成功之后反复更新问题
  4. 如何在 vue-cli v3.0 中使用 SCSS/SASS
  5. 如何正确实现 Java 中的 HashCode
  6. [Nikon D80]樱花盛开的校园
  7. 选修课期末html作业,中南大学生命科学导论选修课期末作业
  8. Jenkins小坑之执行Shell
  9. POJ1011———Sticks
  10. 项目开发:网上书店(详细的开发流程记录)----注册登录功能,通过邮件验证
  11. Verilog三段式状态机描述
  12. 【矢量分析】工科矢量分析公式大全
  13. 面料软件_面料管理系统_面料订单管理
  14. 119全国消防日,我们要注意用火安全
  15. 验证码登录开发----手机验证码登录
  16. 无穷级数的简单求解方法——高等数学
  17. 如何实现伸缩 /折叠报表
  18. matlab中图像批量改名字,MATLAB中批量修改文件的名字
  19. 计算机毕业设计springboot交通违章管理系统的设计与实现s7830源码+系统+程序+lw文档+部署
  20. husky v8+prettier+lint-staged+commitlint配置

热门文章

  1. 使用队列思想完成解决击鼓传花问题
  2. 新手如何练习文案写作
  3. 小米手机如何显示悬浮窗
  4. WEB2.0时代我还开网店干什么?
  5. 区块链技术,未来的新竞争
  6. io流中read与readline的区别
  7. Docker 容器start | restart | stop
  8. 数字货币支付模式通过某区块链支付平台在某资金支付项目中的业务处理流程分享
  9. 数字人民币来了,哪些领域会迎来变化
  10. stm32f103rbt6_4