1. 散列表算法实现
结构定义
#define HASHSIZE 12
typedef struct
{
int *elem; /* 数据元素存储基址,动态分配数组 */
int count; /* 当前数据元素个数 */
}HashTable;
int m = 0; /* 散列表表长,全局变量 */
初始化
/* 初始化散列表 */
Status InitHashTable(HashTable *H)
{
int i;
m = HASHSIZE;
H->count = m;
H->elem = (int *)malloc(m*sizeof(int));
for(i=0;i<m;i++)
H->elem[i] = NULLKEY;
return OK;
}
散列函数
/* 散列函数 */
int Hash(int key)
{
return key % m; /* 除留余数法 */
}
插入
/* 插入关键字进散列表 */
void InsertHash(HashTable *H, int key)
{
int addr = Hash(key);
while (H->elem[addr]!=NULLKEY)
addr = (addr+1) % m; /* 开放定址法的线性探测 */
H->elem[addr] = key;
}
查找
/* 散列表查找关键字 */
Status SearchHash(HashTable H, int key, int *addr)
{
*addr = Hash(key);
while (H.elem[*addr]!=key)
{
*addr = (*addr+1) % m;
if (H.elem[*addr] == NULLKEY || *addr == Hash(key))
{
/* 如果循环到原点 */
return UNSUCCESS; /* 说明关键字不存在 */
}
}
return Success;
}
性能分析
没有冲突的情况下,散列查找的时间复杂度是O(1)。
散列查找的平均查找长度取决于以下几种因素:
1. 散列函数是否均匀
2. 处理冲突的方法
3. 散列表的装填因子。所谓的装填因子α=填入表中的记录个数/散列表长度,α越大,产生冲突的可能性就越大。散列表的平均查找长度取决于装填因子的大小,而不是个数的多少,所以将散列表开的比查找范围大一些,性能会更高。