Hash PAT Clase A 1145 - Tiempo promedio de búsqueda

Enlace al título original

La tarea para este problema es simple:

Primero inserte una secuencia de enteros que consta de varios enteros positivos diferentes en una tabla hash, luego intente encontrar otra secuencia de clave-valor entero de la tabla y genere el tiempo de búsqueda promedio (el tiempo de búsqueda se refiere a si se encuentra un valor en la tabla el número de operaciones de comparación realizadas en ).

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 tres enteros positivos MSize, N, M, que representan respectivamente el tamaño de la tabla definida por el usuario, el número de enteros insertados y el número de valores clave que se buscarán.

La segunda fila contiene N enteros positivos diferentes que representan la secuencia de inserción.

La tercera línea contiene M enteros positivos, que representan secuencias de clave-valor.

Los números en la misma fila están separados por espacios y los números enteros contenidos en las dos secuencias no exceden de 105.

Formato de salida
Si no se pueden insertar algunos números, se emiten secuencialmente en el siguiente formato, un número por línea:

No se puede insertar X.
Donde X representa un número que no se puede insertar.

La última línea genera el tiempo de búsqueda promedio de M búsquedas, con un lugar decimal reservado.

Nota: Si se buscan tiempos de TSize y hay un número en cada posición de búsqueda, pero no son iguales al número que se busca, entonces se considera que el tiempo de búsqueda es TSize+1.

Rango de datos
1≤MSize,N,M≤104
Ejemplo de entrada:
4 5 4
10 6 4 15 11
11 4 15 2
Ejemplo de salida:
no se puede insertar 15.
2.8

Mi solución:

#include <bits/stdc++.h>
using namespace std;

const int N = 10010;
int n, m, s;
int h[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 x, int &count){
    int t = x % s;
    for(int i = 0; i < s; i ++ ){
        int j = (t + i * i) % s;
        if(h[j] == 0 || h[j] == x) return j;
        else count ++ ;
    }
    return -1;
}

int main(){
    cin >> s >> n >> m;
    while(!is_prime(s)) s ++;
    
    for(int i = 0; i < n; i ++ ){
        int x, count = 1;
        cin >> x;
        int t = find(x, count);
        
        if(t == -1) printf("%d cannot be inserted.\n", x);
        else h[t] = x;
    }
    
    int cnt = 0;
    for(int i = 0; i < m; i ++ ){
        int x, count = 1;
        cin >> x;
        int t = find(x, count);
        cnt += count;
    }
    printf("%.1lf", (double) cnt / m);
    return 0;
}

premio:

Utilice la misma función para la búsqueda y el almacenamiento de hash

Supongo que te gusta

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