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

什么是字符串hash?

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

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

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

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

显然不行

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

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

  1. 进制哈希

核心:给出一个固定机制的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值