• hash算法初步


    字符串hash初步是讨论如何用一个整数唯一的表示一个字符串的问题。

    首先来看这么一个问题:如何将一个二维整点坐标P(x,y)用一个整数唯一的表示?(其中0≤x,y≤range)

    很容易想到的是 整数=x*range+y。

    回到字符串hash初步讨论的问题上,想想它的解决方案

    我们不妨设字符串S由A~Z这26个大写字母组成,再不妨把A~Z映射为0~25,这样就可以把26个字母对应到二十六进制中。
    接着,按照二十六进制转换成十进制的方法,即可将这个S转换成一个十进制的数。由进制转换的结论可以知道,这个十进制的数是唯一的,于是上述问题得到解决,下面是实现:

    (小写字母与之类似)

    int hashFunc1(char s[],int len)
    {
        int id=0;
        for(int i=0;i<len;i++)
        {
            id=id*26+(s[i]-'A');
        }
        return id;
    }
    
    int hashFunc2(char s[],int len) { int id=0; for(int i=1;i<len;i++) { if(s[i]>='A'&&s[i]<='Z') id=id*52+(s[i]-'A'); else if(s[i]>='a'&&s[i]<='z') id=id*52+(s[i]-'a')+26;///注意加26,否则输出的值与大写字母相同 } }

    若给n个字符串(恰好由三位大写字母组成),再给出m个询问字符串,问该字符串出现过几次

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn=100;
    char s[maxn][5],temp[5];
    int hashtable[26*26*26+10];
    
    int hashFunc(char s[],int len)
    {
        int id=0;
        for(int i=0;i<len;i++)
        {
            id=id*26+(s[i]-'A');
        }
        return id;
    }
    
    
    
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++) {
            scanf("%s",s[i]);
            int id=hashFunc(s[i],3);
            hashtable[id]++;
        }
        for(int i=0;i<m;i++)
        {
            cin>>temp;
            int id=hashFunc(temp,3);
            cout<<hashtable[id]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    超强问卷调查系统源码购买及二次开发
    asp.net core mvc上传大文件解决方案
    asp.net core mvc发布后显示异常错误信息的方法
    基于.net core 2.0+mysql+AceAdmin搭建一套快速开发框架
    改造kindeditor支持asp.net core mvc上传文件
    Centos7 Nginx安装使用
    Centos7 守护进程supervisord 安装使用
    Centos7 .net core 2.0安装使用
    Centos7 Mysql安装
    Centos7 Redis安装
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9355083.html
Copyright © 2020-2023  润新知