2010-09-07 13 views
6

Estoy usando un diccionario ordenado para mantener una lista de elementos, de los cuales regularmente debo monitorear el estado de los principales x elementos. Cada vez que actualizo un artículo, me gustaría encontrar una forma rápida de determinar a qué índice está usando el ítem al que me refiero. Entiendo que puedo enumerar la lista completa y contar mi posición, pero estoy buscando algo con O (log n) time o mejor, después de que todo el diccionario ordenado esté en un árbol RedBlack. Cada nodo debe ser capaz de realizar un seguimiento de sus hijos, y esto debería ser un cálculo rápido.La forma más eficiente de encontrar el índice de un artículo en SortedDictionary

+1

¿Ha considerado cambiar a 'SortedList '? Puede hacer 'O (1)' recuperación por índice. Sin embargo, tiene un rendimiento horrible en insertos y elimina. – Ani

+0

Dado que esta es una estructura en árbol, no existe el concepto de índice. Solo nodos con un enlace secundario izquierdo y derecho. –

+0

No entiendo esta pregunta: los elementos en los árboles no tienen un índice. – Lee

Respuesta

5

Usted puede simplemente cambiar su SortedDictionary<TKey, TValue> en un SortedList<TKey, TValue> y luego usar IndexOfKey(key):

var s = new SortedList<string, string> 
    { { "a", "Ay" }, { "b", "Bee" }, { "c", "Cee" } }; 

// Outputs 1 
Console.WriteLine(s.IndexOfKey("b")); 

utiliza internamente Array.BinarySearch<TKey>(), por lo que será O (log n), que es más rápido que O (n) (que sería si usted buscara de adelante hacia atrás iterando a través de él).

+0

¿Qué sucede si necesita una O (1) inserción y Eliminar además de la búsqueda O (log (n)? –

+1

@eranotzer: Entonces tendrá que usar un 'Diccionario ' (no puede tener O (1) inserte si se supone que debe estar siempre ordenado) y tendrá que ordenarlo manualmente para hacer la búsqueda O (log n) (por ejemplo, usando 'dic.Keys.ToList()' seguido de 'Ordenar' y luego' IndexOf') – Timwi

0

Se podría construir una estructura de árbol para acceder a los elementos por índice o informar el índice de un elemento existente en tiempo de lgN, lo que requiere un tiempo extra muy ligero para las inserciones y eliminaciones. Una forma de hacerlo sería realizar un seguimiento de cuántos elementos se encuentran en las ramas izquierda y derecha de cada nodo (en una inserción o eliminación, cambie el recuento de nodos de los nodos principales al cambiar el recuento de los hijos). Sin embargo, si una estructura basada en árboles no ofrece tal facilidad, no conozco ninguna manera fácil de actualizarla.

+0

Este es el ángulo que estaba buscando, pero estoy buscando una estructura que ya lo tenga o una forma fácil de actualizar. – Superman

Cuestiones relacionadas