我应该使用TreeSet还是HashSet?

时间:2016-04-20 22:31:56

标签: java sorting collections hashset treeset

我有大量的字符串,我需要按排序顺序打印唯一的字符串。 TreeSet按排序顺序存储它们,但每次插入的插入时间为O(Logn)。 HashSet需要O(1)时间才能添加,但后来我必须得到集合的列表,然后使用Collections.sort()进行排序,它采用O(nLogn)(我假设这里没有内存开销,因为只有字符串的引用将被复制到新集合中,即列表)。总的来说,任何选择都是相同的,因为总的来说总时间是一样的吗?

4 个答案:

答案 0 :(得分:1)

这取决于你的接近程度。是的,渐近时间复杂度在任何一种情况下都是O(n log n),但常数因子不同。所以它不像一种方法可以比另一种方法快100倍,但是一种方法的速度肯定是另一种方法的两倍。

对于程序的大多数部分,因子2完全不相关,但如果您的程序实际上在此算法中花费了大部分运行时间,那么实现这两种方法并测量它们的性能将是一个好主意

答案 1 :(得分:0)

测量是要走的路,但如果你纯粹在理论上谈论并忽略排序后的读数,那么考虑一下字符串的数量= x:

<强> HashSet的x * O(1)添加操作+ 1 O(n log n)(其中n是x)排序操作=大约O(n + n log n)(好的,这是一个粗略的过度简化,但是......)

<强> TreeSet中x * O(log n)(其中n从1增加到x)+ O(0)排序操作=大约O(n log (n/2))(也是粗略的过度简化,但是......)

继续过度简化,O(n + n log n) > O(n log (n/2))。也许TreeSet是要走的路?

答案 2 :(得分:0)

如果您区分字符串总数(n)和唯一字符串数(m),则可以获得两种方法的更详细结果:

哈希集+排序:O(n)+ O(m log m)

TreeSet:O(n log m)

因此,如果n比m大得多,使用哈希集并对结果进行排序应该稍好一些。

答案 3 :(得分:-1)

您应该考虑更频繁地执行哪些方法,并根据这些方法做出决定。

除了HashSetTreeSet之外,您还可以使用LinkedHashSet为排序集提供更好的性能。如果您想进一步了解他们在绩效方面的差异,建议您阅读6 Differences between TreeSet HashSet and LinkedHashSet in Java