arrays - Array vs Lista en Elm
(2)
Algo como esto debería funcionar:
import Array
import Debug
fromJust : Maybe a -> a
fromJust x = case x of
Just y -> y
Nothing -> Debug.crash "error: fromJust Nothing"
selectFromList : List a -> List Int -> List a
selectFromList els idxs =
let arr = Array.fromList els
in List.map (/i -> fromJust (Array.get i arr)) idxs
Convierte la lista de entrada en una matriz para una indexación rápida, luego asigna la lista de índices a sus valores correspondientes en la matriz. Tomé la función fromJust
de esta pregunta de StackOverflow .
Me sorprendió saber que Array
y List
eran dos tipos diferentes en Elm:
En mi caso, tengo una List Int
de 2.000.000 de longitud y necesito unos 10.000, pero no sé de antemano cuáles diez mil. Eso será proporcionado por otra lista. En pseudocódigo:
x = [ 1,1,0,30,...,255,0,1 ]
y = [ 1,4,7,18,36,..., 1334823 , ... 1899876 ]
z = [ y[x[0]], y[x[1]], ... ]
Estoy usando pseudocódigo porque claramente esto no es sintaxis de Elm (podría ser JavaScript legal).
¿Se pueden hacer estas selecciones de matriz en List
o Array
o ambas?
List
es una lista vinculada que proporciona un tiempo de búsqueda O (n) basado en el índice. Obtener un elemento por índice requiere atravesar la lista sobre n
nodos. La función de búsqueda de índice para la List
no está disponible en la biblioteca central, pero puede usar el paquete elm-community/list-extra que proporciona dos funciones para la búsqueda (que varían según el orden de los parámetros): !!
y getAt
.
Array
permite la búsqueda de índice O (log n) . Las búsquedas de índice en Array
se pueden hacer usando Array.get
. Las matrices se representan como árboles equilibrados de radix relajado .
Ambos son inmutables (todos los valores en Elm son inmutables), por lo que tiene concesiones en función de su situación. List
es excelente cuando haces muchos cambios porque simplemente estás actualizando los punteros de la lista vinculada, mientras que Array
es excelente para la búsqueda rápida pero tiene un rendimiento algo menor para las modificaciones, lo que querrás considerar si estás realizando muchos cambios. .