哈希表与二进制搜索树的大O.

时间:2009-05-13 19:03:21

标签: hashtable binary-tree big-o

哪个需要更长时间?

按排序顺序打印存储在二叉查找树中的所有项目,或按排序顺序打印存储在哈希表中的所有项目。

由于哈希表从未排序正确,因此以排序顺序打印哈希表的项目需要更长时间?和BST是?

6 个答案:

答案 0 :(得分:12)

你是对的。 Hashtables按一些散列函数排序,而不是按其自然排序顺序排序,因此您必须提取所有条目O(N)并将它们排序为O(NlogN),而您可以在O中以自然顺序遍历二叉搜索树( N)。

但是请注意,在Java中,有一个LinkedHashSet和LinkedHashMap可以为您提供Hash的一些优点,但可以按照添加的顺序遍历,因此您可以对其进行排序并能够遍历它按照排序顺序以及通过哈希提取项目。

答案 1 :(得分:3)

正确,哈希表不会按您可能想要的方式“排序”。通常,哈希表中的元素并不完全排序,尽管这种排列通常类似于某种类型。但是它们是根据哈希函数排列的,这对于类似的短语通常是非常不同的。它不是人类会使用的任何指标。

如果您对集合进行的主要操作是按排序顺序打印,那么最好使用某种类型的BST。

答案 2 :(得分:2)

二进制搜索树的存储方式是,如果进行深度优先遍历,您将按排序顺序找到项目(假设您具有一致的比较功能)。简单地返回树中已经存在的项目的大O将是遍历树的大O.

您对哈希表是正确的,它们没有排序。实际上,为了枚举普通哈希表中的所有内容,您必须检查每个桶以查看其中的内容,将其拉出来,然后对所获得的内容进行排序。很多工作要从中获得一个排序列表。

答案 3 :(得分:1)

正确,打印存储在哈希表中的排序数据会更慢,因为哈希表不是排序数据。它只是为您提供了一种快速查找特定项目的方法。在“Big O Notation”中,据说该项目可以在恒定时间内找到,即O(1)时间。

另一方面,你可以在“对数时间”(O(log n))中找到二元搜索树中的项目,因为数据已经为你排序了。

因此,如果您的目标是打印已排序的列表,那么将数据存储在排序顺序(即二叉树)中会更好。

享受,

Robert C. Cartaino

答案 4 :(得分:0)

这引出了一些有趣的问题。考虑到以下情况,搜索树是否仍然更快?

  1. 合并哈希表和BST的设置时间?
  2. 如果哈希算法产生排序的单词列表。从技术上讲,您可以创建一个使用算法的哈希表。在这种情况下,BST与Hash表的速度必须降低到以排序顺序填充哈希表所花费的时间。

答案 5 :(得分:0)

另请查看“跳过列表与二进制树”的相关注意事项:Skip List vs. Binary Tree