「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
散列表查找(哈希表)
存储位置 = f(关键字) 存储中有一种技术叫散列技术,它是在记录的存储位置和它的关键字之间建立一个缺点的对应关系f,使每个关键字key对应一个存储位置f(key)。
这种对应关系f称为散列函数,又称为哈希函数。
采用散列技术将记录存储在一块连续的存储空间中。
这种连续存储空间称为哈希表。
散列技术既是一种存储方法,也是一种查找方法,其与线性表,树,图等结构不同。散列技术间不存在什么逻辑关系,只与关键字有关联。
散列函数的构造方法:
直接定址法:取关键字的某个线性函数值为散列地址。
f(key) = a * key + b
此方法需事先知道关键字的分布情况,适合查找表小且连续的情况。
数字分析法:使用关键字的一部分来计算散列存储位置的方法,这是散列表中的常用方法。
此方法适合处理关键字位数比较大,分布比较均匀的情况。
平方取中法:
适合不知道关键字的分布且位数不是很大。
折叠法:将关键字从左到右分成相等的几部分,然后叠加求和,并按散列表表长,取后几位作为散列地址。
适合不知道关键字的分布且位数较大。
除余留数法:最常用的构造散列函数方法。
f(key) = key mod p(p<=m)
此方法可以直接对关键字取模,也可以在折叠、平方取中后取模。、
随机数法:选择一个随机数,取关键字的随机函数值为它的散列地址。
f(key) = random(key)
总结: 我们需要考虑一下因素来采用不同的散列表
1.计算散列地址所需时间。
2.关键字长度以及分布情况。
3.散列表大小等。
实际情况中散列情况比较复杂,考虑因素比较多,这也是比较难的一个原因。
散列表结构的初始化:
Struct 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 1;
}
散列函数:
int Hash(int key)
{
return key % m;
}
总结:
散列表是一个非常牛的查找数据结构。它使关键字之间反复比较变为一步到位,性能提高不少,也是数据结构中最为重要的一个方法。