¿Qué implementación del paquete scala.collection.mutable
debo tomar si tengo la intención de hacer muchas eliminaciones by-index, como remove(i: Int)
, en un entorno de subproceso único? La opción más obvia, ListBuffer
, dice que puede tomar tiempo lineal dependiendo del tamaño del búfer. ¿Hay alguna colección con log(n)
o incluso tiempo constante para esta operación?Scala: más rápido `remove (i: Int)` en la secuencia mutable
Respuesta
operadores de mudanzas, incluyendo buf remove i
, no son parte de Seq
, pero es en realidad parte de Buffer
rasgos en scala.mutable
. (Consulte Buffers)
Consulte la primera tabla en Performance Characteristics. Supongo que buf remove i
tiene la misma característica que inserción, que son lineales para ambos ArrayBuffer
y ListBuffer
. Como se documenta en Array Buffers, utilizan matrices de forma interna, y Link Buffers usan listas vinculadas (que todavía es O (n) para eliminar).
Como alternativa, el Vector inmutable le puede dar un tiempo constante efectivo.
Los vectores se representan como árboles con un alto factor de ramificación. Cada nodo de árbol contiene hasta 32 elementos del vector o contiene hasta 32 otros nodos de árbol. [...] Entonces, para todos los vectores de tamaño razonable, una selección de elementos implica hasta 5 selecciones de matriz primitiva. Esto es lo que queríamos decir cuando escribimos que el acceso a los elementos es "efectivamente tiempo constante".
scala> import scala.collection.immutable._
import scala.collection.immutable._
scala> def remove[A](xs: Vector[A], i: Int) = (xs take i) ++ (xs drop (i + 1))
remove: [A](xs: scala.collection.immutable.Vector[A],i: Int)scala.collection.immutable.Vector[A]
scala> val foo = Vector(1, 2, 3, 4, 5)
foo: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> remove(foo, 2)
res0: scala.collection.immutable.Vector[Int] = Vector(1, 2, 4, 5)
Nótese, sin embargo, una alta constante de tiempo con una gran cantidad de gastos indirectos no pueden ganar un acceso rápido lineal hasta que el tamaño de los datos es significativamente grande.
Dependiendo de su caso de uso exacto, es posible que pueda usar LinkedHashMap
desde scala.collection.mutable
.
Aunque no se puede eliminar por índice, puede eliminar mediante una clave única en tiempo constante, y mantiene un orden determinista cuando itera.
scala> val foo = new scala.collection.mutable.LinkedHashMap[String,String]
foo: scala.collection.mutable.LinkedHashMap[String,String] = Map()
scala> foo += "A" -> "A"
res0: foo.type = Map((A,A))
scala> foo += "B" -> "B"
res1: foo.type = Map((A,A), (B,B))
scala> foo += "C" -> "C"
res2: foo.type = Map((A,A), (B,B), (C,C))
scala> foo -= "B"
res3: foo.type = Map((A,A), (C,C))
Yeap, gracias por la gran sugerencia. Sin embargo, este enfoque tiene sus propias limitaciones (carece de 'index' y no hereda de' Seq'). Pero es bueno. – incarnate
- 1. ¿Por qué i = i + 1 es más rápido que i ++?
- 2. diferencia entre int * i y int * i
- 3. Diferencia entre int * i y int ** i
- 4. Hacer mi List.filter más rápido en Scala?
- 5. hg remove -I PATTERN, ¿cómo funciona?
- 6. Scala - parámetro de método mutable (var) referencia
- 7. En C++, ¿qué es más rápido? (2 * i + 1) o (i << 1 | 1)?
- 8. Sin lista mutable de Scala
- 9. ¿Por qué 'int i = i;' ¿legal?
- 10. en Scala, largo, int, etc.
- 11. Scala: Mutable vs. Inmutable Object Performance - OutOfMemoryError
- 12. Es "int i = x ++, j = x ++;" ¿legal?
- 13. Secuencia con flujos en Scala
- 14. ¿Es ++ realmente más rápido que i ++ en for-loops en java?
- 15. ¿Es + = más rápido que - =?
- 16. Más rápido que String.Replace()
- 17. ¿Qué es más eficiente i ++ o ++ i?
- 18. mutable variable 'i' se utiliza de una manera válida.?
- 19. Análisis más rápido de números en .NET
- 20. ¿Cuál es la forma más fácil de clonar (copiar) un objeto Scala mutable?
- 21. Scala - añadir a cancelar la aplicación Int
- 22. ¿Mutar una colección mutable utilizando el mapa?
- 23. Detectar MPEG4/H264 I-Frame (IDR) en la secuencia RTP
- 24. que emiten es más rápido static_cast <int>() o int()
- 25. codificación no válida en la secuencia de cálculo de referencias: I "◄co OR [I" co]
- 26. ¿qué es más rápido: recrear o borrar()?
- 27. Para bucle en scala sin secuencia?
- 28. Scala enumeración a int
- 29. mutable vs. inmutable en las colecciones de Scala
- 30. Encuentra más larga secuencia
no hay ninguna columna en la primera mesa para "eliminar" – Ron
Por eso se dice "estoy adivinando el índice de eliminación tiene las mismas características que insertar". –
@Alexey Romanov Agregué la mayoría de la respuesta anterior después de que @Ron lo señaló. –