SDUT3377資料結構實驗之查詢五:平方之雜湊表
阿新 • • 發佈:2018-12-19
不妨看看註釋吖
因為是刷題的原因,所以註釋沒有那麼的詳細,但是一切盡在註釋中
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int n,p;
int hash[510],v[510];//定義儲存數值的hash表,定義儲存數值在hash表中的位置的v陣列(位諧音v)
while(cin>>n>>p){
memset(hash,-1,sizeof( hash));//給hash表賦初值-1
int j = 0;//j用來記錄位置函式v的增加
for(int i=0; i<n; i++){
int x;
cin>>x;
int z = x%p;//每一個值對錶長進行取餘
if(hash[z]==-1){//如果雜湊表的當前位置沒有值,則把數值放到此地,並記錄下數值在hash表中的位置,j++
hash[z] = x;
v[j++] = z;
}
else{//否則的話開始平方探測,直至探測到沒有值的位置
int f = 1;
int d = 1;
int mid = z;//以當前的z值為中心
while(hash[mid]!=-1){//向兩邊尋找
mid = (z+f*d*d)%p;//每一次平方探測,都需要對錶長取餘
f = -f;
if(f==1)
d++ ;
}
hash[mid] = x;
v[j++] = mid;
}
}
for(int i=0; i<j; i++){
if(i==j-1)
cout<<v[i]<<endl;
else
cout<<v[i]<<" ";
}
}
return 0;
}