sequences funciones - En Clojure, ¿cuándo debería usar un vector sobre una lista, y viceversa?




ejemplos (5)

Leí que los vectores no son seqs, sino que las listas son. No estoy seguro de cuál es la razón para usar uno sobre el otro. Parece que los vectores son los que más se usan, pero ¿hay alguna razón para eso?


Answers

Cuándo usar un vector:

  • Rendimiento de acceso indexado: obtiene ~ O (1) costo para el acceso indexado frente a O (n) para las listas
  • Anexar - con conj es ~ O (1)
  • Notación conveniente: me resulta más fácil escribir y leer [1 2 3] que '(1 2 3) para una lista literal en circunstancias en las que cualquiera funcionaría.

Cuándo usar una lista:

  • Cuando desee acceder a él como una secuencia (ya que las listas admiten directamente seq sin tener que asignar nuevos objetos)
  • Anteponer - agregar al inicio de una lista con contras o preferiblemente conj es O (1)

Una vez más, parece que he respondido mi propia pregunta poniéndome impaciente y preguntándola en #clojure en Freenode. Lo bueno es que se alientan sus propias preguntas en .com: D

Tuve una discusión rápida con Rich Hickey, y aquí está lo esencial.

[12:21] <Raynes>    Vectors aren't seqs, right?
[12:21] <rhickey>   Raynes: no, but they are sequential
[12:21] <rhickey>   ,(sequential? [1 2 3])
[12:21] <clojurebot>    true
[12:22] <Raynes>    When would you want to use a list over a vector?
[12:22] <rhickey>   when generating code, when generating back-to-front
[12:23] <rhickey>   not too often in Clojure

Si ha realizado mucho la programación de Java y está familiarizado con el marco de recopilación de Java, piense en listas como LinkedList y vectores como ArrayList . Entonces puede elegir recipientes de la misma manera.

Para mayor aclaración: si tiene la intención de agregar elementos individualmente al frente o al final de la secuencia, una lista vinculada es mucho mejor que un vector, ya que no es necesario mezclar los elementos cada vez. Sin embargo, si desea obtener elementos específicos (no cerca del frente o la parte posterior de la lista) con frecuencia (es decir, acceso aleatorio), querrá usar vectores.

Por cierto, los vectores pueden convertirse fácilmente en seqs.

user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)

Los vectores tienen O (1) tiempos de acceso aleatorio, pero deben ser preasignados. Las listas se pueden extender dinámicamente, pero el acceso a un elemento aleatorio es O (n).


Si sus elementos son distintos, entonces una simple diferencia de conjuntos servirá.

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]




list vector clojure sequences