PAT Clase A 1078 Hash

Enlace al título original

Inserte una secuencia de enteros compuesta por varios enteros positivos diferentes en una tabla hash y luego emita la posición del número de entrada.

Una función hash se define como H(key)=key%TSize, donde TSize es el tamaño máximo de la tabla hash.

Las colisiones se resuelven mediante sondeo cuadrático con deltas únicamente positivos.

Tenga en cuenta que el tamaño de la tabla hash es preferiblemente un número primo, si el tamaño máximo proporcionado por el usuario no es un número primo, el tamaño de la tabla debe redefinirse para que sea el número primo más pequeño mayor que el tamaño proporcionado por el usuario.

Formato de entrada
La primera línea contiene dos números enteros, MSize y N, que representan el tamaño de la tabla definida por el usuario y la cantidad de números de entrada, respectivamente.

La segunda línea contiene N enteros positivos diferentes separados por espacios.

Formato de salida
En una línea, muestra la posición correspondiente de cada número de entrada (el índice comienza en 0), los números están separados por espacios y no debe haber espacios adicionales al final de la línea.

Si no se puede insertar un número, se emite -.

El rango de datos es
1≤MSize≤104,
1≤N≤MSize, y
los números de entrada están todos en el rango de [1,105].

Ejemplo de entrada:
4 4
10 6 4 15
Ejemplo de salida:
0 1 4 -

Mi solución:

#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;
}

premio:

Hay dos formas en que las tablas hash resuelven conflictos, el método zip y el método de direccionamiento abierto. Esta pregunta requiere un  método de detección secundario incremental positivo , de modo que key + 1^2, key+2^2 y key+3^2 se buscan secuencialmente las vacantes insertar

Supongo que te gusta

Origin blog.csdn.net/weixin_45660485/article/details/126071129
Recomendado
Clasificación