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中是两种不同的类型:
列表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对于索引查找会更好,但是对于折叠和映射会稍差一些,因为它们还有几个步骤可以到达下一个元素。