【发布时间】:2013-02-07 11:46:43
【问题描述】:
我想知道 TreeSet 的部分视图 size() 的时间复杂度是多少。
假设我要添加随机数来设置(而且我不关心重复):
final TreeSet<Integer> tree = new TreeSet<Integer>();
final Random r = new Random();
final int N = 1000;
for ( int i = 0; i < N; i++ ) {
tree.add( r.nextInt() );
}
现在我想知道size() 调用的复杂性是:
final int M = 100;
for ( int i = 0; i < M; i++ ) {
final int f = r.nextInt();
final int t = r.nextInt();
System.out.println( tree.headSet( t ).size() );
System.out.println( tree.tailSet( f ).size() );
if ( f > t ) {
System.out.println( tree.subSet( t, f ).size() );
} else {
System.out.println( tree.subSet( f, t ).size() );
}
}
tree.headSet( t )、tree.tailSet( f ) 和 tree.subSet( f, t ) 的 AFAIK 复杂度是 O(lg N),set.size() 是 O(1),但是上面的 size() 方法呢?我有一种糟糕的感觉,它是 O(K),其中 K 是所选子集的大小。
也许如果有一些解决方法可以找到集合中某个元素的索引就足够了,因为如果我能得到ti = indexOf(f),假设 O(lg N) 比这正是我所需要的。
【问题讨论】:
标签: java complexity-theory treeset