第七章 哈希表

                上章回顾

常见的排序算法有哪些

其中那种算法的效率最高

对大量的数据进行排序的化最好使用那种排

序算法

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             第七章

第七章

哈希表 哈希表

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

               预习检查

哈希表的定义

处理冲突的方法有那些

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                     本章结构

哈希表 哈希表

哈希函数的构造方法

哈希函数的构造方法

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

什么是哈希表

什么是哈希表

处理冲突的方法

处理冲突的方法

                  课程目标

了解什么是哈希表

掌握如何构造哈希函数

处理冲突的方式

哈希表的查找及分析

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1 哈希表 哈希表又称散列表。

哈希表存储的基本思想是:以数据表中的每个记录的关 键字 k为自变量,通过一种函数H(k)计算出函数值。把这个 值解释为一块连续存储空间(即数组空间)的单元地址(即下 标),将该记录存储到这个单元中。在此称该函数H为哈希函 数或散列函数。按这种方法建立的表称为哈希表或散列表。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 6

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

              7.1 哈希表

例如,要将关键字值序列(3,15,22,24),存储到编号为0到4的表 长为5的哈希表中。

计算存储地址的哈希函数可取除5的取余数算法H(k)=k % 5。则构造好的 哈希表如图所示。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 7

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1 哈希表

理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系, 从而使得查找只需一次计算即可完成。由于关键字值的某种随机性,使 得这种一一对应关系难以发现或构造。因而可能会出现不同的关键字对 应一个存储地址。即k1≠k2,但H(k1)=H(k2),这种现象称为冲突。

把这种具有不同关键字值而具有相同哈希地址的对象称同义词。 在大多数情况下,冲突是不能完全避免的。这是因为所有可能的关键字

的集合可能比较大,而对应的地址数则可能比较少。 对于哈希技术,主要研究两个问题:

(1)如何设计哈希函数以使冲突尽可能少地发生。 (2)发生冲突后如何解决。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 8

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.1 哈希函数的构造方法

构造好的哈希函数的方法,应能使冲突尽可能地少,因而 应具有较好的随机性。这样可使一组关键字的散列地址均匀地 分布在整个地址空间。根据关键字的结构和分布的不同,可构 造出许多不同的哈希函数。

1.直接定址法 直接定址法是以关键字k本身或关键字加上某个数值常量c

作为哈希地址的方法。该哈希函数H(k)为:

H(k)=k+c (c≥0)

这种哈希函数计算简单,并且不可能有冲突发生。当关键

字的分布基本连续时,可使用直接定址法的哈希函数。否则,

若关键字分布不连续将造成内存单元的大量浪费。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 9

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                     7.1.1 哈希函数的构造方法

例:统计某地区从1949年到1995年每年出生的人数,列在一张表中。 年份为关键字,因共有47年,所以表中位置范围是1~47。

设置H(k)=k-1948即可,其中k为年份数。 这样的哈希表示意如下:

年份 人数

1 1949

2 ... 47 1950 1995

...

... ... ...

若要查1970年的出生人数,则根据(1970- 1948=22)计算,在表的第22个位置即可找到。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 10

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.1 哈希函数的构造方法

2.除留余数法 取关键字k除以哈希表长度m所得余数作为哈希函数地址的

方法。即:

H(k)=k%m

这是一种较简单、也是较常见的构造方法。这种方法的关 键是选择好哈希表的长度m。使得数据集合中的每一个关键字 通过该函数转化后映射到哈希表的任意地址上的概率相等。理 论研究表明,在m取值为素数(质数)时,冲突可能性相对较 少。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 11

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                         7.1.1 哈希函数的构造方法

3.平方取中法 取关键字平方后的中间几位作为哈希函数地址(若超出

范围时,可再取模)。

设有一组关键字ABC,BCD,CDE,DEF,......其对应的机 内码如表所示。假定地址空间的大小为1000,编号为0- 999。现按平方取中法构造哈希函数,则可取关键字机内码 平方后的中间三位作为存储位置。计算过程如下表所示:

2011-11-13

12

关键字 机内码

机内码的平方数

哈希地址

ABC 010203

0104101209 101

BCD 020304

0412252416 252

CDE 030405

0924464025 464

DEF 040506

1640739036 739

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git... ... ...

...

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.1 哈希函数的构造方法

4.折叠法 这种方法适合在关键字的位数较多,而地址区间较

小的情况。

将关键字分隔成位数相同的几部分。然后将这几部 分的叠加和作为哈希地址(若超出范围,可再取模)。

