【问题标题】:Array vs List in ElmElm 中的数组与列表
【发布时间】:2016-06-08 16:05:01
【问题描述】:

得知 ArrayList 在 Elm 中是两种不同的类型,我感到很惊讶:

就我而言,我有一个长度为 2,000,000 的 List Int,我需要其中大约 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 或两者中完成吗?

【问题讨论】:

  • List 是一个链表结构,所以表达式y[x[i]] 是对x 中的ith 的O(n) 查找加上对x 的另一个O(n) 查找y 中的元素。换句话说,对于 200 万个元素中的 10000 次查找,这将非常缓慢。使用数组。
  • 除非y 保证被排序,否则不同的算法将起作用
  • 只是出于好奇:通过从 2.000.000 个元素列表中挑选 10.000 个元素来解决更广泛的问题是什么?
  • 这 200 万个元素是图像中的像素。我得到 10000 分,我需要找到它们的 RGB 颜色。如果你愿意,我可以问一个新问题

标签: arrays list elm


【解决方案1】:

List 是一个基于索引提供 O(n) 查找时间的链表。通过索引获取元素需要遍历n 节点上的列表。 List 的索引查找函数在核心库中不可用,但您可以使用 elm-community/list-extra 包,它提供了两个查找函数(因参数顺序而异):!!getAt

Array 允许 O(log n) 索引查找。可以使用Array.get 完成对Array 的索引查找。数组表示为Relaxed Radix Balanced Trees

两者都是不可变的(Elm 中的所有值都是不可变的),因此您可以根据自己的情况进行权衡。 List 在您进行大量更改时非常棒,因为您只是在更新链表指针,而 Array 非常适合快速查找,但修改性能稍差,如果您正在做,您需要考虑很多变化。

【讨论】:

  • 我没有检查,但我认为 Array 是某种形式的红黑树,具有 O(lg n) 查找?
  • @SørenDebois 你是绝对正确的,在 Elm 的 Array 中查找是 O(lg n)
  • 看起来 Array 在后台使用 Relaxed Radix Balanced Trees。我已经更新了我的答案。
  • 对于折叠或映射,哪个更好,ArrayList
  • 一般来说,List 在折叠和映射方面会有更好的性能,因为它是“一步”到下一个项目。 Arrays 对于索引查找会更好,但在折叠和映射方面表现稍差,因为它们需要更多步骤才能到达下一个元素。
【解决方案2】:

这样的事情应该可以工作:

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 函数。

【讨论】:

    【解决方案3】:

    只有在需要使用Array.get时才使用Array

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

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2023-03-19
      • 2016-04-02
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多