Il set ordinato consente i duplicati?
La dimensione sembra uno sforzo inutile. Inoltre, l’uso di una biblioteca ben nota e mantenuta come Guava può risparmiare tempo di sviluppo e garantire una migliore affidabilità.
Risposta l’11 ottobre 2012 alle 8:07
6.872 4 4 badge d’oro 23 23 badge d’argento 46 46 badge di bronzo
Alla luce del chiarimento, ti suggerirei di usare un albero B+. Questa struttura di dati spesso utilizzata garantisce l’ordine ordinato, consente duplicati e fornisce operazioni efficienti di inserimento e aggiornamento. Offre anche funzionalità di ricerca rapida e di corsia.
Risposta l’11 ottobre 2012 alle 7:41
26.7k 51 51 badge d’oro 182 182 badge d’argento 254 254 badge di bronzo
Sarebbe altamente portatile con un barattolo Mavon e senza dipendenze esterne (sebbene un test della libreria CL + unità potesse essere bello, ma ho cambiato i test di nuovo su Junit)
11 ottobre 2012 alle 8:59
Puoi usare un TreeMap. È implementato con un albero rosso-nero, consente duplicati e offre complessità temporale logaritmica per le operazioni di inserimento e ricerca. Inoltre, TreeMap è incluso nella libreria standard Java, quindi non avrai dipendenze esterne.
Risposta l’11 ottobre 2012 alle 8:48
12.9k 11 11 badge d’oro 57 57 badge d’argento 77 77 badge di bronzo
Per quanto riguarda le prestazioni: Linkedlist è il più lento. Poi arriva ArrayList. Le altre implementazioni si adattano al numero di elementi.
11 ottobre 2012 alle 7:10
L’uso di una lista collegata o di array e ordinamento prima di ciascuna operazione di ricerca sarebbe effettivamente inefficiente. Se si desidera una raccolta ordinata che consenta di duplicati e fornisce un inserimento e un aggiornamento rapidi, puoi prendere in considerazione l’utilizzo di un elenco di salti. Ha una complessità temporale simile a un albero di ricerca binaria equilibrata, ma evita le operazioni di bilanciamento.
Risposta l’11 ottobre 2012 alle 8:33
34.7k 49 49 badge d’oro 129 129 badge d’argento 158 158 badge di bronzo
Hai molte opzioni per raccolte ordinate che consentono i duplicati. Alcune delle scelte popolari sono:
- TreeSet: implementa l’interfaccia SordSet in Java. È supportato da un TreeMap e fornisce operazioni efficienti di inserimento, cancellazione e ricerca.
- TreeMultiset (da Guava): questa classe fornisce una raccolta ordinata che consente i duplicati usando un TreeMeultiset sostenuto.
- ConcurrentKiplistset: è un’implementazione concomitante dell’interfaccia SordSet. Utilizza un elenco di salti come struttura dei dati sottostante.
- Albero B+: un albero di ricerca auto-bilanciamento che viene comunemente usato nei database per fornire ricerche a valore chiave rapido.
In definitiva, la scelta dipende dai tuoi requisiti e compromessi specifici. È importante considerare fattori come complessità, efficienza della memoria, prestazioni e facilità d’uso. Puoi sperimentare diverse opzioni e confrontarle per trovare la soluzione più adatta per il tuo caso d’uso.
Risposta il 29 giugno 2021 alle 9:20
1.781 3 3 badge d’oro 11 11 badge d’argento 30 30 badge di bronzo
Java: raccolta ordinata che consente i duplicati, è efficiente dalla memoria e fornisce un aggiornamento di insert rapido
Non chiederò le ragioni di questo comportamento di PriorityQueue, dal momento che la discussione qui lo copre abbastanza bene. Quello che voglio chiedere, tuttavia, è se ci sono alternative là fuori che non conosco?
Il set ordinato consente i duplicati?
Il set ordinato contiene elementi univoci in ordine ordinato proprio come il set. Mentre si tratta di un set ordinato con elementi duplicati, viene utilizzato il tipo di dati della coppia anziché INT dove il primo valore della coppia memorizzerà l’elemento e il secondo valore memorizzerà gli indici corrispondenti. In questo modo ogni coppia nel set ordinato sarà unica e si può facilmente archiviare gli elementi duplicati dell’array.
Operazioni:
1. order_of_key (): Accetta un elemento come parametro e restituisce il numero di elementi rigorosamente meno della chiave. Durante l’implementarlo, dobbiamo passare una coppia come parametro il cui primo valore deve essere il numero per cui desideriamo il risultato e il secondo valore conterrà un valore negativo E.G., -1 perché le coppie inserite nell’ordinato_set avranno il valore maggiore di uguale a 0 in quanto indica gli indici dell’array.
2. find_by_order (): Accetta un indice come parametro e restituisce un iteratore all’elemento I th (coppia) in ordine ordinato.
Esempio:
Supponiamo che ci sia una coppia set ordinata myset =
Qui,
- La coppia set ordinata ha elementi duplicati.
- Dopo aver inserito tutti gli elementi in ordinato_set_pair,
- myset.order_of_key (): Darà il numero di elementi inferiori a 5 i.E, 6.
- myset.find_by_order (8): Darà un iteratore all’8 ° elemento nel set ordinato i.E, 7.
Di seguito è riportato il programma C ++ per implementare l’approccio sopra:
Java: raccolta ordinata che consente i duplicati, è efficiente dalla memoria e fornisce inserto rapido + aggiornamento
Chiunque abbia suggerimenti migliori? O dovrei presentare la mia datatastruttura ordinata (quale?)? Anche altre fonti (in Java, open source, con test unitari e piccoli DEP) sarebbero belle.
Aggiornamento
Maggiori dettagli sul mio caso d’uso al momento (anche se ho una domanda simile nell’ultima volta). Ho una collezione (con milioni) di riferimenti in cui voglio essere in grado
- Sondaggio o ottenere l’elemento più piccolo per quanto riguarda il campo
- e aggiorna il campo S con l’aiuto del campo a
- possono verificarsi valori identici del campo s. Il campo A è in realtà un numero intero che punta in un altro array
- L’unica dipendenza che voglio è Trove4j. Potrei usare un diverso come le collezioni Mahout se fosse necessario. Ma non guava come sebbene una bella libr collezioni non sia sintonizzata per essere efficiente dalla memoria (boxe/unboxing).
Quindi tutte le grida per un mucchio di fibonacci, ma temo che abbia troppi sovraccarichi per elemento -> Questo è stato il motivo per cui ho pensato a una soluzione “Array segmentato e segmentato più efficiente della memoria efficiente.
1 1 1 badge d’argento
Chiesto il 10 ottobre 2012 alle 20:15
17K 16 16 BADGI GOLD 97 97 Distintivi d’argento 196 196 Distintivi di bronzo
Qual è stato il problema con l’utilizzo di Guava TreeMultiset ?
10 ottobre 2012 alle 20:22
@vainolo dipendenza esterna secondo l’osservazione OP.
10 ottobre 2012 alle 20:24
Potrebbe essere utile – Cheatsheet di complessità: Bigocheat Sheet.com
11 luglio 2017 alle 14:29
6 Risposte 6
Quando hai bisogno di una raccolta ordinata, dovresti analizzare attentamente le tue esigenze.
Se la maggior parte delle operazioni è Inserimento e solo pochi devono cercare quindi usando una raccolta ordinata i.e. Mantieni gli elementi ordinati nella collezione costantemente, non sarebbe una buona opzione (a causa del sovraccarico di mantenere gli elementi ordinati su inserto che sarebbe l’operazione più comune).
In questo caso sarebbe meglio mantenere un Unsorted Raccolta e fare l’ordinamento solo quando necessario. IO.e. prima della ricerca. Potresti persino usare un elenco semplice e risolverlo (usando le raccolte.ordinare io.e. mergesort) quando necessario. Ma lo consiglio con cautela, poiché ciò sia efficiente il presupposto è che lavori su dati di grandi dimensioni. In dati davvero piccoli anche la ricerca lineare è abbastanza buona.
Se la maggior parte delle operazioni è Ricerca Quindi potresti usare una raccolta ordinata che dal mio punto di vista ci sono strutture di dati tra cui scegliere (alcune già menzionate) e potresti benchmark per vedere quale si adatta tuo esigenze.
Risposta il 10 ottobre 2012 alle 20:25
52.7K 66 66 BADGI GOLD 207 207 BADGI SILVER 338 338 BADGES BRONZO
Questo non risponde alla domanda, lo ribadisce davvero
28 giugno 2021 alle 20:51
Che ne dici di Guava TreeMultiset? Cosa hai chiesto: una raccolta ordinata che accetta i duplicati. Non so nulla della sua performance però.
3.280 5 5 badge d’oro 35 35 badge d’argento 49 49 badge di bronzo
Risposta il 10 ottobre 2012 alle 20:21
6.872 4 4 badge d’oro 23 23 badge d’argento 46 46 badge di bronzo
L’ho già aggiunto ma penso (non ho ancora guardato il codice) che l’implementazione è quasi identica alla mappa
10 ottobre 2012 alle 21:22
Sembra che dal codice sia un’implementazione completamente nuova. Un sacco di codice. E puoi scaricare la fonte e aggiungerla al tuo progetto, quindi qual è il problema? licenze?
10 ottobre 2012 alle 21:28
dimensione del barattolo. La mia app dovrebbe essere piccola e portatile.
11 ottobre 2012 alle 7:10
Che ne dici di usare strumenti come Proguard per comprimere il barattolo dopo aver finito la programmazione? Scrivere la tua biblioteca solo a causa della dimensione del barattolo non è un buon investimento del tuo tempo.
11 ottobre 2012 alle 7:38
Bene, vorrei mantenere pulito il mio progetto (open source) e con solo poche dipendenze. E solo a causa di una dati di dati non dipenderò sicuramente da un’intera libreria. Ho già Trove4j e non voglio ancora un’altra collezione Lib
11 ottobre 2012 alle 9:53
Ho deciso di lanciare la mia ma non la soluzione ottimale solo una variante TreeMap. Lo terrò aggiornato se metterò a punto questa raccolta per quanto riguarda la memoria. La velocità è già molto meglio del precedente tentativo di priorità in quanto avevo bisogno della collezione.Rimuovi il metodo (oggetto) (per l’aggiornamento di una voce):
pacchetto com.Graphhopper.coll; Importa GNU.raccolta.iteratore.Tintiteratore; Importa GNU.raccolta.impostato.hash.Tinthashset; Importa Java.util.Carta geografica.Iscrizione; Importa Java.util.TreeMap; /*** Una coda prioritaria implementata da un TreeMap per consentire l'aggiornamento della chiave rapida. O dovremmo usare un albero B standard? */ Classe pubblica MySortedCollection < private int size; private int slidingMeanValue = 20; private TreeMapmap; public MySortedCollection(int size) < map = new TreeMap(); > void Rimuovi (tasto int, valore int) < TIntHashSet set = map.get(value); if (set == null || !set.remove(key)) throw new IllegalStateException("cannot remove key " + key + " with value " + value + " - did you insert " + key + "," + value + " before?"); size--; if (set.isEmpty()) map.remove(value); >Update del vuoto pubblico (tasto int, int oldValue, valore int) < remove(key, oldValue); insert(key, value); >public void Insert (INT Key, Int Value) < TIntHashSet set = map.get(value); if (set == null) map.put(value, set = new TIntHashSet(slidingMeanValue)); // else // slidingMeanValue = Math.max(5, (slidingMeanValue + set.size()) / 2); if (!set.add(key)) throw new IllegalStateException("use update if you want to update " + key); size++; >public int peekValue () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); if (e.getValue().isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return map.firstEntry().getKey(); > public int Peekkey () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); TIntHashSet set = map.firstEntry().getValue(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return set.iterator().next(); >public int pollkey () < size--; if (size < 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); TIntHashSet set = e.getValue(); TIntIterator iter = set.iterator(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); int val = iter.next(); iter.remove(); if (set.isEmpty()) map.remove(e.getKey()); return val; > public int size () < return size; >pubblico booleano isEmpty () < return size == 0; >public int getLidingMeanValue () < return slidingMeanValue; >@Override Public String toString () < return "size " + size + " min=(" + peekKey() + "=>" + peekValue () +") ";>> Collezione ordinata che consente i duplicati?

Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Dopo una breve sessione di risoluzione dei problemi in cui non riuscivo a capire perché i miei occhi in misterili abbiano ordinato PriorityQueue sputò i suoi elementi in modo non oriente. In altre parole, una priorità non può essere considerata una raccolta ordinata. Il motivo per cui un albero non è un’opzione è che ho bisogno della collezione per consentire i duplicati. E voglio che sia sempre ordinato, senza usare le collezioni.ordinare().
Non chiederò le ragioni di questo comportamento di PriorityQueue, dal momento che la discussione qui lo copre abbastanza bene. Quello che voglio chiedere, tuttavia, è se ci sono alternative là fuori che non conosco?
Quindi, per riassumere, ciò di cui ho bisogno è una raccolta che:
C’è una tale collezione nell’API Java? O sono le mie esigenze troppo inverosimili? Eventuali suggerimenti sul modo migliore e più pulito per risolverlo? E la performance non è una preoccupazione per me, dal momento che in totale la collezione non conterrà mai più di alcune centinaia di elementi.

