Basta chiedersi quali sono i pro e i contro di un TreeSet, se qualcuno potesse dirmi per favore? Grazie!Quali sono i pro e i contro di un TreeSet
risposta
Una delle classi Collection. Ti consente di accedere agli elementi della tua collezione per chiave, o in sequenza per chiave. Ha un sovraccarico considerevolmente maggiore rispetto a ArrayList o HashMap. Utilizzare HashSet quando non è necessario l'accesso sequenziale, è sufficiente cercare per chiave. Utilizzare un ArrayList e utilizzare matrici. ordina se vuoi solo gli elementi in ordine. TreeSet mantiene gli elementi in ordine in ogni momento. Con ArrayList devi solo ordinare quando è necessario. Con TreeSets, la chiave deve essere incorporata nell'oggetto archiviato nella raccolta. Spesso potresti avere TreeSet of Strings. Tutto quello che puoi fare è dire se una determinata stringa è nel Set. Non ti troverà un oggetto associato come farà un Treemap. Con una TreeMap le chiavi e gli oggetti a cui sono associati sono separate.
TreeSet e suo fratello TreeMap stranamente non hanno nulla a che fare con la rappresentazione degli alberi. Internamente usano un'organizzazione di alberi per darti un Set/Mappa in ordine alfabetico, ma non hai alcun controllo sui collegamenti tra genitori e figli.
Internamente TreeSet utilizza alberi rosso-nero. Non è necessario preselezionare i dati per ottenere un albero ben bilanciato. D'altra parte, se i dati sono ordinati (in ordine ascendente o discendente), non saranno danneggiati come con altri tipi di albero.
Se non si fornisce un comparatore per definire l'ordine desiderato, TreeSet richiede un'implementazione comparabile sulla classe articolo per definire l'ordine naturale.
Caso di utilizzo tipico: Prendi un testo, rilascia tutte le parole da questo testo in un TreeSet
"Usa HashSet quando non hai bisogno di un accesso sequenziale, cerca solo per chiave." - Intendi quando non hai bisogno di ricerca per chiave (che è ciò che fornisce una mappa)? –
Se è necessario un accesso sequenziale specifico ma nessun ordinamento, è possibile utilizzare LinkedHashSet che conserva l'ordine dei dati di input. Anche TreeSet ha rimosso l'ordine di logn mentre PriorityQueue rimuove l'ordine è O (n) –
TreeSet:
Pro: ordinato, basato su un algoritmo albero rosso/nero, fornisce la complessità O (log (N)) per le operazioni.
Contro: il valore deve essere comparabile oppure è necessario fornire Comparatore nel costruttore. Inoltre, l'implementazione di HashSet fornisce prestazioni migliori in quanto fornisce la complessità di O (1).
Grazie mille! – Rifk
Sembra strano a "basato su un algoritmo albero rosso/nero" come un "pro". Sembra anche un po 'strano menzionare la complessità di O (log (N)) come un professionista quando la cosa ovvia per confrontare TreeSet è HashSet che (come hai detto) ha una maggiore complessità temporale. –
@Laurence: 1) L'inserimento in una lista è O (N) se si include il controllo dell'unicità, quindi O (log (N)) è un "pro" relativo. 2) un HashSet è solo O (1) se usi una decente funzione di hash e permetti alla tabella hash di crescere. –
Suppongo che questa struttura di dati utilizzi l'albero binario per conservare i dati in modo che sia possibile il recupero dell'ordine in ordine ascendente. In tal caso, se tenta di mantenere l'albero in equilibrio, l'operazione di rimozione sarebbe un po 'costosa.
-1: HashSet utilizza un albero rosso-nero. Secondo [questa pagina] (http://www.eli.sdsu.edu/courses/fall95/cs660/notes/RedBlackTree/RedBlack.html) la complessità dell'eliminazione è O (log (N)) –
Contro: Una trappola con TreeSet è che implementa l'interfaccia Set in modo inaspettato. Se un TreeSet contiene l'oggetto a, l'oggetto b viene considerato parte del set se a.compareTo (b) restituisce 0, anche se a.equals (b) è falso, quindi se compareTo e uguale non è implementato in un coerente modo, sei in una brutta corsa.
Questo è particolarmente un problema quando un metodo restituisce un Set e non si sa se l'implementazione è un TreeSet o, per esempio, un HashSet.
La lezione da apprendere qui è sempre evitare di implementare compareTo ed eguaglia in modo incoerente. Se è necessario ordinare oggetti in modo non coerente con gli uguali, utilizzare un comparatore.
forse volevi dire "se a.compareTo (b) restituisce zero"? –
Wow. Feedback costruttivo su un post di 4 anni. Grazie, l'ho risolto – Buhb
TreeSet frammenti di memoria e ha overhead di memoria aggiuntivi. Puoi guardare le fonti e calcolare la quantità di memoria aggiuntiva e la quantità di oggetti aggiuntivi che crea. Naturalmente dipende dalla natura degli oggetti memorizzati e puoi anche sospettare che io sia paranoico riguardo alla memoria :) ma è meglio non spenderli qua e là - tu hai GC, hai problemi di cache e tutte queste cose sono slooow.
Spesso è possibile utilizzare PriorityQueue anziché TreeSet. E nel tuo tipico caso d'uso è meglio solo ordinare l'array di stringhe.
queste domande e le risposte corrispondenti meritano di essere là fuori. molto utile! grazie! – mtical