我们都知道对于哈希函数来说,有一个绕不开的话题就是冲突。 当N个object通过随机函数映射到N个桶的时候,可能由于冲突而出现Hash(x) = Hash(y)的情况。经典的处理哈希冲突的方法包括链表法(Separate Chaining)和开放寻址(Open Addressing)。对于链表法来说,冲突位置的链表长度越长,算法效率越差。
问题1: 如果N个Object随机哈希到N个桶,最大链表长度可能是多少呢?
答案: log N / log log N
问题2: 如果每次选择哈希映射的桶时,随机两次挑出两个桶,并从中选择链表长度相对更短的桶插入呢?
问题3:如果每次选择哈希映射的桶时,随机D次呢?
答案:log log N / log D + 1
对比上述两个结