哈希表简介

来源:互联网 发布:程序员第一天上班想哭 编辑:程序博客网 时间:2024/06/06 00:26

哈希表原理简介

概念

哈希表(HashTable)又称做散列表,是一种查找高效的数据结构。其基本核心为:根据给定关键字计算关键字在表中的地址(或位置)。该计算方法称为散列函数(或Hash函数)。

与线性表、二叉平衡树不同的是,哈希表的关键字与关键字的地址存在确定的关系,即

地址=hash(关键字)

结构

哈希表的基本结构基于数组,因为数组具有随机访问性质,查询效率高。因为hash冲突的解决方法不同,关键字的存储具有不同的形式。如下所示:

地址

0

1

2

3

4

5

6

7

8

关键字

 

 

 

 

 

 

 

 

 

 

Hash方法

Hash函数,即将关键字映射到地址的常用方法有如下:

[1].    直接定址法。取关键字的某个线性函数作为hash地址。即Hash(key) = a*key+b;

[2].    数字分析法。对关键字key取若干位组成hash地址,原则是使得hash地址尽量避免冲突(对于不同的key尽量避免hash值相同)。如关键字取每个人的出生时间的年、月、日、小时、分钟、秒上的某几位。

[3].    平方取中法。取关键字的平方后的中间若干位作为hash地址。

[4].    除留余数法。最常见的hash方法。对于表长为m的哈希表,哈希地址计算方法为:

Hash_i(key) = key mod m

Hash冲突

定义:当key1≠key2,若Hash(key1)== Hash(key2),则称key1与key2发生了hash冲突。

无论如何选择hash函数,都无法完全避免hash冲突,我们能做的是尽量减少冲突的发生。常见的处理冲突的方法如下:

(1)   开放定地法

开放定址法基本思想为:冲突发生时,使用某种探查方法查找到关键字或者一个空地址。主要可分为以下几种。

      1)线性探查法。从发生冲突的地址c开始,依次探查c的下一个地址,直到找到空位置位置。需注意的是,当探查到表末地址m-1时,下一个探查地址为表首0。探查序列为:

Hash_i(k) = (Hash(k)+i) mod m

线性探查法实现简单,但是容易产生聚集现象。如c地址上发生冲突,在c+1,c+2上进行探查,则本应该散列至c+2上的元素也会因为冲突而继续探查,从而发生一系列连锁冲突反应。

       2)平方探查法。不同与线性探查法,平方探查法的探查序列为:

C+1^2、C-1^2、C+2^2、C-2^2…..

       平方探查法能有效的减少聚集现象,缺点是不能探查到哈希表上的所有元素。但至少能探查到一半的元素。

(2)   链地址法。

用链表将冲突元素链起来。这也是最常见的hash冲突解决办法。如下图所示。

地址

0

1

2

3

4

5

6

7

8

关键字

 

 

 

3->12

 

6->15->24

 

 

 

 

 

 

 


哈希表的性能分析

数据结构中对查找性能的分析主要由查找成功平均比较次数和查找失败平均比较次数。

Ø  查找成功平均比较次数ASL_{1}:找到表中已存在的关键字的平均比较次数。

Ø  查找失败平均比较次数ASL_{2}:表中找不到该关键字,但是找到一个插入位置的平均比较次数。此处为查找表中空位置的平均探查次数

Ø  装载因子:关键字个数和哈希表长度的比值。

哈希表的平均查找长度与装载因子大小有关,而与关键字个数无关。

例子分析:hash函数采用除留余数法,采用链地址解决哈希冲突。哈希表长度为9,计算插入{10,1,13,25,7,21,30,32}的与.

Hash(key) = key mod 9

(一)所得的哈希表如下,链地址采用尾插法:

地址

0

1

2

3

4

5

6

7

8

关键字

 

10->11

 

21->30

13

32

 

25->7

 

 

(二)求ASL_{1}

关键字

10

1

13

25

7

21

30

32

比较次数

1

2

1

1

2

1

2

1




(三)求ASL_{2}

 

地址

0

1

2

3

4

5

6

7

8

关键字

0

2

0

2

1

1

0

2

0





0 0
原创粉丝点击