100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 数据结构——集合———hash哈希表

数据结构——集合———hash哈希表

时间:2020-06-19 14:32:36

相关推荐

数据结构——集合———hash哈希表

什么是字符串hash?

哈希过程其实可以看做对一个串的单向加密过程,并且需要保证所加的密不能高概率重复;

如通过哈希数组来判断几个串是否相同(洛谷P3370)

可以通过一个固定的转换方式,将相同的串使其的“密”一定相同,不同的串 尽量 不同;

先对比字符串长度然后对比ascll码之和

显然不行

ab和ba是两个不同的串,但ASCLL码之和相同,这个就是HASH冲突

但单向加密哈希中,hash冲突难以避免

进制哈希

核心:给出一个固定机制的base,将一个串的每一个元素看作一个进制上的数字,所以这个串就可以看作一个base进制的数,那么这个就是这个串的哈希值;则我们通过比对每个串的哈希值,即可判断两个串是否相同

而哈希其实就是把一个数转化为一个值,这个值是base进制的,储存在哈希表中,注意一下在存入的时候取模一下即可

什么是哈希?

hash就是像一个函数一样的东西,放入一个值,它给你输出一个值,输出的值就是hash值,一般hash值会比原来的值更好存储或比较

字符串哈希

//自然溢出#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;typedef unsigned long long ull;//0-2^64防止爆栈搞出负数,ull是无符号的,模数ull base=131;//base 应选择不小于字符集数的质数ull a[10010];char s[10010];int n, ans=1;int prime=233317;ull mod=212370440130137957ll;//在允许范围内的最大质数ull hash(char s[]){int len=strlen(s);ull ans=0;for(int i=0;i<len;i++){ans=(ans*base+(ull)s[i])%mod+prime;}return ans;}int main(){cin >>n;for (int i=1;i<=n;i++){cin>>s;a[i]=hash(s);}sort (a+1,a+n+1);for(int i=1;i<n;i++){if( a[i]!=a[i+1]{ans++;}} cout<<ans;return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。