A fin de exponer sobre la respuesta anterior de Tobsen, la Biblioteca Colección C5 genérico tiene un gran número de, bueno, colecciones. Voy a describir algunos de ellos aquí:
cola/Pila
CircularQueue<T>
: Esta clase proporciona funcionalidad estrictamente Queue y Stack. Además, eficiente O (1) el acceso a cualquier elemento de la pila/Queue está disponible mediante el indizador: cq[0]
(donde 0 es el elemento más antiguo, al lado de ser quitado de la cola, último en ser metimos).
Listas
Nota: ArrayList
y LinkedList
también pueden funcionar como cola/Pilas
ArrayList<T>
: Al igual que su contraparte en System.Collections.Generic (SCG)
, List<T>
, esto está respaldado por una matriz, garantizando O (1) de indexación, pero peor caso O (n) inserción. O (n) para encontrar un artículo.
LinkedList<T>
: Similar a su contraparte SCG.LinkedList<T>
. Usando una lista doblemente enlazada, garantiza O (1) inserción, pero el peor de los casos O (n) indexación (en la práctica, es proporcional a la distancia de la cabecera o la cola de la lista). También O (n) para encontrar un artículo. La ordenación utiliza una clasificación de combinación estable.
HashedArrayList<T>
: Similar al anterior ArrayList<T>
, pero no permite duplicados. El beneficio que obtiene a cambio es que el tiempo para encontrar un artículo y su índice se reduce a O (1).
HashedLinkedList<T>
: Similar al anterior LinkedList<T>
, pero no permite duplicados.Como antes, el tiempo para encontrar un artículo se reduce a O (1), pero el tiempo para encontrar su índice sigue siendo O (n).
WrappedArray<T>
: Bastante similar a la ArrayList<T>
, esto actúa como una envoltura alrededor de una matriz que implementa C5.IList<T>
, pero lanza excepciones si se hace un intento de modificar la colección (IsFixedSize
es verdadera y Add
, Remove
, Insert
no funcionan; Sort
, Shuffle
y Reverse
lo hacen, sin embargo, ya que son operaciones in situ).
Las listas también proporcionan una funcionalidad "Ver" que representa un segmento de la lista subyacente, lo que permite realizar operaciones locales. Usando los patrones ofrecidos en el libro C5, las operaciones se pueden realizar utilizando vistas que son eficientes tanto en la matriz como en las listas vinculadas. Cualquier operación de lista también se puede realizar en una vista, restringiendo su efecto a un subconjunto de la lista subyacente.
ordenadas Colecciones
SortedArray<T>
: Similar a un ArrayList<T>
excepto que mantiene sus artículos ordenados y no permite duplicados. Tenga en cuenta que las inserciones y eliminaciones aleatorias en esta colección son lentas. Esta recopilación es mejor si el número de elementos es pequeño o rara vez se modifica, pero a menudo se accede por índice o valor del artículo.
TreeSet<T>
: utiliza una estructura de árbol rojo-negro para mantener los elementos ordenados. Como conjunto, no permite duplicados. Acceso por el índice o elemento de valor y de inserción/deleción tomar O (log n).
TreeBag<T>
: Utiliza un árbol rojo-negro, manteniendo los elementos ordenados. Como bolsa, permite duplicados, pero no almacena duplicados en el árbol, sino que guarda duplicados contando.
Tanto TreeSet<T>
y TreeBag<T>
ofrecen la posibilidad de realizar de manera eficiente "instantáneas" o copias persistentes del árbol en O (1), lo que permite iteración sobre la instantánea al modificar el árbol subyacente. Tenga en cuenta que cada instantánea en un árbol agrega una penalización de rendimiento a las actualizaciones del árbol, pero estos efectos desaparecen cuando se elimina la instantánea.
Colecciones Hash
HashSet<T>
: Una colección utilizando una tabla hash simple para el almacenamiento. El acceso por valor de elemento toma O (1). Como conjunto, no permite duplicados. Proporciona una función BucketCostDistribution()
que puede ayudarlo a determinar la eficacia de la función de código hash de los elementos.
HashBag<T>
: Similar al HashSet<T>
, pero tiene una semántica de bolsa, lo que significa que los duplicados están permitidos, pero los duplicados solo se almacenan contando.
cola de prioridad
IntervalHeap<T>
: Proporciona una cola de prioridad.Encontrar el máximo y el mínimo son O (1) operaciones, eliminar el máximo, mínimo, adición y actualización son O (log n) operaciones. Permite duplicados almacenándolos explícitamente (no contando).
Diccionarios
HashDictionary<H,K>
: Similar a la SCG.Dictionary<H,K>
, proporciona acceso de entrada, inserción y deleción en O (1). También proporciona una función BucketCostDistribution()
como HashSet<T>
arriba. No garantiza ninguna orden de enumeración particular.
TreeDictionary<H,K>
: Similar al SCG.SortedDictionary<H,K>
, proporciona un diccionario persistentemente ordenado utilizando un árbol rojo-negro. El acceso de entrada, la inserción y la eliminación llevan O (log n). Garantiza que la enumeración del diccionario sigue el orden especificado por el comparador de claves.
Colecciones vigilado
Además, C5 también ofrece colecciones "vigilados", que actúa eficazmente como un envoltorio de sólo lectura, la prevención de la colección de ser modificados. Los elementos de la colección aún pueden modificarse, pero los elementos no se pueden agregar, eliminar o insertar en la colección.
Una respuesta larga, pero completa en las bibliotecas de C5 varias colecciones a su disposición. He encontrado la biblioteca C5 a ser grande y, a menudo usarlo en mi propio código, en sustitución del #header C común con:
using C5;
using SCG = System.Collections.Generic;
También hay System.Collections.Specialized con más golosinas, como StringDictionary y NameValueCollection – Hafthor
@Hafthor: Sí, aunque la mayoría de ellos se han vuelto algo obsoletos con los genéricos. –
Muy buena lista que ha ensamblado. Todo lo que he usado está allí. –
stephenbayer