一个简单的Hash表算法 zz
2005-10-14 22:19
459 查看
一个简单的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;
}
关键字是一个整数。
#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;
}
相关文章推荐
- 【zz】一个简单的同步算法
- 一个将阿拉伯数字转换成中文大写的最简单算法
- 一个基于Java的简单分组处理算法
- 一个51单片机的键盘扫描程序,算法简单有效
- 【素养】由一个简单算法想到的程序员素养问题
- 使用Python语言写一个简单的KMP模式匹配算法实现
- 一个简单的波形包络提取算法
- 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )
- 一个简单的多机器人编队算法实现--PID
- 如何写一个简单的手写识别算法?
- 一个简单的算法题
- 水下图像增强相关算法的一个简单小结。
- 一个最简单的加密解密算法(人人能懂)
- ZZ一些简单算法
- 一个dijkstra的简单算法
- 由一个简单算法想到的程序员素养问题
- 一个简单的算法题
- 一个简单最大正向匹配(Maximum Matching)MM中文分词算法的实现
- 一个简单的JavaScript日期计算算法
- SSE图像算法优化系列十:简单的一个肤色检测算法的SSE优化。