一、"Robin Hood hashing" 算法
"Robin Hood hashing"是一种常用于解决哈希表冲突的算法之一,也是 Python3.7 及之后版本中字典采用的一种哈希算法。
可以参考:新式哈希表 - Swiss Tables - 知乎 (zhihu.com)
该算法的基本思路是将键值对按照哈希值的大小顺序存储在哈希表中,并且通过计算键值对与哈希值的距离来确定其在哈希表中的存储位置。在插入新的键值对时,会按照哈希值的大小顺序找到该键值对应该插入的位置,然后将其插入到该位置。
如果插入的位置已经被占用,那么就需要进行冲突解决。Robin Hood hashing 算法采用了"Robin Hood"策略,即通过比较当前键值对和已占用位置的键值对的距离大小,将距离较小的键值对插入到当前位置,并将距离较大的键值对向后移动。
如果距离比当前位置的键值对更小,那么就将当前位置的键值对移动到距离更大的位置,然后将新的键值对插入到当前位置。如果距离比当前位置的键值对更大,那么就将新的键值对向后移动,直到找到一个空槽位为止。
通过这种方式,Robin Hood hashing 算法可以在哈希表中有效地解决哈希冲突,并且保证哈希表的插入和查找效率较高。
二、开放寻址法
开放寻址的基本思路是,当发生哈希冲突时,直接在哈希表中寻找下一个空闲的位置来存储该键值对,直到找到一个空闲位置为止。这种方法的优点是简单、直接,不需要分配额外的内存空间,但是它的缺点是,当哈希表被填满时,查找效率会大大降低,因为需要不断地遍历哈希表来寻找空闲位置。
参考:Hash冲突及解决办法_51CTO博客_hash冲突
三、比较
优点:
"Robin Hood hashing" 算法相对于开放寻址在处理哈希冲突时更加高效,因为它在插入时通过让距离最近的元素往后移动来维护元素的顺序,从而可以更快地找到空闲的槽位。
开放寻址可以直接在哈希表中进行操作,因此在内存使用方面更加节约。此外,对于小型哈希表来说,开放寻址可能比"Robin Hood hashing" 算法更快,因为它不需要维护元素之间的顺序。
缺点:
"Robin Hood hashing" 算法在删除元素时可能会导致元素的顺序变得混乱,这会影响插入操作的效率。
开放寻址在处理哈希冲突时可能会导致聚集现象,即所有的冲突都集中在哈希表的某一个区域,这会导致哈希表的性能下降。