El séptimo capítulo del trabajo de búsqueda de estructura de datos (corregido)

Verdadero o falso

1-1
Almacene M elementos en una tabla hash representada por una matriz de longitud S, entonces el factor de llenado de la tabla es M / S.

T F

Libro de texto P226: El factor de llenado α de la tabla hash se define como = el número de registros llenados en la tabla / la longitud de la tabla hash;

1-2
Incluso si dos elementos están agrupados en una tabla con 100 unidades, aún puede haber conflictos.

T F

Esta pregunta examina principalmente que la función hash se puede cambiar. La elección del conflicto se basa en la elección de la función;
Libro de texto P223: Elegir una función hash "buena" puede reducir los conflictos hasta cierto punto, pero en aplicaciones prácticas, es es difícil evitar por completo los conflictos, por lo que elegir un método eficaz para manejar los conflictos es otra cuestión clave del hash;

1-3
Hash 10 elementos en una tabla hash de 100 000 unidades y no habrá conflictos.

T F

Debido a la selección de la función hash, aún pueden producirse conflictos de direcciones, que no pueden evitarse en absoluto, lo
mismo que 1-2;

Opción multiple

2-1
Dada una tabla de secuencia L con una longitud de 16, los elementos están ordenados por palabras clave. Si se utiliza el método de búsqueda binaria para encontrar un elemento que no existe en L, el número máximo de comparaciones de palabras clave es:

A. 4
B. 5
C. 6
D. 7

El número máximo de comparaciones para la búsqueda binaria es
Inserte la descripción de la imagen aquí
log (16) + 1 = 4 + 1 = 5;

2-2
Utilice la búsqueda binaria para encontrar un número determinado de 100 enteros ordenados. En el peor de los casos, el número de comparaciones necesarias es:

A. 7
B. 10
C. 50
D 99

El número máximo de comparaciones para la búsqueda binaria es
Inserte la descripción de la imagen aquí
2 ^ 6 = 64;
log (100) + 1 = 6 + 1 = 7;

2-3
Entre los siguientes métodos de búsqueda, el método de búsqueda cuya longitud de búsqueda promedio no tiene nada que ver con el número de nodos es:

A. Búsqueda en orden
B. Dicotomía
C. Use tablas hash (hash)
D. Usar árbol de búsqueda binaria

La característica del método de búsqueda de la tabla hash es que la longitud de búsqueda promedio no tiene nada que ver con el número de nodos n;

2-4 Si
10 elementos se codifican en una tabla hash de 100.000 unidades, ¿hay algún conflicto?

A. Ciertamente
B. Quizás
C. Ciertamente no
D. Una probabilidad entre diez mil

2-5
Suponga que el rango de direcciones de la tabla hash es [0,16] y la función hash es H (Clave) = Clave% 17. El método de detección lineal se usa para tratar el conflicto, y la secuencia de teclas {26, 25, 72, 38, 8, 18, 59} se almacena secuencialmente en la tabla hash. La dirección del elemento 59 almacenado en la tabla hash es:

A. 8
B. 9
C. 10
D. 11

Libro de texto P223: Método de detección lineal: este método de detección puede imaginar la tabla hash como una tabla circular. Cuando se produce un conflicto, se busca en la celda vacía desde la siguiente celda de la dirección en conflicto. Si no se encuentra ninguna celda vacía en la última posición, luego regrese Continúe para buscar en la cabecera de la tabla hasta que encuentre un espacio, luego coloque este elemento en este espacio. Si no se encuentra espacio, la tabla hash está llena y se requiere un procesamiento de desbordamiento.
Proceso:
26% 17 = 9, entonces la dirección 9 almacena 26;
25% 17 = 8, entonces la dirección 8 almacena 25;
72% 17 = 4, entonces la dirección 4 almacena 72;
38% 17 = 4, porque la dirección 4 entra en conflicto, vaya Mueva una unidad hacia abajo, por lo que la dirección 5 almacena 38;
8% 17 = 8, porque la dirección 8 tiene conflictos, baje una unidad, y debido a que la dirección 9 tiene conflictos, baje una unidad, entonces la dirección 10 almacena 8;
18% 17 = 1 así que la dirección 1 almacena 18;
59% 17 = 8, porque la dirección 8 conflictos, baja una unidad, y porque aborda 9 conflictos, baja una unidad, y porque aborda 10 conflictos, baja una unidad, Entonces la dirección 11 almacena 59;

2-6
Al buscar un nodo cuyo valor es igual a X de una lista enlazada individualmente con N nodos, ¿cuántos nodos deben compararse en promedio si la búsqueda tiene éxito?

A. N / 2
B. N
C. (N − 1) / 2
D. (N + 1) / 2

Encuentre un nodo cuyo valor sea igual ax en una lista enlazada individualmente con n nodos. En el caso de una búsqueda exitosa, (n + 1) / 2 nodos deben compararse en promedio.
Dado que la lista enlazada individualmente solo se puede buscar en un orden unidireccional, tomando la búsqueda del primer nodo como ejemplo, el número de nodos que deben compararse para encontrar el m-ésimo nodo f (m) = m, el mejor caso para una búsqueda exitosa es la primera vez Si la búsqueda es exitosa, solo se compara 1 nodo. En el peor de los casos, la búsqueda es exitosa al final y es necesario comparar n nodos.
Así que hay un total de n casos y, en promedio, los nodos que se van a comparar son (1 + 2 + 3 + ... + (n-1) + n) / n = (n + 1) / 2.
Textbook P193;

