PAT クラス A 1078 ハッシュ

元のタイトルへのリンク

いくつかの異なる正の整数から構成される整数列をハッシュ テーブルに挿入し、入力された数値の位置を出力します。

ハッシュ関数は H(key)=key%TSize として定義されます。TSize はハッシュ テーブルの最大サイズです。

衝突は、正のデルタのみを使用した二次プローブを使用して解決されます。

ハッシュ テーブルのサイズは素数であることが望ましいことに注意してください。ユーザーが指定した最大サイズが素数でない場合、テーブル サイズはユーザーが指定したサイズより大きい最小の素数になるように再定義する必要があります。

入力形式
最初の行には、ユーザー定義テーブルのサイズと入力数値の数をそれぞれ表す 2 つの整数 MSize と N が含まれています。

2 行目には、スペースで区切られた N 個の異なる正の整数が含まれています。

出力形式
入力された各数値の対応する位置を 1 行に出力します (インデックスは 0 から始まります)。数値はスペースで区切られ、行末に余分なスペースを含めることはできません。

数字が入力できない場合は、-が出力されます。

データ範囲は
1≤MSize≤104、1≤N≤MSizeで

入力数値はすべて [1,105] の範囲になります。

入力例:
4 4
10 6 4 15
出力例:
0 1 4 -

私の解決策:

#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int h[N];
int s, n;
bool is_prime(int n){
    if(n == 1) return false;
    for(int i = 2; i * i <= n; i ++ ){
        if(n % i == 0) return false;
    }
    return true;
}

int find(int t){
    int k = t % s;
    for(int i = 0; i < s; i ++ ){
        int j = (k + i * i) % s;
        if(h[j] == 0) return j;
    }
    return -1;
}

int main(){
    cin >> s >> n;
    while(!is_prime(s)) s ++;
    

    for(int i = 0; i < n ; i ++ ){
        int x;
        cin >> x;
        
        int t = find(x);
        if(t == -1) cout << "-";
        else{
            h[t] = x;
            cout << t;
        }
        if(i != n - 1) cout << ' ';
    }
    return 0;
}

褒美:

ハッシュ テーブルが競合を解決するには、ジッパー メソッドとオープン アドレッシング メソッドの 2 つの方法があります。この質問では、 正の増分二次検出メソッドが必要です。つまり、key + 1^2、key+2^2、および key+3^2空席を順次検索します。

おすすめ

転載: blog.csdn.net/weixin_45660485/article/details/126071129