zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    WSGI详解
    WSGI、flup、fastcgi、web.py的关系
    全面解读python web 程序的9种部署方式
    python对web服务器做压力测试并做出图形直观显示
    6个最佳的开源Python应用服务器
    用 Python 脚本实现对 Linux 服务器的监控
    浅谈图片服务器的架构演进
    Python中使用Flask、MongoDB搭建简易图片服务器
    流行python服务器框架
    搜索引擎技术之概要预览
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9355083.html
Copyright © 2011-2022 走看看