哈希表v / s树

时间:2012-04-05 17:49:40

标签: algorithm data-structures hash tree hashtable

哈希表总是比树快吗?虽然Hashtables具有O(1)搜索复杂度但是假设由于设计错误的哈希函数发生了大量冲突,并且如果我们使用链式结构(比如平衡树)处理冲突,那么搜索的最坏情况运行时间将是O(log n) )。因此,即使在最坏情况下哈希表总是比树更快,我能否得出大或小数据集的结论?另外,如果我有足够的内存而且我不想进行范围搜索,那么我总是可以使用哈希表吗?

4 个答案:

答案 0 :(得分:9)

  

哈希表总是比树更快吗?

不,不是总是。这取决于许多因素,例如集合的大小,散列函数,以及一些散列表实现 - 也是删除操作的数量。

哈希表平均每个op O(1) - 但情况并非总是如此。在最差的情况中,它们可能是O(n)

我现在可以想到更喜欢树木的一些原因:

  1. 订购很重要。 [哈希表不维护顺序,BST按定义排序]
  2. Latency是一个问题 - 你不能忍受可能发生的O(n)。 [这可能对实时系统至关重要]
  3. Ther数据可能与您的哈希函数“相似”,并且许多元素散列到相同的位置[collisions]并不是不可能的。 [这有时可以通过使用不同的哈希函数来解决]
  4. 对于相对较小的集合 - 很多时候哈希表O(1)之间的隐藏常数比树的高得多 - 对于小集合,使用树可能会更快。
  5. 但是 - 如果数据很大,延迟不是问题,冲突是不可能的 - 哈希表比使用树更渐进。

答案 1 :(得分:1)

如果由于设计糟糕的哈希函数会发生大量冲突,并且如果我们使用链式结构(比如平衡树)处理冲突,那么搜索的最坏情况运行时间将是 O(n)(不是O(log n))。因此,即使在最糟糕的情况下,哈希表总是比树更快,您也无法得出大小数据集的结论。

答案 2 :(得分:0)

使用哈希表,并使用适当的维度初始化它。例如,如果仅使用一半空间,则碰撞很少。

答案 3 :(得分:0)

在最坏的情况下,你会在hast-tables中有O(n)时间。 但是这比现在太阳爆炸写入的可能性低十亿,所以当使用好的哈希函数时,你可以安全地假设它在O(1)中工作,除非太阳爆炸。
另一方面,Hash-Tables和Trees的性能可能因月亮的实现,语言和阶段而异,因此这个问题的唯一好处是“同时尝试,思考并选择更好”