阵列与榆树中的列表

时间:2016-06-08 16:05:02

标签: arrays list elm

我很惊讶地发现ArrayList是榆树中的两种不同类型:

在我的情况下,我有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)。

可以在ListArray或两者中完成这些数组选择吗?

3 个答案:

答案 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,因为通常您可以使用foldlmap等来完成所需的一切,而不必从索引和{{1 }}的这些功能具有更好的性能。