雜湊表的實現 除留餘數法
阿新 • • 發佈:2019-02-03
查詢有兩種方式,比較式查詢和計算式查詢,而計算式查詢則通過雜湊表來實現。給定表M,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的地址,則稱表M為雜湊(Hash)表,函式f(key)為雜湊(Hash) 函式;更通俗來說,雜湊表通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這裡用除留餘數法來構造雜湊表和開放地址法中的線性探測再雜湊來處理不同關鍵字通過雜湊函式對映到同一地址的衝突。
1、除留餘數法:取關鍵字被某個不大於散列表表長m的數p除後所得的餘數為雜湊地址。即 H(key) = key MOD p,p<=m。
2、線性探測再雜湊:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)為雜湊函式,m為散列表長,di=1,2,3,…,m-1
具體程式如下
#include<stdio.h>
#define N 13
//雜湊函式(除留餘數法)
int HS(int key){
return key%N;
}
//在雜湊表中查詢key,若找到返回其所在的位置,否則將key插入雜湊表或表滿則返回-1
int thread(int key,int m,int addr[]){
int i,j;
i=HS(i);//計算key的雜湊地址
if(addr[i]==key){//若key在雜湊表中則返回所在位置
return i;
}
i--;
j=(i+1)%m;//線性探測再雜湊處理衝突
while(addr[j]!=key&&addr[j]!=0 ){
if(j!=i){
j=(j+1)%m;
}else{
return -1;//表滿
}
}
if(addr[j]==key) return j;
if(addr[j]==0){
addr[j]=key;//若找到空位置則插入
return j;
}
}
int main(){
int i,j,m,n,num[N],addr[N];
printf("輸入元素的個數:");
scanf("%d",&n);
printf("輸入各元素值,用空格隔開:");
for(i=0;i<n;i++){
scanf("%d ",&num[i]);
}
printf("\n");
for(i=0;i<N;i++){
addr[i]=0;
}
for(i=0;i<n;i++){
thread(num[i],N,addr);
}
printf("所得雜湊表如下所示:\n");
for(i=0;i<N;i++){
printf("%5d",i);
}
printf("\n");
for(i=0;i<N;i++){
if(addr[i]!=0){
printf("%5d",addr[i]);
}else{
printf("%5c",' ');
}
}
printf("\n\n");
printf("輸入要查詢或要插入的元素值:");
scanf("%d",&j);
m=thread(j,N,addr);
printf("%d所在的位置是:%d\n",j,m);
}