SDUT3379資料結構實驗之查詢七:線性之雜湊表
阿新 • • 發佈:2018-12-19
最後一個,線性探測hash表,跟上一個平方探測基本類似,觸類旁通型的。
詳情***看註釋***
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int n,p;
int hash[1510],v[1510];//定義儲存數值的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;//此時的d是用於標記的
int mid = z;//以當前的z值為起點
while(hash[mid]!=-1){//向右尋找
if(hash[mid]==x){//如果hash表中的數值等於目前的數值,只需要記錄下當前的位置即可
v[j++ ] = mid;
d = 0;//標記為已經找到數值的位置
break;
}
mid = (z+f)%p;//線性探測也別忘了對錶長取餘
f++;//越來越遠
}
if(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;
}