给定带有冲突的哈希表,通用哈希表实现将导致桶内的查找在O(n)中运行,假设使用了链表。
如果我们切换二进制搜索树的链表,我们会转到O(log n)。这是我们能做的最好的,还是这个用例有更好的数据结构?
对存储桶本身使用哈希表会将查找时间带到O(1),但这需要对哈希函数进行巧妙的修改。
答案 0 :(得分:1)
在您的解决方案中,在查找时间的插入时间之间需要权衡。 (保持桶分类)
如果要保持每个存储桶的排序,您将使用二进制搜索获得O(log n)查找时间。但是,当您插入新元素时,您必须将他放在正确的位置,以便将继续对存储桶进行排序 - O(log n)搜索时间以放置新元素。
因此,在您的解决方案中,您可以获得插入和查找的总复杂度O(log n)。 (与传统解决方案相比,在最坏的情况下采用O(n)进行查找,而插入则采用O(1))
编辑:
如果您选择使用已排序的存储桶,当然您不能再使用LinkedList。您可以切换到任何其他合适的数据结构。
答案 1 :(得分:1)
Perfect hashing实现了在构造散列函数时已知的有限密钥集的无冲突O(1)散列。 The Wikipedia article有几种方法可以将这些想法应用到动态的一组键中,例如dynamic perfect hashing和cuckoo hashing,这可能是您感兴趣的。
答案 2 :(得分:0)
你已经回答了自己的问题。由于哈希表只是其他数据结构的数组,因此查找时间仅取决于辅助数据结构的查找时间以及哈希函数在存储桶中分配项的能力。