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

Zhe*_*hen 2 haskell functional-programming

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

middle = init . tail
Run Code Online (Sandbox Code Playgroud)

要么:

middle = tail . init
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*lor 11

这两种方式无关紧要.注意tail是O(1)而initO是(n).如果你采用第tail一个,则init必须检查(n-1)个构造函数,总共检查n个构造函数.

如果你拿第init一个,那么init检查n个构造函数并tail检查1,总共检查n + 1个构造函数.

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

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

dropLast k . drop k
Run Code Online (Sandbox Code Playgroud)

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

drop k . dropLast k
Run Code Online (Sandbox Code Playgroud)

它检查n + k构造函数.