散列表查找实现

来源:互联网 发布:如何判断存在sql注入 编辑:程序博客网 时间:2024/04/27 10:46

1. 散列表算法实现

结构定义

#define HASHSIZE 12typedef 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. 散列表的装填因子。所谓的装填因子α=填入表中的记录个数/散列表长度,α越大,产生冲突的可能性就越大。散列表的平均查找长度取决于装填因子的大小,而不是个数的多少,所以将散列表开的比查找范围大一些,性能会更高。

原创粉丝点击