List
是一个链表,可以根据索引提供 O(n) 的查找时间。通过索引获取元素需要遍历列表中的 n
个节点。在核心库中没有为 List
提供索引查找函数,但是你可以使用 elm-community/list-extra 包,该包提供了两个查找函数(根据参数顺序不同而有所不同):!!
和 getAt
。
Array
允许进行 O(log n) 索引查找。可以使用Array.get
进行数组的索引查找。数组以Relaxed Radix Balanced Trees表示。
两者都是不可变的(Elm 中所有值都是不可变的),因此取决于你的情况而有不同的权衡。如果你需要频繁进行修改,则 List
很好,因为你只需要更新链表指针,而 Array
对于修改的性能较差但查找速度快,如果你需要频繁进行查找,则应考虑使用它。
Array
查找是O(lg n)。 - halfzebraArray
和List
哪个更好? - fiatjafList
在折叠和映射方面的性能更好,因为它是“一步”到达下一个项目。Array
对于索引查找来说更好,但在折叠和映射方面的性能略差,因为它们需要更多的步骤才能到达下一个元素。 - Chad Gilbertimport 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
fromJust
函数。只有在需要使用Array.get
时才使用Array
。
在大多数情况下,应该使用List
,因为通常您可以使用foldl
、map
等完成所需的所有操作,而无需从索引获取项,并且List
在这些函数中具有更好的性能。
List
是一个链表结构,因此表达式y[x[i]]
是对x
中第i
个元素的 O(n) 查找加上对y
中元素的另一个 O(n) 查找。换句话说,对于在 200 万个元素中进行的 10000 次查找,这将变得非常缓慢。请使用数组。 - Alex Reinking