• 字符串--哈希


    哈希是一个非常常用的字符串的操作,最常见的是判断两个字符串是否相等。

    判断两个字符串是否相等可以用暴力求解的方法,比如先判断两个字符串的长度,然后再枚举判断每一位,复杂度O(n)。

    可是这样的复杂度你能忍受吗?我们有没有比较更优的方法呢?

    下面就是我们要介绍的方法:哈希

    哈希是将一个字符串上的每一位字符映射成一个一个的权值的做法。做法的大致流程很简单,首先设一个进制数base,并设一个模数mod,而哈希其实就是把一个数转化为一个值,这个值是base进制的,储存在哈希表中,注意一下在存入的时候取模一下即可。比如说现在有一个字符串orzc,枚举这个字符串的每一位,与base相乘得到ans,然后mod一下,就得到orzc的哈希值

    但是这个方法有一个弊端,哈希冲突

    何为哈希冲突?比如说ab,ba,他们映射之后的哈希值是一样的。我们减少哈希冲突的方法也有很多,比如自然溢出,双模数哈希。

    下面就推荐一道哈希的模板题

    下面是这道题的单哈希的AC代码

     1 #include<bits/stdc++.h>
     2 #define ull unsigned long long
     3 using namespace std;
     4 char s[2000];
     5 ull a[10001];
     6 int n,sum;
     7 ull hashe(const char *str)
     8 {
     9     ull hash=0;
    10     ull seed = 19260817;
    11     while(*str)
    12         hash = hash*seed+(*str++);
    13     return (hash % 1000000007);
    14 }
    15 int main()
    16 {
    17     cin >> n;
    18     for(int i=1; i<=n; i++)
    19     {
    20         cin >> s;
    21         int ans=hashe(s);
    22         a[i]=ans;
    23     }
    24     sort(a+1,a+1+n);
    25     for(int i=1; i<=n; i++)
    26         if(a[i]!=a[i+1])
    27             sum++;
    28     cout<<sum;
    29 }
    View Code

    因为双哈希难被卡,所以我们就不提供双哈希的代码了

  • 相关阅读:
    tomcat集群--单tomcat多实例
    nginx 轮询模式 nginx_upstream_jvm_route 插件安装
    nginx 反向代理配置
    HP SiteScope安装
    visualVM远程监控JVM
    robotium 测试APK<一> 建立测试工程
    jmeter的http post请求与测试Java请求
    第 10 天
    第 1~8 天复习
    第 9 天 python操作mysql数据库
  • 原文地址:https://www.cnblogs.com/ifmyt/p/9414502.html
Copyright © 2020-2023  润新知