2011-07-18 111 views

回答

11

鉴于此操作是线性的,您不应将其用于性能至关重要的代码“热”部分。在寒冷部分,按照Adi的建议使用list @ [element]。在热门的部分,重写你的算法,这样你就不需要那样做。

执行此操作的典型方法是在处理过程中在反向订单中累积结果,然后在返回结果之前颠倒整个累计列表。如果你有N个处理步骤(每个步骤都添加一个元素到列表中),那么你就分摊N个元素的反向线性代价,所以你保留一个线性算法而不是二次方法。

在某些情况下,另一种工作是处理反向顺序中的元素,以便累计结果变为正确顺序,而无需显式反转步骤。

18

的原因有没有一个标准功能,要做到这一点的是,在列表的末尾附加是反模式(又名一个“snoc列表”或Schlemiel the Painter algorithm)。在列表末尾添加元素需要列表的完整副本。在列表前面添加一个元素需要分配一个单元格—新列表的尾部可以指向旧列表。

这就是说,最简单的方法来做到这一点是

let append_item lst a = lst @ [a] 
相关问题