Maresciallo
Post: 77786

Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Penso che dovrai scrivere il tuo. Quello che descrivi è un elenco che prende l’ordinamento naturale piuttosto che l’ordine di inserimento come ordinamento. Scrivi un wrapper attorno a un’implementazione dell’elenco; Usa una ricerca binaria per trovare il punto di inserimento nel metodo ADD (E) e lanciare anunsupportadOperationException dal metodo ADD (int, e). Nota che la tua classe wrapper dovrà implementare l’elenco


Sceriffo
Post: 22739


Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Campbell Ritchie ha scritto: e lanciare AnunSupportadOperationException dal metodo ADD (int, e). Nota che la tua classe wrapper dovrà implementare anche l’interfaccia dell’elenco.
La classe Wrapper non ha bisogno di implementare l’elenco; Implementa invece la raccolta. L’elenco aggiunge tre cose che la raccolta non ha:
1) Un ordine specificato
2) indicizzazione degli elementi
3) spostarsi sia in avanti che indietro con l’elenco
Dal momento che probabilmente non avrai bisogno di 2 o 3, il wrapper deve solo implementare la raccolta. Se implementi l’elenco, stai rendendo più difficile per te stesso, perché ADD (int, e) non è l’unico posto in cui puoi rompere l’ordinamento ordinato:
– Addall (int, raccolta) consente anche l’aggiunta in qualsiasi posizione (un’altra Exception non supportata)
– Impostare (int) consente di sovrascrivere un elemento con qualsiasi altro elemento (un altro ExupportedOperationException)
– Devi proteggere l’elenco restituito anche da Sublist (puoi avvolgerlo in una nuova istanza di wrapper)
– Devi proteggere il tuo listerator, consente anche di aggiungere e sostituire elementi (avrai bisogno di un’altra classe wrapper)
E cosa ti dà l’elenco che potresti desiderare? get (int), indexof (oggetto), lastIndexof (oggetto), sublist (int, int). Ma hai davvero bisogno di quelli? La raccolta non li ha, il set non li ha, la coda (priorità) non li ha.
SCJP 1.4 – SCJP 6 – SCWCD 5 – OCEEJBD 6 – OCEJPAD 6
Come fare domande come rispondere alle domande
Jimi Svedenholm
Mano ranch

Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Ok, ho pensato ancora un po ‘e ho alcune opzioni da scegliere tra:
L’opzione 3 è stata il mio primo pensiero, dal momento che nella mia mente dovrebbe essere abbastanza facile. Ma si è scoperto che in realtà non era così facile. Quello che sto cercando di ordinare sono oggetti che implementano l’interfaccia org.Springframework.nucleo.Ordinato. Esiste già un comparatore per gli oggetti ordinati, tuttavia se il numero di ordine di entrambi gli oggetti è lo stesso, il comparatore restituisce semplicemente 0. Ma voglio che restituisca solo 0 se gli oggetti sono davvero uguali. Perché ci saranno oggetti ordinati che sono tutt’altro che uguali, ma con lo stesso numero di ordine. Se il comparatore restituisce 0, allora il set degli alberi considera che questi oggetti siano uguali.
Il problema che sto riscontrando è decidere se l’elemento E1 dovrebbe essere considerato inferiore o più alto dell’elemento E2 quando E1.getOrder () == E2.getOrder (). Quello che ho fatto ora, in un’implementazione del test, è:
Non ho problemi con le fasi un po ‘complesse coinvolte, poiché raramente scenderà fino alle implementazioni di e hashcode. Il problema che ho è con l’ultimo passaggio, f. Perché rompe il contratto di comparabile. Se un confronto (E1, E2) si riduce a F, allora il risultato è -1, ma il risultato di confronto (E2, E1) è * anche * -1! Anche se ciò non accadrà quasi mai, * può * accadere.
Cosa ne pensate di questo comparatore? Mi è sembrato “solo sbagliato” quando l’ho scritto, ma non mi piace anche il modo in cui l’organizzazione.Springframework.nucleo.OrderComparator è scritto poiché può prendere in considerazione oggetti non uguali (come da O1.uguali (o2)) per essere uguale (riportando 0). Oppure, quando ci penso, la mia * vera * Peve è l’interfaccia impostata, che afferma chiaramente che considera gli oggetti uguali se il confronto/comparatore si traduce in 0. Quello che dovrebbe fare, se me lo chiedi, è fare una chiamata successiva O1.uguali (O2) e considerali solo come duplicati se restituisce vero.
Ma poiché le implementazioni set non cambieranno presto (o per niente) a questo proposito, sto iniziando a appoggiarmi all’opzione 2 sopra poiché è più semplice dell’opzione 1 e più pulito, quindi l’opzione 3.
Campbell Ritchie

