我很惊讶地发现Array
和List
是榆树中的两种不同类型:
在我的情况下,我有List Int
长度2,000,000,我需要大约10,000,但我事先不知道哪一万。这将由另一个清单提供。在伪代码中:
x = [ 1,1,0,30,...,255,0,1 ]
y = [ 1,4,7,18,36,..., 1334823 , ... 1899876 ]
z = [ y[x[0]], y[x[1]], ... ]
我正在使用伪代码,因为很明显这不是Elm语法(它可能是合法的JavaScript)。
可以在List
或Array
或两者中完成这些数组选择吗?
答案 0 :(得分:37)
List
是一个链表,它根据索引提供O(n)查找时间。按索引获取元素需要遍历n
个节点上的列表。 List
的索引查找功能在核心库中不可用,但您可以使用elm-community/list-extra包,该包提供两个查找函数(根据参数顺序变化):!!
和getAt
Array
允许 O(log n)索引查找。 Array
上的索引查找可以使用Array.get
完成。数组表示为Relaxed Radix Balanced Trees。
两者都是不可变的(Elm中的所有值都是不可变的),因此您需要根据具体情况进行权衡。当您进行大量更改时,List
非常棒,因为您只是更新链接列表指针,而Array
非常适合快速查找,但对于修改有一些较差的性能,您可能希望考虑一下你是否做了很多改变。
答案 1 :(得分:1)
这样的事情应该有效:
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
它将输入列表转换为数组以进行快速索引,然后将索引列表映射到数组中的相应值。我从this StackOverflow question获取了fromJust
函数。
答案 2 :(得分:0)
仅在需要使用Array.get
时使用Array
。
在大多数情况下,您应该使用List
,因为通常您可以使用foldl
,map
等来完成所需的一切,而不必从索引和{{1 }}的这些功能具有更好的性能。