首页 > 其他 > 详细

进阶实验8-2.1 逆散列问题 (30分)

时间:2020-03-26 21:50:15      阅读:58      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 解题思路:

1、有效数字(非负数)存入数组b[],并将b[]升序;

2、按b数组从小到大的顺序,逐个计算hash地址pos,寻找出被使用hash地址pos(线性探测法解决冲突),再从b数组中寻找到最小的适合的数据,将此数存入ans中,并标记visit和vs数组,重复步骤2;

 

     

#include <stdio.h>
#include <string.h>
#define Max 1000
int cmp(int *x,int *y) {
    return *x-*y;
}
int main() {
    int n;
    scanf("%d",&n);
    int i,j,k=0;
    int a[n],b[n],visit[n],vs[n],ans[n];
    for(i=0; i<n; i++) {
        scanf("%d",&a[i]);
        if(a[i]>=0)
            b[k++]=a[i];
        visit[i]=0;
        vs[i]=0;
        ans[i]=0;
    }
    qsort(b,k,sizeof(b[0]),cmp);
    int flag,cnt=0;
    for(i=0; i<k; i++) {
        for(j=0; j<k; j++) {
            if(visit[j])continue;
            flag=1;
            int pos;
            for(pos=b[j]%n;;) {
                if(!vs[pos]&&b[j]==a[pos]) {
                    ans[i]=b[j];
                    vs[pos]=1;
                    visit[j]=1;
                    flag=0;
                    break;
                }
                if(!vs[pos])
                    break;
                pos++;
                if(pos==n)
                    pos=0;
            }
            if(!flag)
            break;
        }
        
    }

    for(i=0; i<k; i++) {
        if(i)
            printf(" ");
        printf("%d",ans[i]);
    }
    printf("\n");
    return 0;
}

 

进阶实验8-2.1 逆散列问题 (30分)

原文:https://www.cnblogs.com/snzhong/p/12577400.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!