資料結構實驗之查詢七:線性之雜湊表

億佰發表於2020-12-16

Description

根據給定的一系列整數關鍵字和素數p,用除留餘數法定義hash函式H(Key)=Key%p,將關鍵字對映到長度為p的雜湊表中,用線性探測法解決衝突。重複關鍵字放在hash表中的同一位置。
G - 資料結構實驗之查詢七:線性之雜湊表
Description
根據給定的一系列整數關鍵字和素數p,用除留餘數法定義hash函式H(Key)=Key%p,將關鍵字對映到長度為p的雜湊表中,用線性探測法解決衝突。重複關鍵字放在hash表中的同一位置。

Input

連續輸入多組資料,每組輸入資料第一行為兩個正整數N(N <= 1500)和p(p >= N的最小素數),N是關鍵字總數,p是hash表長度,第2行給出N個正整數關鍵字,數字間以空格間隔。

Output

輸出每個關鍵字在hash表中的位置,以空格間隔。注意最後一個數字後面不要有空格。

Sample

Input

5 5
21 21 21 21 21
4 5
24 15 61 88
4 5
24 39 61 15
5 5
24 39 61 15 39

Output

1 1 1 1 1
4 0 1 3
4 0 1 2
4 0 1 2 0

程式碼

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int hash[2000];

int n,p;
int add(int k)
{
    int i,j,f,t;
    t = k%p;
    if(hash[t] == -1)
    {
        hash[t] = k;
        f = t;
    }
    else if(hash[t] == k)//檢視是否已經記錄
    {
        f = t;
    }
    else
    {
        for(j = 0; j <p; j++)
        {
            t = (t+1)%p;
            if(hash[t] == -1)
            {
                hash[t] = k;
                f = t;
                break;
            }
            else if(hash[t] == k)
            {
                f = t;
                break;
            }

        }
    }
    return f;
}

int main()
{
    int m,i,j,k,f,t;
    while(scanf("%d%d",&n,&p)!=EOF)
    {
        memset(hash,-1,sizeof(hash));
        for(i = 0; i < n; i++)
        {
            scanf("%d", &k);
            f = add(k);
            if(i == n-1)
            {
                printf("%d\n",f);
            }
            else
            {
                printf("%d ",f);
            }
        }

    }
    return 0;
}

相關文章