其他分享
首页 > 其他分享> > 教你几招HASH表查找的方法

教你几招HASH表查找的方法

作者:互联网

摘要:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。

本文分享自华为云社区《查找——HASH》,原文作者:ruochen。

对于频繁使用的查找表,希望 ASL = 0
记录在表中位置和其关键字之间存在一种确定的关系

HASH

定义

根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”

HASH函数的构造

直接定址法

 

数字分析法

平方取中法

折叠法

除留余数法

为什么要对 p 加限制?

给定一组关键字为: 12, 39, 18, 24, 33, 21若取 p=9, 则他们对应的哈希函数值将为:
3, 3, 0, 6, 6, 3

可见,若 p 中含质因子 3, 则所有含质因子 3 的关键字均映射到“3 的倍数”的地址上,从而增加了“冲突”的可能

随机数法

考虑因素

  1. 执行速度(即计算哈希函数所需时间)
  2. 关键字的长度
  3. 哈希表的大小
  4. 关键字的分布情况
  5. 查找频率

采用何种构造哈希函数的方法取决于建表的关键字集合的情况
原则是使产生冲突的可能性降到尽可能地小

处理冲突的方法

1. 开放定址法

基本思想

线性探测法

一旦冲突,就找下一个空地址存入

二次探测法

di = 12, -12, 22, -22, …±k2

伪随机探测法

Hi=(Hash(key)+di) mod m ( 1≤i < m )
其中:m为哈希表长度
di 为随机数

开放定址法建立哈希表步骤

开放定址哈希表的存储结构

/* ------------- 开放定址哈希表的存储结构 ------------- */

int hashsize[] = {997, ...};
typedef struct{
    ElemType* elem;
    int count;  // 当前数据元素个数
    int sizeindex;  // hashsize[sizeindex]为当前容量
} HashTable;

#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1

Status SearchHash(HashTable H, KeyType K, int &p, int &c){
    // 在开放定址哈希表H中查找关键码为K的记录
    p = Hash(K);  // 求得哈希地址
    while(H.elem[p].key != NULLKEY && !EQ(K, H.elem[p].key))
        collisiion(p, ++c);  // 求得下一探测地址p
    if(EQ(K, H.elem[p].key)) return SUCCESS;  // 查找成功,返回待查数据元素位置 p
    else return UNSUCCESS;  // 查找不成功
}

2. 再HASH法

3. 链地址法

基本思想

优点:

哈希表的查找

对于给定值 K,计算哈希地址 i = H(K)

案例v01

案例v02

哈希表查找的分析

从查找过程得知,哈希表查找的平均查找长度实际上并不等于零

决定哈希表查找的ASL的因素

α 越大,表中记录数越多,说明表装得越满,发生冲突的可能性就越大,查找时比较次数就越多

  1. 对哈希表技术具有很好的平均性能,优于一些传统的技术
  2. 链地址法优于开地址法
  3. 除留余数法作哈希函数优于其它类型函数

哈希表应用举例

编译器对标识符的管理多是采用哈希表

 

点击关注,第一时间了解华为云新鲜技术~

标签:HASH,key,关键字,地址,查找,哈希,几招,函数
来源: https://www.cnblogs.com/huaweiyun/p/14980540.html