2010-04-11 7 views
5

Necesito una estructura de datos que funcione como SortedDictionary<int, double> pero se ordena según los valores en lugar de las claves. Necesito aproximadamente 1-2 microsegundos para agregar y eliminar elementos cuando tenemos aproximadamente 3000 elementos en el diccionario..NET SortedDictionary pero ordenado por valores

Mi primer pensamiento fue simplemente cambiar las claves y los valores en mi código. Esto casi funciona. Puedo agregar y eliminar elementos en aproximadamente 1.2 microsegundos en mis pruebas al hacer esto.

Pero las claves tienen que ser únicas en SortedDictionary, lo que significa que los valores en mi diccionario inverso tendrían que ser únicos. Y hay algunos casos en que pueden no serlo.

¿Alguna idea de algo en las bibliotecas de .NET ya me funcionaría?

+0

Asumo SortedList <> que no cumple con el rendimiento? –

+0

¿Puedes explicar qué representan las claves y los valores en tu dominio? –

+0

@Simon Creo que SortedList <> también está ordenado por claves. http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx –

Respuesta

1

La biblioteca PowerCollections tiene una clase llamada OrderedMultiDictionary<TKey, TValue> que es básicamente como SortedDictionary<TKey, TValue> pero permite duplicados. Cuando busca una clave, obtiene un valor enumerable en lugar de un valor único.

La biblioteca es gratuita y usted debe poder hacer exactamente lo que quiera con esa clase - almacene los valores como claves.

+0

Guau, ¡eso es genial! Permítanme descargar y ver si nos hace 1-2 muy rápido. –

+0

Nota: si no desea utilizar esa biblioteca, siempre puede implementarla usted mismo con un 'SortedDictionary', y simplemente almacenar una' List 'como el valor en lugar de una sola' T'. – Aaronaught

+0

Add/Remove es aproximadamente 30 microsegundos más o menos para la biblioteca PowerCollections. Muy cerca, pero no estoy seguro si es suficiente para esta aplicación. Gracias por el puntero sin embargo. SortedDictionary > también es una buena idea, déjame ver si puedo cronometrar eso. Otro pensamiento que tuve fue utilizar SortedDictionary agregar un pequeño término aleatorio de orden .0000001 o menos, que forzaría a mis valores a ser únicos pero no afectar el resultado. –

3

se puede ordenar SortedDictionary por el valor de esta manera:

yourList.Sort(
    delegate(KeyValuePair<int, double> val1, 
    KeyValuePair<int, double> val2) 
    { 
     return val1.Value.CompareTo(val2.Value); 
    } 
); 
+0

Innovador. Me gusta. – Armstrongest

Cuestiones relacionadas