PTA 数据结构与算法题目集(中文) 7-42 整型关键字的散列映射(25 分) 散列表+线性探测法

给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。

输入格式:

输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

输出格式:

在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:

4 5
24 15 61 88

输出样例:

4 0 1 3

 散列表的应用加上线性探测法。。。

注意此题会有重复的元素输入,所以需要将某数的在散列表的位置记录下来。。

代码如下:
 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6;
int n,p;
int vis[maxn]; //判断散列表某点是否已经有元素
int is[maxn];  //判断某一数字是否放入散列表
//初始化
void init ()
{
    memset (vis,0,sizeof(vis));
    memset (is,-1,sizeof(is));
}
int main()
{
    scanf("%d%d",&n,&p);
    init();
    for (int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        int m=x%p;
        //判断是否加入散列表
        if(is[x]!=-1)
            printf("%d",is[x]);
        else if(!vis[m])
        {
            is[x]=m;
            vis[m]=1;
            printf("%d",m);
        }
        else  //线性探测法
        {
            for (int k=1;k<=p/2;k++)
            {
                int temp;
                temp=(m+k)%p;
                //注意不要越界
                if(!vis[temp]&&temp<p)
                {
                    is[x]=temp;
                    vis[temp]=1;
                    printf("%d",temp);
                    break;
                }

            }
        }
        printf("%c",i==n-1? '\n':' ');
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/81984347