常用澳门葡京源码下载散列函数和冲突消解机制(数据结构)

散列澳门葡京源码下载论坛:haozbbs.com Q1446595067函数(哈希函数)是一种大集合到小集合的映射。这种映射肯定会出现不同的关键码被映射到同一个位置的情况,称为冲突。关于冲突有一个重要的度量值:负载因子。

负载因子越大,出现冲突的可能性就越大。扩大散列表的存储空间,就可以降低负载因子;但是负载因子过小,就会造成散列表中的空间浪费。用散列技术实现字典,需解决两个大问题:散列函数的设计,冲突消解机制。

1、常用的散列函数:

除余法(适用于整数关键码):用关键码除以某个不大于散列表长度m的整数p,将得到的余数(或者余数加L,由下标开始值确定)作为散列地址。 为了存储管理方便,经常将m取为2的某个幂值,p取为小于m的 最大素数(质数)。 除余法在实际中应用最为广泛。

基数转换法(适用于整数或字符关键码):对于整数关键码,取一个正整数r,把关键码看做基数为r的r进制数,然后将其转换为十进制或者二进制数。通常r取为素数。

例如:关键码335647,r=13

对于字符关键码,将字符转换为整数(直接用字符的编码值),其基数建议选用素数29或31。通过基数转换法将字符串转换为整数,再用除余法等整数散列方法将结果归入到散列表的下标范围。

2、冲突消解机制:

1)内消解方法:

内消解的基本方法是开地址法,基本想法为:插入数据发生冲突时,设法在基本存储区里另行安排一个位置来插入数据。其安排位置的方式被称为探查方式。

首先定义一个递增的序列:D=d0,d1,d2... (1)这个递增序列可以简单地设置为整数序列,如D=0,1,2,3.....这种方法称为线性探查.(2)也可以另行设计一个散列函数h2,令.这种方法称为双散列探查。
然后定义探查序列公式为:,p是不超过表长度的数。在插入数据时,如果h(key)位置空闲就直接存入(相当于d0),否则就逐个探查位置Hi是否空闲。

下面是一个双散列探查的例子,取h2(key)=key%5+1:

如上图所示,前三项的插入没有冲突,当插入关键码5时,发生冲突,探查一次得:,所以将关键码5插入位置6.接下来的关键码都按照类似的操作,不断插入到表中即可。

检索和删除

在开地址法的散列表上检索,过程与插入类似,对于给定的key:

利用散列函数求出key对应的散列地址。
如果这个地址中没有数据,说明关键码key不在这个散列表中。
如果这个地址中有数据,则比较key与保存在这个地址中的关键码是否相同,若相同,则检索成功。
若两者不相同,则在散列表中探查下一地址,返回步骤2.

删除操作的步骤类似,但在开地址法中删除存在一个问题:被删除的数据可能处于其他元素的探查路径上,如果将其删除,就会切断某些元素的探查路径,使其失联。 解决这一问题:可以在删除元素后在这个位置放置一个特殊标记,让探查到这个位置时不中断,可以继续向下进行;而执行插入操作时,将这个标记看做空位,可以将新元素插入这里。

2)外消解方法:

溢出区方法:当插入关键码发生冲突时,将关键码和数据一起存入溢出区。数据在溢出区中顺序排列。 检索和删除时,先找散列位置,如果有数据但是关键码不匹配,则转到溢出区中顺序查找。

随着溢出区中数据的增长,字典的性能将趋于线性。

桶散列:拉链法:散列表中的每个元素只是一个引用域,这个引用域指向一个存储链表,当不同的关键码发生冲突时,就将关键 码插入到当前散列地址对应的链表中(新数据插入到链表的最前端)

猜你喜欢

转载自blog.51cto.com/13852118/2135932
今日推荐