Ich frage mich, was ist die Zeit Komplexität von size()
für Teilansicht von TreeSet.Was ist die Komplexität von size() für TreeSet Teilansicht in Java
Lassen Sie sagen, ich bin Zufallszahlen Zugabe zu setzen (und ich kümmere mich nicht um Duplizitäten):
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());
}
und jetzt bin ich wodering was Komplexität für size()
Anrufe als:
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());
}
}
AFAIK Komplexität von tree.headSet(t)
, tree.tailSet(f)
und tree.subSet(f, t)
sind O (LG N), set.size()
ist O (1), aber was ist mit size()
Methoden oben? Ich habe so ein schlechtes Gefühl, dass es O (K) ist, wo K die Größe der ausgewählten Teilmenge ist.
Vielleicht, wenn es einige Workarounds gibt, um den Index eines Elements im Set zu finden, würde es reichen, denn wenn ich ti = indexOf(f)
bekomme, sagen wir O (lg N), dann ist es genau das, was ich brauche.
Könnten Sie bitte eine Sache klären? Methode iterator() wird tatsächlich den Iterator <> des Baums zurückgeben, der O (log N) ist. Es wird nur einen Teil des Baums nach Kriterien (vonStart()/toEnd()) berührt. Wie ich verstand, wenn headSet() erstellt wird, erstellt es nicht tatsächlich eine Reihe von Elementen. Es erstellt nur einen Wrapper mit Kriterien. Bin ich falsch? Danke. –
Ich kehrte nach einiger Zeit zu dieser Frage ... Sie haben Recht - es erstellt nur einen Wrapper, aber Iteration ('while' Schleife) ist immer noch O (K) für Teilmenge der Größe K. – Betlista