Array.copy vs omitir y tomar c#
Pregunta
Estaba navegando por esta pregunta y algunas similares:
Obtener una subrainal de una matriz existente
Muchos lugares que leo respuestas como esta:
Obtener una subrainal de una matriz existente
Lo que me pregunto es por qué omitir y tomar no son operaciones de tiempo constantes para matrices.
A su vez, si eran operaciones de tiempo constantes, ¿no se omitir y tomar el método (sin llamar a toArray () al final) tendrá el mismo tiempo de ejecución sin la sobrecarga de hacer una matriz.copy, pero también más eficiente en el espacio?
Solución
Tienes que diferenciar entre el trabajo que el Skip
y Take
Los métodos lo hacen y el trabajo de consumir los datos que devuelven los métodos.
los Skip
y Take
Los métodos mismos son operaciones O (1), ya que el trabajo que realizan no escala con el tamaño de entrada. Acaban de configurar un enumerador que es capaz de devolver elementos de la matriz.
Es cuando usas el enumerador que el trabajo está hecho. Esa es una operación O (n), donde n es el número de elementos que produce el enumerador. A medida que los enumeradores leen de la matriz, no contienen una copia de los datos, y debe mantener los datos en la matriz intactos siempre que esté utilizando el enumerador.
(Si utiliza Skip
En una colección que no se puede acceder por índice como una matriz, obtener el primer elemento es una operación O (n), donde n es el número de elementos omitidos).