什么是获得列表中间元素的最有效方法?

时间:2012-09-05 15:41:45

标签: haskell functional-programming

我想获得一个列表,但是最后和第一个元素。什么是最有效的方式?

middle = init . tail

或:

middle = tail . init

在丢弃n-first元素和n-last元素的情况下?

2 个答案:

答案 0 :(得分:11)

这两种方式都没有关系。注意tail是O(1)而init是O(n)。如果先取tail,那么init必须检查(n-1)个构造函数,总共检查n个构造函数。

如果先取init,则init检查n个构造函数,tail检查1,总共检查n + 1个构造函数。

所以init . tail的效率要高得多,但效率却不高,你应该担心它。

同样适用于从列表的前端和末尾删除前k个元素,除了它可能会产生更大的差异。如果你先丢弃初始元素,那么在删除最终元素时就不必检查它们,并且节省了一些时间,所以你应该这样做

dropLast k . drop k

检查n个构造函数,而不是

drop k . dropLast k

检查n + k构造函数。

答案 1 :(得分:4)

两者都是一样的。你正试图在错误的位置进行优化。如果你的代码确实需要进行那种优化,那么你可能不需要列表,使用像Data.Sequence或Data.Vector这样的东西。