使用搜索树而不是列表进行哈希处理


11

我正在努力解决哈希和二进制搜索树材料。我读到,与其使用列表来存储具有相同哈希值的条目,还可以使用二进制搜索树。我尝试了解操作的最坏情况和平均情况下的运行时间

  1. insert
  2. find
  3. delete

是值得的。一般情况。它们在列表方面是否有所改善?


如果您可以使用线性链接(即线性列表)对哈希表的运行时间进行严格的分析,请使用平衡搜索树实现的平均情况结果替换插入线性列表上平均成本的部分。剩下的就是机械师。(显然,它有所帮助。)
拉斐尔

Answers:


4

对于列表,插入,查找和删除分别位于O n O n )中。排序列表更糟。二进制搜索本身用于排序的数组,其中的运算符为O n O log n O n 。如果您想要“插入”和“删除”操作,那么您不仅需要二进制搜索。O(1)O(n)O(n)O(n)O(logn)O(n)

您可能想要像二叉搜索树之类的东西。一旦有了适当的术语,查找有关它的参考就容易得多。这些操作是在最坏的情况下进行的,例如,对于使用AVL树红黑树的实现O(logn)


1
都是正确的,但我看不出它如何回答提出的问题。
rgrig

这不是同样的问题在所有的时间。(即使编辑历史记录也没有原始问题。很奇怪。)我可以更新答案,但是对于Gilles来说,它将变得多余。
jmad 2012年

4

在最坏的情况下,如果碰巧只存储具有相同哈希值的元素,则哈希表会将每个元素存储在同一存储桶中。如果您使用列表存储存储桶中的元素,则在最坏的情况下查找为(其中n是表中元素的数量-更一般而言,n是最大存储桶中的元素数量),因为如果您要查找表中没有的元素,则需要遍历整个列表。正查找(您知道元素存在的地方)具有相同的复杂度:您需要n 1 = Θ n O(n)nnn1=Θ(n)如果您要查找列表的最后一个元素。删除具有相同的复杂性(如果碰巧要删除最后一个元素,则需要查询)。如果需要检查现有元素,则插入也为O n ),如果允许重复,则插入为O 1 (在这种情况下,可以将元素插入列表的开头)。n1O(n)O(1)

对于平衡的二叉搜索树,最坏情况的复杂度降低为,因为根据定义的平衡,平衡的搜索树的深度在树的大小上呈对数增长。O(logn)

O(1)

nn/2Θ(n)Θ(logn)


2
“具有平均数据分布”应读为“具有足够随机的散列函数”
JeffE,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.