问题 B: DS哈希查找—二次探测再散列(关键字互不相同

简介: 问题 B: DS哈希查找—二次探测再散列(关键字互不相同

文章目录


问题 B: DS哈希查找—二次探测再散列(关键字互不相同)
时间限制: 1 Sec  内存限制: 128 MB
提交: 123  解决: 57
[提交][状态][讨论版]
题目描述
定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。
输入
测试次数t
每组测试数据格式如下:
哈希表长m、关键字个数n
n个关键字(关键字为互不相同的正整数)
查找次数k
k个待查关键字
输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:
0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)
样例输入
1
12 10
22 19 21 8 9 30 33 4 41 13
4
22
15
30
41
样例输出
22 9 13 NULL 4 41 NULL 30 19 8 21 33
1 1 1
0 3
1 3 8
1 6 6
提示

直奔代码

// 问题 B: DS哈希查找—二次探测再散列(关键字互不相同)
#include<iostream>
using namespace std;
#define INF -99
int main()
{
    int t;
    cin >> t;
    while( t-- ){
        int m, n;
        cin >> m >> n;
        int * a = new int[m]; 
        for( int i=0; i<m; i++) a[i] = INF;
        // 建表
        while( n-- ){
            int num ; 
            cin >> num;
            int di = 1;
            int h = num%11;
            if(a[h]==INF){
                a[h] = num;
                continue;
            }
            while( true ){
                int t1 = (h+di*di)%m;
                int t2 = (h-di*di)%m;
                t2 = t2<0 ? (t2+m) : t2;
                /*******
                 * 重点: 这里一定要注意对t2的取值范围进行处理,小于0的时候要进行循环移位
                 * 博主再初学这个的时候,可是被他坑惨了呜呜
                 * 
                 * ******/
                if( a[t1] == INF ){
                    a[t1] = num;
                    break;
                } else if( a[t2] == INF ){
                    a[t2] = num;
                    break;
                }
                else{
                     di++;
                }
            }
        }
        for(int i=0; i<m; i++){
            if(a[i] == INF ) cout<<"NULL"<<" ";
            else cout<<a[i]<<" ";
        }
        cout << endl;
        int k;
        cin >> k;
        while(k--) {
            int f;
            cin >> f;
            int h = f%11;
            int times = 0;
            int flag = 0;              // 没找到为0, 找到为1
            int tf = 0;
            int di = 1;
             /**************
              * 查找分三种情况:
              * 1. 要找的关键字的hash地址为空
              * 2. 要找的关键字的hash地址不为空且等于关键字
              * 3. 要找的关键字的hash地址不为空,也不等于关键字,则进行二次探测(平方)
              * 
              * #### 注意比较次数自加的位置
              *     1. 先和自身的hash地址比较,不匹配则+1
              *     2. 和t1 = (h+di*di)%m; t1的地址比较,不成功则+1
              *     3. 和t2 = (h-di*di)%m; t2 的地址比较,不成功则+1
              * **********/
             times ++;
             if(a[h]==INF){             // 第一种情况     
                 cout<<0<<" "<<times<<endl;
             }
             else{
                 if( a[h]==f ){         // 第二种情况
                     cout<< 1 << " " << times << " " << h+1 <<endl;
                     continue;
                 }
                 while(true){           // 第三种情况
                    int t1 = (h+di*di)%m;
                    int t2 = (h-di*di)%m;
                    t2 = t2<0 ? (t2+m) : t2;
                    times++;
                    if( a[t1]==f ){
                         cout<<1<<" "<<times<<" "<<t1+1<<endl;
                         flag = 1;
                         break;
                     }
                    times++;
                    if( a[t2]==f ){
                         cout<<1<<" "<<times<<" "<<t2+1<<endl;
                         flag = 1;
                         break;
                     }
                    if(a[t1]==INF || a[t2]==INF ){
                        break;
                    }
                     di ++;
                 }
                 if( flag==0 ){
                     cout<<0<<" "<<times<<endl;
                 }
             }
        }
    }
    return 0;
}


相关文章
|
2天前
|
存储 索引
什么是哈希表?它的工作原理是什么?
在我们的日常生活中,我们经常需要存储和查找各种信息,这些信息可能是电话号码,地址,或者是商品的价格等等。这些信息的存储和查找,就像是我们在一个巨大的仓库中存放和寻找物品。这个仓库就是数据结构,而其中一个最常用的,也是最高效的数据结构就是哈希表。
17 2
|
8月前
问题 A: DS哈希查找—线性探测再散列
问题 A: DS哈希查找—线性探测再散列
|
8月前
|
安全
深入解析哈希表、哈希映射和并发哈希映射的区别,以及死锁的成因和解决方案
深入解析哈希表、哈希映射和并发哈希映射的区别,以及死锁的成因和解决方案
|
2天前
|
存储 C++ 容器
C++【哈希表的模拟实现】
C++【哈希表的模拟实现】
31 0
|
9月前
|
存储 算法 Serverless
【哈希的模拟实现】
【哈希的模拟实现】
52 0
趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突
导读: 本文从哈希表传统设计与解决思路入手,深入浅出地引出新的设计思路:从尽量规避哈希冲突,转向了利⽤合适的哈希冲突概率来优化计算和存储效率。新的哈希表设计表明 SIMD 指令的并⾏化处理能⼒的有效应⽤能⼤幅度提升哈希表对哈希冲突的容忍能⼒,进⽽提升查询的速度,并且能帮助哈希表进⾏极致的存储空间压缩。
|
移动开发 算法 C++
模拟哈希的实现
模拟哈希的实现
|
算法 安全 程序员
战斗要同步,又要有随机,怎么办?大佬告诉我这么做
在游戏开发中,有个需求就是在客户端的战斗行为需要在其他的客户端上进行同步播放,但是战斗中一些随机的技能,伤害等没办法同步,遇到这样的问题怎么办?是时候展现随机数的魅力。在开始战斗的时候从服务器获取一个随机种子,然后在不同的客户端用同一个种子进行随机,得到的随机数也会保持一致,完美的完成了策划的需求。
101 0
战斗要同步,又要有随机,怎么办?大佬告诉我这么做
|
机器学习/深度学习 存储
1719. 重构一棵树的方案数 : 构造 + 验证(合法性 + 非唯一性)
1719. 重构一棵树的方案数 : 构造 + 验证(合法性 + 非唯一性)
|
C# 数据处理
C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)
原文:C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值) 1、问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电压值 电池个数 0.
1650 0