2-7
Utilice una búsqueda binaria para una tabla ordenada de longitud 10. Si la búsqueda no tiene éxito, al menos el número de comparaciones requeridas es ().

A. 4
B. 3
C. 5
D. 6

Dibuja un árbol de ordenamiento binario y saldrá después de una comparación. Halla la profundidad del árbol.
Inserte la descripción de la imagen aquí
Entonces, ¿al menos cuántas veces? ? ¿duda? ?

Preguntas de programación

7-1 Consulta de cliente VIP de aerolínea (25 puntos)

Muchas aerolíneas ofrecen servicios de membresía preferenciales. Cuando el millaje de un cliente se acumula a una cierta cantidad, los puntos de millaje se pueden usar para canjear directamente boletos de premio o ascensos de clase de premio. Dados los registros de vuelo de todos los miembros de una aerolínea, es necesario realizar la función de consultar rápidamente los puntos de kilometraje de los miembros en función del número de identificación.

Formato de entrada: la
entrada primero da dos números enteros positivos N (≤10 ^ 5) y K (≤500). Entre ellos, K es el kilometraje mínimo, es decir, para atender a los miembros que toman vuelos de corto radio, las aerolíneas también acumularán vuelos con un alcance menor a K kilómetros como K kilómetros. Las siguientes N líneas, cada línea da un registro de vuelo. El formato de entrada del registro de vuelo es: número de identificación de 18 dígitos (espacio) kilometraje de vuelo. El número de identificación se compone de 17 dígitos y el último código de verificación. El rango de valores del código de verificación es 0-9 y 11 símbolos x; la unidad de kilometraje de vuelo es kilómetros, que está dentro del intervalo (0, 15 000) An Luego, dé un entero positivo M (≤10 ^ 5), y luego proporcione el número de identificación del solicitante de M líneas.

Formato de salida:
para cada persona de la consulta, se proporciona el valor actual de acumulación de millas. Si la persona no es miembro, se emite No Info. Cada resultado de la consulta ocupa una fila.

Muestra de entrada:

4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x

Salida de muestra:

800
15000
1000
No Info
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN 10005
typedef long long LL;
/*
hash表
*/

typedef struct node
{
    
    
    char id[20];
    LL miles;
    struct node* next;
}*List;
typedef struct tb
{
    
    
    LL Tablesize;
    List *list;
}*Hashlist;
LL Hash(char key[],LL size)
{
    
    
    LL tmp = 0;
    for(LL i=13;i<18;i++)
    {
    
    
        if(key[i]=='x')
            tmp = (tmp*10+10)%size;
        else
            tmp = (tmp*10 + key[i]-'0')%size;
    }
    return tmp;
}
LL NextPrim(LL x)
{
    
    
    LL j;
    for(LL i=x;;i++)
    {
    
    
        for(j=2;j*j<=i;j++)
            if(i%j==0)
                break;
        if(j*j>i)
            return i;
    }
}
Hashlist Init(LL size)
{
    
    
    Hashlist H = (Hashlist)malloc(sizeof(tb));
    H->Tablesize = NextPrim(size);
    H->list = (List*)malloc(sizeof(List)*H->Tablesize);
    for(LL i=0;i<H->Tablesize;i++)
    {
    
    
        H->list[i] = (List)malloc(sizeof(node));
        H->list[i]->next = NULL;
    }
    return H;
}
List Find(char key[],Hashlist H)
{
    
    
    List t = H->list[Hash(key,H->Tablesize)];
    List p = t->next;
    while(p!=NULL && strcmp(key,p->id))
        p = p->next;
    return p;
}
void Insert(char key[],LL miles,Hashlist H)
{
    
    
    List t = H->list[Hash(key,H->Tablesize)];
    List f = Find(key,H);
    if(f==NULL)
    {
    
    
        List tmp = (List)malloc(sizeof(node));
        tmp->miles = miles;
        strcpy(tmp->id,key);
        tmp->next = t->next;
        t->next = tmp;
    }
    else
    {
    
    
        (f->miles) += miles;
    }
}

int main()
{
    
    
    char id[20];
    LL tmp,n,m,k;
    scanf("%lld%lld",&n,&k);
    Hashlist H = Init(n);
    for(LL i=0;i<n;i++)
    {
    
    
        scanf("%s%lld",id,&tmp);
        if(tmp<k) tmp = k;
        Insert(id,tmp,H);
    }
    scanf("%lld",&m);
    for(LL j=0;j<m;j++)
    {
    
    
        scanf("%s",id);
        List f = Find(id,H);
        if(f==NULL)
            printf("No Info\n");
        else
            printf("%lld\n",f->miles);
    }
}

Supongo que te gusta

Origin blog.csdn.net/Jessieeeeeee/article/details/107029762
Recomendado
Clasificación