我想获得一个列表,但是最后和第一个元素。什么是最有效的方式?
middle = init . tail
或:
middle = tail . init
在丢弃n-first元素和n-last元素的情况下?
答案 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这样的东西。