例如,假设关键字为某人身份证号码 430104681015355,则可以用4位为一组进行叠加。即有 5355+8101+1046+430=14932,舍去高位。

则有H(430104681015355)=4932 为该身份证关键字的哈希函数地址。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 13

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.1 哈希函数的构造方法

5.数值分析法

  若事先知道所有可能的关键字的取值时,可通过

对这些关键字进行分析,发现其变化规律,构造出相

应的哈希函数。

例:对如下一组关键字通过分析可知:每个关键字从 左到右的第l,2,3位和第6位取值较集中,不宜作哈 希地址。

剩余的第4,5,7和8位取值较分散,可根据实际需 要取其中的若干位作为哈希地址。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 14 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                 7.1.1 哈希函数的构造方法

  若取最后两位作为哈希地址,则哈希地址的集

合为下表所示:

关键字

哈希函数地址

92317602 2 92326875 75 92739628 28 92343634 34 92706816 16 92774638 38 92381262 62

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 15

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

假设哈希表的地址范围为0~m-l,当对给定的关键 字k,由哈希函数H(k)算出的哈希地址为i(0≤i≤m-1) 的位置上已存有记录,这种情况就是冲突现象。

处理冲突就是为该关键字的记录找到另一个的哈

希地址。即通过一个新的哈希函数得到一个新的哈希地 址。如果仍然发生冲突,则再求下一个,依次类推。直至 新的哈希地址不再发生冲突为止。

常用的处理冲突的方法有开放地址法、链地址法两大 类

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 16

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

1.开放定址法

用开放定址法处理冲突就是当冲突发生时,形成一个地址 序列。沿着这个序列逐个探测,直到找出一个的开放地

址。将发生冲突的关键字值存放到该地址中去。

如 Hi=(H(k)+d(i)) % m, i=1,2,...k (k<m-1)

其中H(k)为哈希函数,m为哈希表长,d为增量函数, d(i)=dl,d2...dn-l。

  增量序列的取法不同,可得到不同的开放地址处理冲突探

测方法。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 17

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

(1)线性探测法

线性探测法是从发生冲突的地址(设为d)开始,依次探 查d+l,d+2,...m-1(当达到表尾m-1时,又从0开始探查)

等地址,直到找到一个空闲位置来存放冲突处的关键字。

  若整个地址都找遍仍无空地址,则产生溢出。

  线性探查法的数学递推描述公式为:

d0=H(k)

di=(di-1+1)% m (1≤i≤m-1)

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 18

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

【例】已知哈希表地址区间为0~10,给定关键字序列(20,30,70,15, 8,12,18,63,19)。哈希函数为H(k)=k%ll,采用线性探测法处理冲 突,则将以上关键字依次存储到哈希表中。试构造出该哈希表,并求出等 概率情况下的平均查找长度。

假设数组为A, 本题中各元素的存放过程如下: H(20)=9,可直接存放到A[9]中去。 H(30)=8,可直接存放到A[8]中去。 H(70)=4,可直接存放到A[4]中去。 H(15)=4,冲突;

d0=4

d1=(4+1)%11=5,将15放入到A[5]中。 H(8)=8,冲突;

d0=8

d1=(8+1)%11=9,仍冲突; d2=(8+2)%11=10,将8放入到A[10]中。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 19

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

H(12)=l,可直接存放到A[1]中去。 H(18)=7,可直接存放到A[7]中去。 H(63)=8,冲突;

d0=8

d1=(8+1)%11=9,仍冲突; d2=(8+2)%11=10,仍冲突; d3=(8+3)%11=0,将63放入到A[0]中。

H(19)=8,冲突; d0=8

d1=(8+1)%11=9,仍冲突; d2=(8+2)%11=10,仍冲突; d3=(8+3)%11=0,仍冲突; d4=(8+4)%11=1,仍冲突; d5=(8+5)%11=2,将19放入到A[2]中。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 20

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                        7.1.2 冲突的解决方法

由此得哈希表如图所示

0 1 2 3 4 5 6 7 8 9 10 A 63 12 19 70 15 18 30 20 8

探查次数4 1 6 1 2 1 1 1 3

在等概率情况下成功的平均查找长度为: (1*5+2+3+4+6)/9 =20/9

利用线性探查法处理冲突容易造成关键字的堆积问题。这是因为 当连续n个单元被占用后,再散列到这些单元上的关键字和直接散列到

后面一个空闲单元上的关键字都要占用这个空闲单元,致使该空闲单元 很容易被占用,从而发生非同义冲突。造成平均查找长度的增加。

