我正在尝试删除Haskell中列表的最后一个元素,并且发现了有关init
函数的信息。由于我要使用的函数必须是O(n),所以我想知道init
的时间复杂度是什么。
答案 0 :(得分:9)
init :: [a] -> [a]
是implemented as [src]:
init [] = errorEmptyList "init" init (x:xs) = init' x xs where init' _ [] = [] init' y (z:zs) = y : init' z zs
因此,为了生成列表,它将在源列表上进行迭代,每次在尾部都不是空列表的情况下,每次向前看一个元素并发出前一个元素。
因此,这意味着对于 n 个元素的列表,将需要 O(n)时间来计算该列表的init
。>
但是在Haskell函数中,调用是惰性的。例如,如果您仅对采用第一个k
元素感兴趣,它将以 O( min( n , k ))。