DS哈希查找—二次探测再散列

2023-07-30 13:33:47 浏览数 (1)

题目描述

定义哈希函数为H(key) = key。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。

输入

测试次数t

每组测试数据格式如下:

哈希表长m、关键字个数n

n个关键字

查找次数k

k个待查关键字

输出

对每组测试数据,输出以下信息:

构造的哈希表信息,数组中没有关键字的位置输出NULL

对k个待查关键字,分别输出:

0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

输入样例1 

1 12 10 22 19 21 8 9 30 33 4 41 13 4 22 15 30 41

输出样例1

22 9 13 NULL 4 41 NULL 30 19 8 21 33 1 1 1 0 3 1 3 8 1 6 6

AC代码

代码语言:javascript复制
#include<iostream>

using namespace std;

int main() {
    int t, m, n, k, temp;
    cin >> t;
    while (t--) {
        cin >> m >> n;
        int hash[m];
        for (int i = 0; i < m; i  )
            hash[i] = 0x3f3f3f3f;
        while (n--) {
            cin >> temp;
            int h = temp % 11;
            if (hash[h] == 0x3f3f3f3f)
                hash[h] = temp;
            else {
                for (int i = 1, j = 1;; i  ) {
                    int plus;
                    if (i % 2 == 0)
                        plus = -j * j;
                    else
                        plus = j * j;
                    plus = (h   m   plus) % m;
                    if (hash[plus] == 0x3f3f3f3f) {
                        hash[plus] = temp;
                        break;
                    }
                    if (i % 2 == 0)
                        j  ;
                }
            }
        }
        for (int i = 0; i < m - 1; i  )
            if (hash[i] == 0x3f3f3f3f)
                cout << "NULL ";
            else
            cout<<hash[i]<<' ';
            if(hash[m-1]==0x3f3f3f3f)
                cout<<"NULL"<<endl;
            else cout<<hash[m-1]<<endl;
        cin>>k;
        while (k--) {
            cin >> temp;
            int h = temp % 11,count=2;
            if(hash[h]==temp){
                cout<<"1 1 "<<h 1<<endl;
            }else if(hash[h]==0x3f3f3f3f){
                cout<<"0 0"<<endl;
            }else {
                for (int i = 1, j = 1;; count  ,i  ) {
                    int plus;
                    if (i % 2 == 0)
                        plus = -j * j;
                    else
                        plus = j * j;
                    plus = (h   m   plus) % m;
                    if (hash[plus] == temp) {
                        cout<<"1 "<<count<<' '<<plus 1<<endl;
                        break;
                    }else if(hash[plus]==0x3f3f3f3f){
                        cout<<"0 "<<count<<endl;
                        break;
                    }
                    if (i % 2 == 0)
                        j  ;
                }
            }
        }
    }
    return 0;
}

0 人点赞