Enumerazione dell'intervallo ImmutableSortedDictionary per chiave


11

Stavo leggendo su C # 's ImmutableSortedDictionaryin System.Collections.Immutablee pensare a come applicarla nel mio programma. Mi piacciono abbastanza i C ++ lower_bounde upper_bound(vedi qui ), e mi aspettavo piuttosto di vedere qualcosa del genere per le ricerche di intervallo. Tuttavia, metodi simili sembrano stranamente assenti dalla documentazione . Mi sto perdendo qualcosa? O MS fornisce veramente un dizionario ordinato senza un accesso efficiente agli intervalli ordinati? Questo non sembra esattamente qualcosa che si potrebbe fare su uno IEnumerabledei tasti come dire un metodo di estensione, quindi sono un po 'perplesso non vedo qualcosa fornito direttamente dalla raccolta.


Eric Lippert ha condiviso un'implementazione di albero AVL immutabile nel 2008. Dai commenti, non credo che sia stato ancora particolarmente ottimizzato per la velocità o l'efficienza, ma IBinarySearchTree<K,V>implementa sembra più vicino a quello che mi aspetterei. Mi chiedo se ci abbia mai armeggiato ulteriormente?
J Trana,

La ImmutableList<T>classe è anche implementata come un albero AVL. Dal codice sorgente :/// The root node of the AVL tree that stores this set.
Theodor Zoulias il

Sai se significano che l'elenco utilizza un AVL true per implementare l'immutabilità o se l'albero AVL stesso è immutabile? (forse non importa perché non espongono comunque l'albero).
J Trana,

Ecco i vantaggi di ImmutableList<T>(supportato da un albero AVL) rispetto a ImmutableArray<T>(supportato da un array), secondo la documentazione . Motivi per utilizzare l'elenco immutabile: 1) L'aggiornamento dei dati è comune o il numero di elementi non dovrebbe essere ridotto. 2) L'aggiornamento della raccolta è più importante per le prestazioni rispetto all'iterazione dei contenuti.
Theodor Zoulias,

Questo perché quando si aggiunge o si elimina un elemento da un grande albero AVL, è possibile ottenere un nuovo albero senza distruggere quello originale, condividendo la maggior parte dei nodi e creando solo pochi nuovi nodi. ( Struttura dei dati persistente - Alberi )
Theodor Zoulias,

Risposte:


9

È irritante che le raccolte integrate disponibili non offrano un set completo di funzionalità (come la SortedDictionarymancanza di un BinarySearchmetodo), costringendoci a cercare soluzioni di terze parti (come la libreria C5 ).

Nel tuo caso invece di an ImmutableSortedDictionaryprobabilmente potresti usare a ImmutableSortedSet, incorporando i valori nelle chiavi e usando un comparatore appropriato. Almeno l'API di questa classe contiene le proprietà Mine Max.


2
Come nota a margine, un'altra classe immutabile, la ImmutableList<T>, è implementata internamente come un albero . Quindi è 10 volte più lento e alloca 12 volte più memoria di a List<T>. Usa ImmutableArray<T>invece.
Theodor Zoulias,

1
Hehe, uso già C5 ma sto cercando di vedere cosa era disponibile per raccolte immutabili (oltre alle istantanee). Grazie! Proverò la speranza che qualcun altro abbia risolto questo in qualche modo forma, ma terrò presente ilImmutableSortedSet
J Trana,

@TheodorZoulias che senso ha avere il metodo BinarySearch in SortedDictionary, quando il metodo TryGetValue funziona nel registro (N)? vedi qui
Giorgi Chkhikvadze il

2
@GiorgiChkhikvadze BinarySearch può darti il ​​prossimo elemento che è più grande dell'elemento che stai cercando, nel caso in cui non venga trovata una corrispondenza esatta.
Theodor Zoulias,

1
@GiorgiChkhikvadze Probabilmente la differenza più grande qui è che il valore di ritorno non è solo un singolo valore nella raccolta, ma piuttosto un modo per indicizzare la raccolta in modo efficiente. Il metodo BinarySearch è speciale non solo perché trova il valore in modo efficiente, ma perché trova un indice anche in caso di mancanza, come ha sottolineato Theodor, che consente un accesso rapido ad esempio a un array. Nel caso di un albero, tuttavia, un indice intero potrebbe non essere un modo efficiente per accedere alla struttura; Il C ++ risolve questo problema attraverso l'uso di un oggetto iteratore (sebbene con le sue complessità).
J Trana,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.