TreeSet
l'iterazione è ovviamente O (n), come ci si può aspettare da qualsiasi ragionevole algoritmo di spostamento dell'albero.
Sto pensando che fornendo link all'indietro dal nodo figlio a genitore nodo ho potuto migliorare le prestazioni.
TreeMap
(su cui è basato TreeSet
) ha già riferimenti parentali. Questo è il metodo che tutto si riduce a:
private Entry<K,V> successor(Entry<K,V> t) {
if (t == null)
return null;
else if (t.right != null) {
Entry<K,V> p = t.right;
while (p.left != null)
p = p.left;
return p;
} else {
Entry<K,V> p = t.parent;
Entry<K,V> ch = t;
while (p != null && ch == p.right) {
ch = p;
p = p.parent;
}
return p;
}
}
fonte
2010-05-03 16:07:16
Questa domanda non ha senso. Sembra che tu stia dicendo che iterare sul tuo albero è O (n). Questo è il meglio che puoi fare per l'iterazione: la visualizzazione di n elementi richiede tempo O (n). Se vuoi rendere il codice che è dominato dall'iterazione più veloce, devi modificare l'algoritmo in modo che non esegua l'iterazione, ad esempio eseguendo le ricerche nell'albero per tasto (che sarebbe O (log n)) anziché. – babbageclunk