在哈希表总是比树木快? 虽然哈希表有O(1)搜索的复杂性,但如果由于设计不佳的散列函数很多冲突的发生,如果我们处理采用链式结构(比如平衡树),然后运行时间搜索最坏的情况下会为O冲突(日志N猜想)。 所以,我可以断定为或大或小的数据集,即使在最坏的情况下情况哈希表总比树快? 另外,如果我有足够的内存,我不想范围搜索我可以随时去一个哈希表?
Answer 1:
在哈希表总是比树木快?
不,并非总是如此 。 这取决于很多因素,如集合的大小,散列函数,而对于一些哈希表的实现 - 删除OPS的还数。
哈希表是O(1)
每运算平均 -但是这并非总是如此。 他们可能是O(n)
在最坏的情况下 。
我可以在一瞬间喜欢树木想到的一些原因:
- 顺序很重要。 [哈希表不维持秩序,BST是由定义排序]
- 延迟是一个问题-你也不能苦了
O(n)
可能发生的。 [这可能是实时系统的关键] - 疗法的数据可能是“相似”与您的哈希函数,和许多元素散列到同一地点[碰撞]不unprobable。 [这可以通过使用不同的散列函数有时解决]
- 对于小集合-多次哈希表的之间的隐含常数
O(1)
要高得多,则树的-并使用一棵树可能是小集合更快。
但是 - 如果数据是巨大的,等待时间不是问题,和碰撞是unprobable - 哈希表是渐近更好然后用一棵树。
Answer 2:
如果由于设计不佳的散列函数很多碰撞事故发生,如果我们处理使用链结构(比如平衡树)的碰撞,然后运行时间搜索最糟糕的情况是O(N)(未O(log n)的)。 因此,你甚至不能在最坏的情况下哈希表的情况下订立或大或小的数据集,往往比树木快得多。
Answer 3:
使用哈希表,并用正确的尺寸初始化它。 例如,如果你只使用一半空间的碰撞是极少数。
Answer 4:
在最坏的情况下你必须在HAST桌O(n)的时间。 但是,这是一个数十亿美元不太可能再太阳爆炸写了,所以使用好的哈希函数时,你可以安全地假设它工作在O(1)除非太阳爆炸。
在另一方面,这两个哈希表和树的性能可以实现,语言和月相变化,所以只能好的答案,这个问题是“请分别尝试, 想和挑选更好”。
文章来源: Hash Table v/s Trees