AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

数组模拟哈希的完成“值”和“下标”的映射

作者: 作者的头像   well188 ,  2021-02-22 18:17:31 ,  阅读 23


0


数组是“下标”和“值”的一对映射,实际使用中,有时会用到“值”和“下标”的映射,就是告诉你“值”是多少,在接近 O(1)的时间找到对应的“下标”。 坑人的是 noi 竞赛中到现在没有 unorder_map 这个库,用 map 虽然可以,但会拖慢效率。在看了y总的模拟hash的方法后,我就一直用模拟hash来解决此类问题。

#include <cstdio>
#include <cstring>
using namespace std;
//H要取质数,且比映射的总量多3-5倍,如果量超过1万,2倍也可以,但量在1000一下,至少3倍,个人经验
const int N=110,H=997,null=0x3f3f3f3f;//H和null哈希专用
int a[N],n;
int h[H],mp[H];//h数组放的是查询值x
int find(int x){//x是要查询的值,算出对应的hash值,这个hash值作为h和mp数组的下标,然后h和mp数组的值就是一对映射
    int t=(x%H+H)%H;
    while(h[t]!=null && h[t]!=x){//若h[t]==null,在其他地方要把x放到h[t]里面
        t++;
        if(t==H) t=0;
    }
    return t;
}
int main(){
    memset(h,0x3f,sizeof h);
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    //把需要查询的变量作为find计算的x值
    for(int i=0;i<n;i++){
        int hi=find(a[i]);
        h[hi]=a[i],mp[hi]=i;//h数组的值是要查询的值,mp放的是另一个映射值
    }
    for(int i=0;i<5;i++){
        int t;scanf("%d",&t);
        int ht=find(t);
        printf("%d = %d\n",mp[ht],h[ht]);
    }
    return 0;
}

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息