Arrays Elm中的数组与列表

Arrays Elm中的数组与列表,arrays,list,elm,Arrays,List,Elm,我惊讶地发现数组和列表在Elm中是两种不同的类型: 在我的例子中,我有一个长度为2000000的列表Int,我需要大约10000个,但我事先不知道是哪一万个。这将由另一个列表提供。在伪代码中: 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) 这些数

我惊讶地发现
数组
列表
在Elm中是两种不同的类型:

在我的例子中,我有一个长度为2000000的
列表Int
,我需要大约10000个,但我事先不知道是哪一万个。这将由另一个列表提供。在伪代码中:

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)


这些数组选择可以在
列表
数组
或两者中进行吗?

列表
是一个基于索引提供O(n)查找时间的链表。按索引获取元素需要遍历
n
节点上的列表。核心库中没有
列表
的索引查找功能,但您可以使用提供两个查找功能的软件包(按参数顺序变化):和

Array
允许进行O(logn)索引查找。可以使用在
数组上进行索引查找。数组表示为


两者都是不可变的(Elm中的所有值都是不可变的),因此您可以根据您的情况进行权衡<代码> >清单>代码是很好的,因为你只是在更新链表指针,而 >数组对于快速查找来说是很好的,但是修改的性能稍差,如果你做了很多修改,你会想考虑的。

< P>这样的事情应该起作用:

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

它将输入列表转换为用于快速索引的数组,然后将索引列表映射到数组中相应的值。我从just
函数中获取了

仅在需要时使用
数组。


在大多数情况下,您应该使用
List
,因为通常您可以使用
foldl
map
等完成所有需要的操作,而不必从索引中获取项目,
List
使用这些函数具有更好的性能。

List
是一种链表结构,因此表达式
y[x[i]]
是对
x
中的
i
th的O(n)查找,加上对
y
中的元素的另一个O(n)查找。换句话说,对于2mil元素中的10000次查找,这将非常缓慢。使用数组。除非保证对
y
进行排序,否则出于好奇,一种不同的算法会起作用:从2000.000元素列表中选择10.000元素,你能解决什么更广泛的问题?200万元素是图像中的像素。我得到10000分,我需要找到他们的RGB颜色。如果你愿意的话,我可以问一个新问题。我没有检查,但我认为数组是某种形式的红黑树,具有O(lg n)查找功能?@Sørendbois你完全正确,在Elm的
数组中查找是O(lg n)
看起来数组在引擎盖下使用。我已经更新了我的答案。对于折叠或映射,什么更好,
数组
列表
?一般来说,
列表
折叠和映射的性能更好,因为它是到下一项的“一步”<代码>数组
s对于索引查找会更好,但是对于折叠和映射会稍差一些,因为它们还有几个步骤可以到达下一个元素。