为了克服堆积现象的发生,可以用下面的方法替代线性探查法。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 21

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

(2)平方探查法

设发生冲突的地址为d,则平方探查法的探查序列为: d+12,d+22,...直到找到一个空闲位置为止。

平方探查法的数学描述公式为:

d0=H(k)

di=(d0+i2) % m (1≤i≤m-1)

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 22

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

【例】已知哈希表地址区间为0~10,给定关键字序列(20, 30,70,15,8,12,18,63,19)。哈希函数为H(k)=k%ll,采 用平方探查法处理冲突。

【解】 H(20)=9,可直接存放到A[9]中去。 H(30)=8,可直接存放到A[8]中去。 H(70)=4,可直接存放到A[4]中去。 H(15)=4,冲突;

d0=4

d1=(4+12) % 11=5,放到A[5]中。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 23

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

H(8)=8,冲突;

d0=8

d1=(8+12) % 11=9,仍冲突 d2=(8+22) % 11=1 放到A[1]中。

H(12)=l,冲突;

d0=1

d1=(1+12) % 11=2,放到A[2]中。 H(18)=7,可直接存放到A[7]中去。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 24

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.2 冲突的解决方法

H(63)=8,冲突;

d0=8

d1=(8+12) % 11=9,仍冲突 d2=(8+22) % 11=1,仍冲突 d3=(8+32) % 11=6,放到A[6]中。

H(19)=8,冲突;

d0=8

d1=(8+12) % 11=9,仍冲突

d2=(8+22) % 11=1,仍冲突

d3=(8+32) % 11=6,仍冲突

d4=(8+42)% 11= 2,仍冲突

d5=(8+52) % 11=0,放到A[0]中

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 25

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                        7.1.2 冲突的解决方法

建立的哈希表如图所示:

0 1 2 3 4 5 6 7 8 9 10

A 19 8 12 70 15 63 18 30 20 探查次数6 3 2 1 2 4 1 1 1

在等概率情况下成功的平均查找长度为: (1*4+2*2+3+4+6)/9 =21/9

平方探查法是一种较好的处理冲突的方法,可以避免出现堆积问 题。它的缺点是不能探查到哈希表上的所有单元,但至少能探查到 一半单元。

例如,若表长m=13,假设在第3个位置发生冲突,则后面探查的 位置依次为4712620,即可以探查到一半单元。

若解决冲突时,探查到一半单元仍找不到一个空闲单元。则表明 此哈希表太满,需重新建立哈希表。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 26

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                 7.1.2 冲突的解决方法

2.链地址法

2011-11-13

27

用链地址法解决冲突的方法是:把所有关键字为同义

词的记录存储在一个线性链表中,这个链表称为同义词链 表。并将这些链表的表头指针放在数组中(下标从0m- 1)。这类似于图中的邻接表和树中孩子链表的结构。

0

^

^

1

12

2

^ ^

3

4

70 15

^

5

^ ^

6

7

18

^

8 30 8 63 19

^

9

20

^

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

10

^

             7.1.2 冲突的解决方法

链地址法查找分析

由于在各链表中的第一个元素的查找长度为l,第二个元素的查找长度 为2,依此类推。因此,在等概率情况下成功的平均查找长度为:

(1*5+2*2+3*l+4*1)/9=16/9 虽然链地址法要多费一些存储空间,但是彻底解决了堆积问题,

大大提高了查找效率。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 28

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.3 哈希表的查找及性能分析

哈希法是利用关键字进行计算后直接求出存储地址的。当哈希函数能 得到均匀的地址分布时,不需要进行任何比较就可以直接找到所要查的 记录。但实际上不可能完全避免冲突,因此查找时还需要进行探测比 较。

在哈希表中,虽然冲突很难避免,但发生冲突的可能性却有大有小。这 主要与三个因素有关。

第一:与装填因子有关

所谓装填因子是指哈希表中己存入的元素个数n与哈希表的大小m的比 值,即 =n/m。

当 越小时,发生冲突的可能性越小,越大(最大为1)时,发生冲突 的可能性就越大。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 29

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             7.1.3 哈希表的查找及性能分析

第二:与所构造的哈希函数有关

  若哈希函数选择得当,就可使哈希地址尽可能均匀地

分布在哈希地址空间上,从而减少冲突的发生。否则,若

哈希函数选择不当,就可能使哈希地址集中于某些区域,

从而加大冲突的发生。

第三:与解决冲突的哈希冲突函数有关

  哈希冲突函数选择的好坏也将减少或增加发生冲突的

可能性。

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 30

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             有关哈希表的算法

