La guía para los otros métodos debería ser, simplemente piense cómo debería ser una implementación eficiente.
La mayoría de otras operaciones masivas en colecciones (operaciones que procesan cada elemento de la colección) son O(n)
, por lo que no se mencionan allí. Ejemplos de ello son filter
, map
, foreach
, indexOf
, reverse
, find
...
Métodos iteradores que regresan o arroyos como combinations
y permutations
son generalmente O(1)
.
Los métodos que implican 2 colecciones suelen ser O(max(n, m))
o O(min(n, m))
. Estos son zip
, zipAll
, sameElements
, corresponds
, ...
Métodos union
, diff
y intersect
son O(n + m)
.
Las variantes de clasificación son, naturalmente, O(nlogn)
. El groupBy
es O(nlogn)
en la implementación actual. El indexOfSlice
utiliza el algoritmo KMP y es O(m + n)
, donde m
y n
son longitudes de las cadenas.
Métodos como +:
, :+
o patch
son generalmente O(n)
, así, a no ser que se trata de un caso específico de una colección inmutable para los que la operación en cuestión es más eficiente - por ejemplo, anteponiendo un elemento en un funcional List
o agregando un elemento a Vector
. Los métodos toX
generalmente son O(n)
, ya que tienen que iterar todos los elementos y crear una nueva colección. Una excepción es toStream
que construye la colección perezosamente, por lo que es O(1)
. Además, cada vez que X
es el tipo de la colección toX
, simplemente devuelve this
, que es O(1)
.
Las implementaciones de Iterator deben tener un O(1)
(amortizado) next
y hasNext
operaciones. La creación del iterador debe ser el peor de los casos O(logn)
, pero O(1)
en la mayoría de los casos.
Esto parece un poco extraño, como si se tratara de algo más que una estructura de datos completamente trivial, fácilmente podría haber algún algoritmo mejor no trivial para algunas operaciones. Por ejemplo, la intersección en TreeSets podría no ser lo mismo que verificar cada elemento de un conjunto para la membresía en el otro. – MGwynne
Lo que puede ser importante tener en cuenta sería el rendimiento del iterador de colecciones con acceso 'eC' o' log (n) '. Esto parece estar un poco optimizado para 'Vector' pero no he revisado las otras colecciones. – Debilski
@MGwynne: solo me estoy refiriendo a los métodos que ya no se describen en su enlace. Los que se describen en el enlace tienen complejidades muy específicas y resaltadas. Dondequiera que se pueda implementar algún método general de manera más eficiente en términos de esos métodos, esto se hizo generalmente, a mi leal saber y entender. – axel22