查找3

112 阅读2分钟

「这是我参与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;
}

总结:

散列表是一个非常牛的查找数据结构。它使关键字之间反复比较变为一步到位,性能提高不少,也是数据结构中最为重要的一个方法。