开放定址哈希表的存储结构是什么样的?
开放定址哈希表的存储结构:
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
int hashsize[] = {997, /*...*/}; // 哈希表容量递增表,一个合适的素数序列
typedef struct {
ElemType *elem; // 数据元素存储基址,动态分配数组
int count; // 当前数据元素个数
int sizeindex; // hashsize[sizeindex]为当前容量
} HashTable;
如何为一组关键字构造哈希函数并建立哈希表?
- 分析数据;
- 构建合适的哈希函数及解决冲突的方法;
- 用哈希函数对数据计算存储位置,存储数据;
- 对哈希表进行查找;
哈希表适合的场合是什么?
-
查找操作频繁:哈希表的主要优点是查找速度快,平均时间复杂度可以达到O(1)。如果一个应用需要频繁地查找数据,那么哈希表可能是一个好的选择。
-
插入和删除操作频繁:哈希表支持高效的插入和删除操作。如果一个应用需要频繁地插入和删除数据,那么哈希表也可能是一个好的选择。
-
无需数据排序:哈希表不支持对数据进行排序。如果一个应用不需要对数据进行排序,或者排序操作不是性能瓶颈,那么可以使用哈希表。
-
键是可哈希的:哈希表需要使用一个哈希函数将键转换为数组索引。如果一个应用的键是可哈希的(例如,整数、字符串等),那么哈希表是一个好的选择。
-
键值对存储:哈希表是一种键值对的数据结构,如果需要存储的数据可以以键值对的形式表示,那么哈希表是一个很好的选择。
决定哈希表查找的ASL的因素有哪些?
哈希查找过程与给定值进行比较的关键字的个数取决于(决定哈希表查找的ASL的因素):
- 哈希函数;
- 处理冲突的方法;
- 哈希表饱和的程度,装载因子α=n/m 值的大小(n=表中填入的记录数,m=表的长度)