1.基于开放地址法的哈希表的建立

#define NIL -1

#define M 997

typedef int KeyType;

typedef struct node{

KeyType key;

//表长度 //哈希表结点类型

//其他数据域 }HashType;

用除余法求K的哈希地址的函数h

int h(KeyType K)

{ return K%M; }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 31

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             Increment是求增量序列的函数,它依赖于解决冲突的方法

int Increment(int i) //用线性探查法求第i个增量di { return i; }

求在哈希表T[0..M-1]中第i次探查的哈希地址hi,0≤i≤M-1

int Hash(KeyType k,int i)

{ return (h(k)+Increment(i))%M; }

在哈希表T[0..M-1]中查找K,成功时返回1。失败有两种情况:找到一个开放址时返回0;表满未找到时返 回-1

int HashSearch(HashType T[],KeyType K,int *pos) { int i=0; //记录探查次数

do{ *pos=Hash(K,i); //求探查地址hi

}while(++i<M);

return -1; }

//最多做M次探查 //表满且未找到时,查找失败

if(T[*pos].key==K) return 1; if(T[*pos].key==NIL) return 0; //查找到空结点返回

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

32

2011-11-13

             将新结点newnode插入哈希表T[0..M-1]中

void Hashlnsert(HashType T[],HashType newnode) { int pos,sign;

}

sign=HashSearch(T,newnode.key,&pos); if(!sign) //找到一个开放的地址pos

T[pos]=newnode; //插入新结点newnode,插入成功 else //插人失败

if(sign>0) printf("重复的关键字!");

else { printf(表满错误,终止程序执行!); exit(0);}

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 33

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             根据A[0..n-1]中结点建立哈希表T[0..M-1]

void CreateHashTable(HashType T[],HashType A[],int n) { if(n>M){ //用开放定址法处理冲突时,装填因子α须不大于1

printf("装填因子α须不大于1");

     exit(0); }

for(i=0;i<M;i++)

T[i].key=NIL; //将各关键字清空,使地址i为开放地址 for(i=0;i<n;i++) //依次将A[0..n-1]插入到哈希表T[0..m-1]中

   Hashlnsert(T,A[i]);

}

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 34

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             2.基于链地址法的哈希表的建立

#define M 997

  typedef int KeyType;

  typedef struct chain{

KeyType key;

  struct chain *next;

}ChainType;

int h(KeyType K)

  { return K%M; }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 35

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             在链地址表示的哈希表中某条链中查找关键字K,找到返回该记录地址;否则返回空值;

ChainType *HashSearch(ChainType *Ti,

KeyType K,ChainType **end)

{ ChainType *pre,*cur;

pre=NULL; cur=Ti;

while(cur!=NULL && cur->key!=K){ //查找

pre=cur; cur=cur->next; }

*end=pre;

if(cur==NULL) return NULL; //查找不到时,返回空值 else return cur; //查找到时,返回该记录地址 }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 36

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             在链地址的哈希表T中若找不到关键字为K的记录,则插入该记录

int HashInsert(ChainType *T[],KeyType K)

{ ChainType *pre,*cur;

i=h(K); cur=HashSearch(T[i],K,&pre); if(cur==NULL){ //未找到时,在链表尾插入该记录

cur=(ChainType *)malloc(sizeof(ChainType));

cur->key=K; cur->next=NULL; if(pre==NULL) //在该链插入第一条记录

T[i]=cur;

else //在该链插入后续记录

   pre->next=cur; return l; }

return 0;}

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 37

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             根据A[0..n-1]中结点建立哈希表T[0..m-1]

void CreateHashTable(ChainType *T[],ChainType A[],int n)

{ int i;

  for(i=0;i<n;i++)

   HashInsert(T,A[i]);

}

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

2011-11-13 38

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             阶段小节

  哈希算法的基本思想是什么

  哈希算法的存储效率主要取决于什么   哈希算法解决冲突的方式有哪些

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                         本章总结

哈希表 哈希表

哈希函数的构造方法

哈希函数的构造方法

讲解哈希函数的几种构造方式

什么是哈希表

什么是哈希表

处理冲突的方法

处理冲突的方法

如何处理哈希表的冲突

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

了解哈希表的定义

                                          实验1 实验内容

题目:创建一个哈希表用于存放随机数。

实验目的

掌握哈希函数的构造方法

掌握哈表表处理冲突的方法

实验分析

创建一个哈希表 随即生成1000个随机数字存入哈希表中

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

原文地址:https://www.cnblogs.com/askDing/p/5443677.html