Bet*_*sta 9 java complexity-theory treeset
我想知道size()TreeSet的部分视图的时间复杂度是多少.
假设我正在添加随机数来设置(我不关心重复):
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() );
}
Run Code Online (Sandbox Code Playgroud)
现在我正在考虑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() );
}
}
Run Code Online (Sandbox Code Playgroud)
AFAIK的复杂性tree.headSet( t ),tree.tailSet( f )并且tree.subSet( f, t )是O(LG N),set.size()是O(1),但对于size()上述的方法?我有一种不好的感觉,它是O(K),其中K是所选子集的大小.
也许如果有一些解决方法来找到集合中某个元素的索引就足够了,因为如果我能得到ti = indexOf(f),那就说O(lg N)比它正是我需要的.
Mik*_*rov 12
貌似复杂的size ()就是O(N),因为它可以调用TreeMap.NavigableSubMap.EntrySetView.size ()它像这样(甲骨文JDK 1.7.0_13)来实现:
public int size() {
if (fromStart && toEnd)
return m.size();
if (size == -1 || sizeModCount != m.modCount) {
sizeModCount = m.modCount;
size = 0;
Iterator i = iterator();
while (i.hasNext()) {
size++;
i.next();
}
}
return size;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2005 次 |
| 最近记录: |