HASH表解决冲突有两种方式,一种是开放地址,一种是链表。后者的删除比较简单,就是从链表上删除一个数据。但是很多场合下,前者更适合应用。前者的优点是,CACHE命中率高,内存管理简单。但是从前者删除数据却很困难。
如果简单地把待删除结点删除,则因为冲突,而被放到它后面的结点将会无法访问。可以设一个简单的删除标志,这样查询的时候,直接访问它的下一位,增加的时候,把它当空闲节点。但是,经过大量的增删之后,假设每次增删都是随机的,将会有大量被标志为删除的结点,这样会降低查找的速度。一种方案是,经过一定次数的删除后,重组HASH,把这些标志位去掉,这个过程也会比较麻烦,而且会导致,系统在一段时间内压力过大,所以下面讨论一种渐进的方式。
在删除一个结点后,把后面受它影响的结点往前挪。但是怎么知道哪些结点受它影响呢?跟它HASH到同一个位置的节点会受影响,不HASH到同一个位置的节点也可能会受影响。