1. 程式人生 > >一個簡單的Hash表演算法 zz

一個簡單的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;
}