• PTA 7-42 整型关键字的散列映射(手写哈希表的线性探测法)


    本题考点:

    • 整型哈希表的线性探测法

    给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
    输入格式:
    输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
    输出格式:
    在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
    输入样例:
    4 5
    24 15 61 88
    输出样例:
    4 0 1 3

    这道题考察的是哈希表的线性探测法。

    哈希函数直接用求余即可,有冲突默认到下一位,保存之后同时记录下每个保存数字的位置,如果插入相同的数字时,直接返回该数字所在的位置。

    完整代码实现如下:

    #include <iostream>
    using namespace std;
    
    #define MAXN 2000
    
    int N, P; // 正整数个数,素数
    bool hashTable[MAXN] = {false};
    int isIn[MAXN]; // 如果这个关键字存在了,那么保存它的位置
    
    int main()
    {
        fill(isIn, isIn + MAXN, -1);
        fill(hashTable, hashTable + MAXN, false);
        scanf("%d%d", &N, &P);
        int num, pos;
        for (int i = 0; i < N; i++)
        {
            scanf("%d", &num);
            if (isIn[num] < 0)
            {   // 这个数字不存在
                pos = num % P; // 保存最后保存的位置
                while (hashTable[pos] == true)
                { // 如果已经被占满了
                    if (pos == P - 1)
                        pos = 0;
                    else
                        pos += 1;
                }
                if (i > 0)
                    printf(" %d", pos);
                else
                    printf("%d", pos);
                hashTable[pos] = true;
                isIn[num] = pos;
            }
            else
            {
                printf(" %d", isIn[num]);
            }
        }
    
        return 0;
    }
    
  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/veeupup/p/12678181.html
Copyright © 2020-2023  润新知