数据结构(十一)散列表结构

散列表实践

数据结构(十一)散列表结构

h(x)=x mod 10 的结果:

4371 mod 10=1

1323 mod 10=3

6173 mod 10=3

4199 mod 10=9

4344 mod 10=4

9679 mod 10=9

1989 mod 10=9

  • 分离链接的散列表

将散列到同一个值的所有元素保留在一个链表中

数据结构(十一)散列表结构

  • 使用线性探测的散列表

hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i,i为发生冲突的次数,f(0)=0。逐个探测散列表,若发生冲突,则插入到下一个空单元中

数据结构(十一)散列表结构

  • 使用平方探测的散列表

hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i2,i为

发生冲突的次数,f(0)=0。

c. 平方探测:hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i2,i为

发生冲突的次数,f(0)=0。

1) 首先插入4371,h0(4371)=(4371(mod 10)+f(0))mod 10=1,故插入1位置。

2) 插入1323,h0(1323)=(1323(mod 10)+f(0))mod 10=3,故插入3位置。

3) 插入6173,h0(6173)=(6173(mod 10)+f(0))mod 10=3,故插入3位置,此时发

生冲突(与1323插入同一位置)。

发生第一次冲突,计算h1(6173)=(6173(mod 10)+f(1))mod 10=4,故插入4位 置。

4) 插入4199,h0(4199)=(4199(mod 10)+f(0))mod 10=9,故插入9位置。

5) 插入4344,h0(4344)=(4344(mod 10)+f(0))mod 10=4,故插入4位置,此时发

生冲突(与6173插入同一位置)。

发生第一次冲突计算h1(4344)=(4344(mod 10)+f(1))mod 10=5,故插入5位置。

6) 插入9679,h0(9679)=(9679(mod 10)+f(0))mod 10=9,故插入9位置,此时发

生冲突(与4199插入同一位置)。

发生第一次冲突计算h1(9679)=(9679(mod 10)+f(1))mod 10=0,故插入0位置。

7) 插入1989,h0(1989)=(1989(mod 10)+f(0))mod 10=9,故插入9位置,此时发

生冲突(与4199插入同一位置)。

发生第一次冲突计算h1(1989)=(1989(mod 10)+f(1))mod 10=0,故插入0位置, 此时发生冲突(与9679插入同一位置)。

发生第二次冲突计算h2(1989)=(1989(mod 10)+f(2))mod 10=3,故插入3位置, 此时发生冲突(与1323插入同一位置)。

发生第三次冲突计算h3(1989)=(1989(mod 10)+f(3))mod 10=8,故插入8位置。

数据结构(十一)散列表结构

  • 使用第二个散列函数h2(X)=7-(X mod 7)进行双散列的散列表

h2(X)=7-(X mod 7)的结果:

hash(4371)=7-3=4

hash(1323)=7-0=7

hash(6173)=7-6=1

hash(4344)=7-4=3

hash(4199)=7-6=1

hash(9679)=7-5=2

hash(1989)=7-1=6

hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i*hash2(x),

i为发生冲突的次数,f(0)=0。题中hash2(x)=7-(x mod 7)。

 

 

1) 首先插入4371,h0(4371)=(4371(mod 10)+f(0))mod 10=1,故插入1位置。

2) 插入1323,h0(1323)=(1323(mod 10)+f(0))mod 10=3,故插入3位置。

3) 插入6173,h0(6173)=(6173(mod 10)+f(0))mod 10=3,故插入3位置,此时发

生冲突(与1323插入同一位置)。

4) 发生第一次冲突,计算hash2(6173)=7-(6173 mod 7)=1,f(1)=1*hash2(6173)=1,

h1(6173)=(6173(mod 10)+f(1))mod 10=4,故插入4位置。

5) 插入4199,h0(4199)=(4199(mod 10)+f(0))mod 10=9,故插入9位置。

6) 插入4344,h0(4344)=(4344(mod 10)+f(0))mod 10=4,故插入4位置,此时发

生冲突(与6173插入同一位置)。

发生第一次冲突,计算hash2(4344)=7-(4344 mod 7)=3,f(1)=1*hash2(4344)=3, h1(4344)=(4344(mod 10)+f(1))mod 10=7,故插入7位置。

7) 插入9679,h0(9679)=(9679(mod 10)+f(0))mod 10=9,故插入9位置,此时发

生冲突(与4199插入同一位置)。

发生第一次冲突,计算hash2(9679)=7-(9679mod 7)=2,f(1)=1*hash2(9679)=2,

h1(9679)=(9679(mod 10)+f(1))mod 10=1,故插入1位置,此时发生冲突(与4371插入同一位置)。

发生第二次冲突,计算f(2)=2*hash2(9679)=4,h1(9679)=(9679(mod

10)+f(2))mod 10=3,故插入3位置,此时发生冲突(与1323插入同一位置)。

发生第三次冲突,计算f(3)=3*hash2(9679)=6,h1(9679)=(9679(mod

10)+f(3))mod 10=5,故插入5位置。

8) 插入1989,h0(1989)=(1989(mod 10)+f(0))mod 10=9,故插入9位置,此时发

生冲突(与4199插入同一位置)。

发生第一次冲突计算hash2(1989)=7-(1989 mod 7)=6,f(1)=1*hash2(1989)=6,

h1(1989)=(1989(mod 10)+f(1))mod 10=5,故插入5位置,此时发生冲突(与9679插入同一位置)。

发生第二次冲突,计算f(2)=2*hash2(1989)=12,h1(1989)=(1989(mod

10)+f(2))mod 10=1,故插入1位置,此时发生冲突(与4371插入同一位置)。

发生第三次冲突,计算f(3)=3*hash2(1989)=18,h1(1989)=(1989(mod

10)+f(3))mod 10=7,故插入7位置,此时发生冲突(与4344插入同一位置)。

发生第四次冲突,计算f(4)=4*hash2(1989)=24,h1(1989)=(1989(mod

10)+f(4))mod 10=3,故插入3位置,此时发生冲突(与1323插入同一位置)。

发生第五次冲突,计算f(5)=5*hash2(1989)=30,h1(1989)=(1989(mod

10)+f(5))mod 10=9,故插入9位置,此时发生冲突(与4199插入同一位置)。

此时,可以知道,将再次逐个探测位置9->5->7->3->9,最终无法插入1989。