Zastanawiam się, jaka jest złożoność czasu size()
dla widoku części TreeSet.Co to jest złożoność size() dla widoku części TreeSet w Javie
powiedzmy Dodaję liczb losowych, aby ustawić (i nie dbam o duplicities):
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());
}
i teraz jestem wodering co jest złożoność dla size()
połączeń jak:
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());
}
}
Złożoność AFAIK tree.headSet(t)
, tree.tailSet(f)
i tree.subSet(f, t)
to O (lg N), set.size()
to O (1), ale co z powyższymi metodami size()
? Mam takie złe przeczucie, że to O (K), gdzie K jest wielkością wybranego podzbioru.
Być może, jeśli istnieje jakiś sposób obejścia indeksu jakiegoś elementu w zestawie, to wystarczy, ponieważ jeśli mogę uzyskać ti = indexOf(f)
, powiedzmy O (lg N), niż jest to dokładnie to, czego potrzebuję.
mógłbyś wyjaśnić jedną rzecz? Metoda iterator() zwróci Iterator drzewa <>, który jest O (log N). Będzie dotykał tylko części drzewa według kryteriów (fromStart()/toEnd()). Jak zrozumiałem, gdy tworzona jest funkcja headSet(), w rzeczywistości nie tworzy ona zestawu elementów. Po prostu tworzy opakowanie z kryteriami. Czy się mylę? Dzięki. –
Powróciłem do tego pytania po pewnym czasie ... Masz rację - tworzy tylko wrapper, ale iteracja (pętla 'while') wciąż jest O (K) dla podzbioru wielkości K. – Betlista