题175.2021秋周练习-3-4 整型关键字的散列映射 (25 分)


题175.2021秋周练习-3-4 整型关键字的散列映射 (25 分)


一、题目

在这里插入图片描述

二、题解

考察除留余数法+线性探测。注意一点,当关键值重复时有可能是碰到了之前一样的data,此时应该输出之前data对应的关键值,判断依据就是那个所谓的hashdata[pos]==data了。

#include <bits/stdc++.h>

using namespace std;

int hashdata[10001];//我们设一个一维数组hashdata,下标表示关键值,即散列到的位置,数组元素表示存放的数据。

int main()
{
    fill(hashdata,hashdata+10001,-1);//我们可以确保要放的数必定是非负数,不然除留余数得到了负数位置你就对头吗
    int N,P;
    cin>>N>>P;
    for(int i=0; i<N; i++)
    {
        int data;
        scanf("%d",&data);
        int j=0;
        while(1)//直接一个无限循环除留余数找位置,在循环里头满足条件再退出去
        {
            int pos=(data+(j++))%P;//每过一个循环j就会加1,即往后探测一位(当然求余之后可能位置会跑前面去)
            if(hashdata[pos]==-1||hashdata[pos]==data)//当pos位置未被占用或者那个位置放的就是当前data,则停止找位置,做输出操作
            {
                hashdata[pos]=data;
                if(i>0)
                {
                    putchar(' ');
                }
                printf("%d",pos);
                break;
            }
            if(j==P)//所有位置都已经放过了,退出来
            {
                break;
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值