Maresciallo
Post: 77786

Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Un comparatore coerente con uguali suona una buona idea, ma se lo usi con un set degli alberi non riceverai duplicati.

Jimi Svedenholm
Mano ranch

Pubblicato 13 anni fa
Numero di fette da inviare:
Nota opzionale di “ringraziamento”:

Campbell Ritchie ha scritto: Un comparatore coerente con uguali suona una buona idea, ma se lo usi con un albero non riceverai duplicati.
Bene, ci sono due diversi tipi di uguaglianza/duplicità qui*. Un comparatore considera due elementi uguali se il “confronto calcolo” provoca 0. E questo è apparentemente l’unico equilibrio uguale. Ma il modo in cui lo vedo, questa definizione stretta di pari è inadeguata. Gli oggetti sono solo “uguali” agli occhi del comparatore, ma il setset dovrebbe usare il comparatore solo per ordinamento, non controlli di duplicità. Se due elementi hanno un “confronto-resulto” di 0 ma dove eguals () restituisce falso, allora dovrebbe semplicemente considerare questo come “non duplicato, ma l’ordine è irrilevante”.
Ma forse qualcuno può spiegare il motivo dietro questa caratteristica imperfetta di My-Eyes di SortedSet? Perché si fida del confronto/confronto per quanto riguarda il controllo della duplicità senza fare un corretto Equals () Controllo? Ho letto il Javadoc, ma tutto ciò che dice è che è il modo in cui viene implementato. Prestazione?
Quindi, per tornare al mio post originale. Quando ho parlato di duplicati, intendevo duplicati secondo il punto di vista dei comparati, e il motivo per cui ho usato quella definizione era che questa è la definizione che usa SortedSet. Non ho motivo di mettere VERO duplicati (cioè dove O1.uguali (O2)) nella collezione.
La soluzione a cui sto appoggiando ora è quella di creare la mia collezione (cioè “collezione implementa”) che ha un arraylist interno. Questa raccolta delega semplicemente tutte le chiamate del metodo all’ArrayList, ma prima che i metodi Toarray e Iterator siano chiamati ordinamento dell’ArrayList usando il comparatore fornito. Un risultato bonus di questo rispetto a “Opzione 3” sopra è che questa soluzione non ha problemi con elementi mutabili in cui i campi utilizzati per il confronto possono cambiare dopo che è stato aggiunto alla raccolta. Un setset potrebbe probabilmente non essere in grado di affrontare elegantemente questo scenario.
Qualche commento su questa soluzione?
* Tre se si considera ‘==’, ma questo è solo un caso speciale di uguali ().
Come consentire i duplicati
O ектрон scart.
I set ordinati in Redis non hanno permesso i duplicati. Possiamo consentire duplicati in set ordinati ?
—
Saluti,
Manula Thantriwatte .
Undergraduate | School of Computing dell’Università di Colombo
Sri Lanka
Demis Bellot
не прочитано,
23 febbraio. 2011 г., 09:28:47 23.02.2011
Написать собщение автору
Чтобы ответить автору, вйдите в с итеу
Чтобы переслать собщение, войдите в с сисеу
У в нет разрешения на удаление сè.
Пожаловатьс на собщение
Чтобы пожаловатьс на собщение, войropa в в с ите м
Показать иходное собщение
O ектрон scart.
– Redi. @GoogleGroups.com, manula thantriwatte
Sei sicuro di non voler usare un elenco? Come set per definizione non contiene duplicati.
—
Hai ricevuto questo messaggio perché sei iscritto al gruppo “Redis DB” di Google Groups.
Per pubblicare a questo gruppo, inviare e -mail a redi. @GoogleGroups.com.
Per annullare l’iscrizione a questo gruppo, inviare e-mail a Redis-DB+U. @GoogleGroups.com.
Per ulteriori opzioni, visitare questo gruppo su http: // gruppi.Google.com/gruppo/redis-db?Hl = en.
Didier Spezia
не прочитано,
23 febbraio. 2011 г., 10:18:24 23.02.2011
Написать собщение автору
Чтобы ответить автору, вйдите в с итеу
Чтобы переслать собщение, войдите в с сисеу
У в нет разрешения на удаление сè.
Пожаловатьс на собщение
Чтобы пожаловатьс на собщение, войropa в в с ите м
Показать иходное собщение
O ектрон scart.
Se stai cercando di costruire un’indicizzazione non univoca ordinata
struttura dei dati e sono davvero bloccati con Redis, puoi
Vuoi dare un’occhiata al database Alchemy di Jak Sprats.
Rimane per lo più compatibile con Redis, ma può adattarsi al tuo
ha bisogno di meglio a causa del suo supporto per gli indici BTREE in memoria.
Se hai bisogno di discuterne, usa il
gruppo dedicato.
Il 23 Fév, 09:25, Manula Thantriwatte
ha scritto:
Will Maier
не прочитано,
23 febbraio. 2011 г., 12:27:05 23.02.2011
Написать собщение автору
Чтобы ответить автору, вйдите в с итеу
Чтобы переслать собщение, войдите в с сисеу
У в нет разрешения на удаление сè.
Пожаловатьс на собщение
Чтобы пожаловатьс на собщение, войropa в в с ите м
Показать иходное собщение
O ектрон scart.
– Redi. @GoogleGroups.com
Mercoledì 23 febbraio 2011 alle 01:55:16 +0530, Manula Thantriwatte ha scritto:
> I set ordinati in Redis non hanno permesso i duplicati. Possiamo consentire i duplicati
> Set ordinati ?
Il solito trucco prevede la composizione dei valori nel set usando il punteggio. Per tempo
Dati della serie, in cui il punteggio è un timestamp e il valore è un numero, questo
dovrebbe essere sufficiente per preservare la vita unica di valori potenzialmente ripetuti.
Per esempio:
Tempo zadd.Serie 1298460338 “1298460348 9”
Tempo zadd.Serie 1298460348 “1298460348 10”
Tempo zadd.Serie 1298460358 “1298460358 11”
Il tuo cliente dovrebbe quindi dividere i valori che riceve da Redis in ordine
Per ottenere il valore effettivo.
