数据结构实验之查找七:线性之哈希表

来源:互联网 发布:手机怎样开淘宝店 编辑:程序博客网 时间:2024/09/21 06:32

数据结构实验之查找七:线性之哈希表

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。

输入

连续输入多组数据,每组输入数据第一行为两个正整数N(N <= 1000)和p(p >= N的最小素数),N是关键字总数,p是hash表长度,第2行给出N个正整数关键字,数字间以空格间隔。

输出

输出每个关键字在hash表中的位置,以空格间隔。注意最后一个数字后面不要有空格。

示例输入

5 521 21 21 21 214 524 15 61 884 524 39 61 155 524 39 61 15 39

示例输出

1 1 1 1 14 0 1 34 0 1 24 0 1 2 0
 
/*有关于哈希表的线性探测法解决冲突的方法仔细阅读下例:
  【题目】已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。
  【解答】为了减少冲突,通常令装填因子α(即上题中的素数)由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。     前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。     当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。故探查h1=(2+1)%13=3,此地址开放,所以将15放入T[3]中。     当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。     当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址开放,可将12插入其中。     类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。
*/
 
#include <algorithm>#include <iostream>#include <numeric>#include <cstring>#include <iomanip>#include <string>#include <vector>#include <cstdio>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#define LL long longconst int M = 1001000;const double esp = 1e-6;const double PI = 3.14159265359;const int INF = 0x3f3f3f3f;using namespace std;int arr[1024];int main(){    int n,m,ant;    while(~scanf("%d %d",&n,&m)){        memset(arr,-1,sizeof(arr));        for(int i=0;i<n;i++){            scanf("%d",&ant);            if(arr[ant%m]==-1){                printf(i==0?"%d":" %d",ant%m);                arr[ant%m] = ant;            }            else{                int flag = -1;                for(int j=0;j<m;j++){                    if(arr[j] == ant){                        flag = j;                        break;                    }                }                if(flag!=-1){                    printf(i==0?"%d":" %d",flag);                }                else{                    for(int j=ant%m;1;j++){                        if(arr[j%m]==-1){                            printf(i==0?"%d":" %d",j%m);                            arr[j%m] = ant;                            break;                        }                    }                }            }        }        printf("\n");    }    return 0;}

0 0
原创粉丝点击