我想知道在TreeSet中逐个添加元素与在ArrayList中添加元素然后通过.addAll()方法传输到TreesSet之间的性能差异。我知道TreeSet使用红黑树作为其数据结构。只想了解这两个过程的基本内部工作原理。以下哪一项会更快,为什么?
TreeSet<Integer> ts = new TreeSet<Integer>();
for(int i=0;i<n;i++)
ts.add(sc.nextInt());
OR,
TreeSet<Integer> ts = new TreeSet<Integer>();
ArrayList<Integer> ar = new ArrayList<Integer>();
for(int i=0;i<n;i++)
ts.add(sc.nextInt());
ts.addAll(ar);
这里sc是Scanner类的一个对象(它也可能是其他任何东西)。任何帮助将深表感谢。提前谢谢。
答案 0 :(得分:2)
TreeSet.addAll(c)
是c
的实例时, SortedSet
方法才会执行优化。在其他情况下,它只是迭代集合并逐个添加元素。
因此,首先将元素放入ArrayList
然后使用TreeSet.addAll(list)
方法没有任何意义。您将获得更差的性能和更高的内存消耗。
从大O角度来看,这两种解决方案都有n*log(n)
的复杂性。
EDIT。 TreeSet有两个重要的属性:元素是唯一的,它们是有序的。如果您只对unique-elements属性感兴趣,那么使用HashSet会使您的复杂性为n
。
答案 1 :(得分:0)
仅在传递给Collection
的{{1}}为addAll(Collection)
且instanceof SortedSet
时,树创建时间为线性。
在第二种情况下,创建instanceof TreeMap
需要额外的时间。由于ArrayList
内部调用TreeSet#addAll
循环
Collection#add()
,因此保持不变
因此,如果收藏品不可用,最好拨打for
然后add