Es la implementación en HashSet.ElementAt
O (1) y si no es así, ¿qué es?¿Es Enumerable.ElementAt <TSource> O (1) para HashSet?
Respuesta
No, es O (n). Todos los métodos de extensión en IEnumerable<T>
son, por necesidad, O (n) (porque lo único que puede hacer IEnumerable<T>
es ... enumerar). Aunque, como se señala en los comentarios, intentan enviar a una interfaz que puede implementar la operación más rápido (por ejemplo, ElementAt
intentará convertir a IList<T>
para implementar una operación O (1)). No es que eso ayude en el caso de HashSet<T>
que no implementa IList<T>
de todos modos.
Para HashSet<T>
el concepto de "ElementAt" no tiene mucho sentido de todos modos, porque no hay una "orden" como tal. Básicamente, estás obteniendo un elemento aleatorio.
No hay método en el ElementAt
HashSet
por lo que probablemente quieren saber el rendimiento del método Enumerable.ElementAt
cuando se usa en una instancia de HashSet<T>
.
El método Enumerable.ElementAt
tiene una optimización para los tipos que implementan IList<T>
. En ese caso, el rendimiento es O (1). Sin embargo, HashSet no implementa esta interfaz, por lo tanto, el rendimiento es O (n).
@Steven, hay un elemento porque HashSet deriva de ICollection. –
@Filip: 'HashSet
@Steven, estoy usando .NET 4.0 y ReSharper me sugiere que use 'ICollection
Depende del tipo de lista de subllantas. El reflector muestra que Enumerable<T>.ElementAt(...)
intenta convertir primero a IList<T>
. En ese caso sería O (1).
Un proveedor de consultas, por ejemplo, puede devolver algo que es un IList<T>
. Pero lo más probable es que si aplica cualquiera de los operadores de Linq, se convertirá en IEnumerable<T>
, ya que se construyen simplemente utilizando diferentes enumeradores, y se convertirá en O (n).
EDITAR: He leído el HashSet
. Un HashSet<T>
no implementa IList<T>
, por lo tanto, es O (n).
- 1. En C++, ¿qué es más rápido? (2 * i + 1) o (i << 1 | 1)?
- 2. ¿Es string.ElementAt() O (1)?
- 3. ¿Por qué es HashSet <T> .IsReadOnly explícito?
- 4. O (1) hash ups?
- 5. Can .NET 4 ISet <> HashSet <> replace NHibernate Iesi.Collections ISet, HashSet?
- 6. SortedSet <T> vs HashSet <T>
- 7. ¿Es el HashSet <T> el contenedor más rápido para buscar?
- 8. Llamando a Distinct <>() en HashSet <T>
- 9. Type.GetType(), HashSet <T> y la Asamblea Calificación
- 10. Cython: para i de 1 <= i <N
- 11. HashSet
- 12. ¿Cuál es la complejidad del tiempo de búsqueda de HashSet <T> (IEqualityComparer <T>)?
- 13. Definir: ¿Qué es un HashSet?
- 14. Hashcode e igual para Hashset
- 15. ¿Cuándo debo usar el tipo HashSet <T>?
- 16. C# HashSet <T> rendimiento de búsqueda (en comparación con un ObservableCollection <T>)?
- 17. ¿Qué es mejor para crear estructuras de datos distintas: HashSet o Linq's Distinct()?
- 18. En Javascript, ¿por qué [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) es falso?
- 19. char_x <(char_y + 1) == char_x <= char_y?
- 20. Conversión de HashSet <String> a Cadena []
- 21. C todo el contenido de HashSet <string>
- 22. List <int> test = {1, 2, 3} - ¿Es una característica o un error?
- 23. ¿Cómo compara HashSet elementos para la igualdad?
- 24. unsigned long 0 <-1?
- 25. Con Entity Framework, ¿es mejor usar .First() o .Take (1) para "TOP 1"?
- 26. Convierta una matriz a HashSet <T> en .NET
- 27. HashSet <T> en Windows Phone 7
- 28. ¿Por qué HashSet <T> no implementa IReadOnlyCollection <T>?
- 29. ¿Es un HashSet <T> lo mismo que la lista <T> pero con unicidad?
- 30. ¿Por qué es (1 <NaN) falso en JavaScript?
Entonces, una cosa más inteligente sería hacer un 'ToArray' si necesita usar ElementAt en muchas filas? ¿Nunca es posible obtener el pedido "correcto" con un HasSet? –
Sí, un solo 'ToArray' y luego múltiples" elemento en "(a través del operador' [] ') sería mucho más rápido. No existe un orden "correcto" con un HashSet, ya que los elementos no están ordenados de ninguna manera significativa. –
Derecha, sin embargo, cuando hago esto: {2, 3, 4} e inicio dos HashSets con esos, obtengo el orden correcto al recorrer cada elemento. –