2012-04-21 15 views
5

Ho letto tonnellate di articoli sulla scelta della raccolta corretta per un'implementazione specifica, e capisco che alla fine si arriverà al benchmark dei dati reali, ma mentre sono impegnato a farlo:Collezione modifica articolo

  • Quale raccolta ordinata in C# consente la modifica di un articolo contenuto? Non riesco a trovarlo?

  • È questo a causa di una modifica sarebbe probabilmente essere implementato come una rimozione poi ri-inserimento, rendendo così un esplicito funzione 'Modifica' inutile?

ho bisogno di una raccolta (personalizzata o libreria standard), con le seguenti operazioni eseguite su di esso.

  • Inserisci - spesso
  • Remove - spesso
  • Modifica - molto spesso
  • elementi Select Top X - ogni volta che una di queste accade, e di più, simultaneamente.

Attualmente sto usando un SortedSet, in quanto fornisce O inserti (log), ma sono poco chiare su prestazioni di rimozione e come modificare un elemento migliore.

+0

La raccolta deve essere ordinata in ogni momento? Otterrai un enorme vantaggio in termini di prestazioni se puoi applicare più modifiche e poi effettuare le ordinazioni una volta dopo. –

+0

@Evenhuis Sfortunatamente sì, perché più "clienti" richiedono questo elenco e ne hanno bisogno in ordine ogni volta che viene apportata una modifica a questo elenco. O almeno l'elemento principale. – Vort3x

+0

Abbiamo utilizzato una BST bilanciata nel nostro corso di strutture dati. È stato piuttosto veloce, ma l'abbiamo implementato in C++. Potresti considerarlo forse. Ecco una buona fonte di informazioni: http: //www.codeproject.it/Articoli/68500/Balanced-Binary-Search-Tree-BST-Search-Delete-Prin –

risposta

1

In primo luogo, è necessario chiarire il significato della modifica di una raccolta.

In genere, la manipolazione della raccolta fa riferimento all'inserimento/eliminazione di elementi dall'elenco. Per modificare un singolo elemento, in pratica si accede all'elemento e si modificano le sue proprietà. Il costo di accesso a un articolo dipende dall'implementazione della raccolta, ma la modifica dell'offerta dell'oggetto non dipende dalla raccolta. Inoltre, non è possibile modificare un elemento della raccolta se non è modificabile.

Se stai cercando le migliori raccolte predefinite, in pratica stai scegliendo tra SortedList e SortedSet (SortedDictionary è uguale a SortedSet).

SortedList memorizza i dati internamente come matrice, quindi ha un accesso efficiente per indice (per ottenere gli articoli X principali); SortedSet ha un inserimento e una rimozione più veloci (per fattore costante), tuttavia l'accesso indicizzato richiederà la ricerca nell'albero per l'elemento successivo che, nel peggiore dei casi, è O (log n) e best Oes (1).

A parte questo, la differenza tra i due è piuttosto piccola, poiché entrambi implementano Red Black Tree, differisce solo nei dettagli di implementazione.

Le prestazioni effettive dovranno essere misurate per i casi dell'utente. Ma lo sai già.