一個簡單的Hash表演算法 zz
一個簡單的Hash表演算法
關鍵字是一個整數。
#define M 100 //表長度,一般選擇為素數值
int t[M]; //Hash table
void makenull(int t[]); //Hash表的初始化,為0表示還沒有填入元素
{
int i;
for(i=0;i<M;i++)
t[i]=0;
}
int search(int t[],int k) //Hash表的搜尋
{
int i,j;
i=h(k); //求Hash數
for(j=0;j<M&&t[(i+j)%M]!=k&&t[(i+j)%M]!=0;j++); //三種情況:發生碰撞;未找到;找到
i=(i+j)%M;
if(t[i]==k) return i;
return -1;
}
int insert(int t[],int k)
{
int i,j;
i=h(k);
for(j=0;j<M&&t[(i+j)]%M!=k&&t[(i+j)%M>0;j++);
i=(i+j)%M;
if(t[i]<=0) //has been deleted or is empty
t[i]=k;
return 0;
}
return 1;
}
int delete1(int t[],int k)
{
int i,j;
i=h[k];
for(j=0;j<M&&t[(i+j)]%M!=k&&t[(i+j)%M!=0;j++);
i=(i+j)%M;
if(t[i]==k) //has this element
{
t[i]=-1;
return 0;
}
return 1;
}
-----------------------------------------------------------------------------------------------------------------------------
以上演算法是我從baidu上搜到的,我按照教材例子重寫如下,贈強了程式碼的簡潔性:
#define p 97 //p是不大於M的最大素數,除留餘數法構造Hash函式: h(key)=key%p (p<m)
int SearchHash(int t[],int k, int &p) //Hash表的搜尋
{
p=h(k); //求Hash數
int j = 0;
while( t[p]!=k && t[p]!=NULLKEY && j<M) //發生碰撞,採用開放定址法-線性探測再雜湊
p=(p+j)%M;
if( t[p] == k) return SUCCESS;
else return FAILURE; //沒有找到,找到一個空位置或者j=m
}
int InsertHash(nt t[],int k, int &p)
{
int p;
if( search(t[M], k, p) ) return DUPLICATED; //k已存在
else if(t[p] = NULLKEY) t[p] = k; return OK; //插入到空位置
else return HASHISFULL;
}