第5天:散列HASH(二)冲突解决办法之线性再散列法

来源:互联网 发布:广电怎么看网络电视 编辑:程序博客网 时间:2024/05/20 14:44

冲突解决办法

除了可以设计出完美散列函数的情况之外,散列表必须具备合理地处理冲突的能力。当散列表给两个不同的数据项提供相同的散列值时,就会发生冲突。解决冲突广泛采用以下三种方法:(1线性再散列法, 简单地按顺序遍历散列表,寻找下一个可用的存储位置;(2非线性再散列法, 计算一个新的散列值;(3外部拉链法,将散列表中的每个位置市委具有相同散列值的数据项的链表的同步,散列表将发送冲突的项添加到该链表中。

线性再散列法

线性再散列法是形式最简单的冲突解决方法。刚一发现冲突,算法就会简单的从冲突位置开始遍历散列表,直到表中的下一个空槽,并将元素放入该槽中。此后,任何查找元素的操作都开始于散列值所指向的表槽。如果没有找到匹配,则将继续遍历散列表,直到:(1)找到相应的元素;(2)找到一个空槽(指示查找的元素不存在);(3)检查整个散列表(指示该元素不存在并且散列表是满的)。


在遍历散列表的时候,可以每隔几个槽检查一个槽,当到达表尾时绕回表头继续查找。只要表的大小和检查槽的步长是互质的(即它们没有公约数),那么表中的每个槽都会被检查。步长为1是不可取的,因为这将促使聚集产生。如果在表的同一普通区域发生了少数冲突,步长为1就意味着:表的这个部分将很快填满大量重复的内容,此时表的该区域中的任何活动都将涉及更大的步长。5或更大的值作为步长,可以迅速的将查找从拥挤区域移开,并减小产生严重聚集的机会。


缺点:不能从表中删除元素,并且当表被填满时性能下降明显。如果执行简单的删除操作则会出现第三幅图的情况,删除后当需要查找“Elephant”时,会在找到之前遇到刚刚删除产生的空槽,从而出现找不到“Elephant”元素的问题。因此只有把使用过的槽标记为无效的才可以执行删除。在查找时如果遇到无效的槽,就可以简单的继续执行查找。


0 0
原创粉丝点击