为什么最好将hashset转换为treeset然后直接使用treeset

时间:2009-09-16 07:10:31

标签: java

在包括太阳网站在内的网络的许多地方,出现以下句子:

  

通常会更快地执行操作   在hashSet然后转换   hashsettreeset

好吧,我有点困惑,这是正确的,hashset中的添加元素是o(1),而在treeset(黑色和红色树)中添加对象是{{1但是当我将hashset转换为treeset时,我需要对o(logn)的数据进行排序,那么为什么使用o(nlogn)然后将其转换为hashset会更快?我知道如果你预先形成删除或现有元素,所以哈希和树之间存在差异,但我不认为这是太阳所指的因素(至少我希望如此,因为它看起来像一个非常小的东西)另一件事是treeset方法可能不太好,然后向哈希添加元素将不是hashcodeo(1)方法可能很复杂。所以一般我不明白这句话。有谁可以帮助我?

1 个答案:

答案 0 :(得分:5)

这取决于在将元素复制到排序树结构之前,哈希表中发生了多少操作。如果您所做的只是向哈希表中插入n个不同的元素,那么不会,这样做会更快,然后将它们复制到树中:)

可以通过以下任一方式将散列的项目集转换为已排序的树:使用常规排序,然后从中构建树,或者将项目一次插入树中。前者意味着额外的复制/遍历;后者意味着维护平衡树的额外开销(尽管如果你迭代一个哈希表,你会得到有效随机顺序的项目,这意味着你可以避免大多数重新平衡)。

对于支持得很好的操作(插入/修改/删除),哈希表通常比搜索树更快,但在实际测量整个应用程序的性能并且可以预期之前,它绝对不值得做Sun推荐的事情。从可能略有改善的整体加速中获得宝贵的价值。

当密钥比较昂贵时(如字符串),哈希表确实比排序树具有更大的优势,因为对于大型集合,与搜索树深度相比,哈希冲突的项目更少,并且因为它可以缓存已经在集合中的键的哈希码,跳过除了匹配结果之外的所有(可能)的昂贵比较。