简体   繁体   中英

What Time Complexity Does Haskell's “tail”-Function Have?

I was reading a tutorial on Haskell when I thought to myself; what time complexity does Haskell's tail function have (and why)? (I cannot find an answer in any documentation)

I would guess that for a list of size n, the tail function would be O(n) , ie just copying over the tail to a new list and returning that one. But then again, I do not know too much about the underlying architecture of Haskell (I'm new to the language).

Of course, I could time it. But I don't know how to time stuff in Haskell yet, and I also want to learn how Haskell handles the problem, to justify why it is O(n)/O(1) or whatever.

Thanks in advance :)

Haskell the language doesn't specify. But in GHC (the most frequently used implementation), it is O(1). The tail does not need to be copied -- it is safe to share between the original list and whoever uses just the tail of the list -- because everything in Haskell is immutable.

Challenge problem: why does init , which keeps all but the last element of a list, run in O(n)? Why doesn't the sharing argument above apply there?

Short answer: if the list is already constructed up to that node, O(1) .

A list in Haskell is a linked list . It is defined as:

data [a] = [] | a : [a]

So that means that either we have the empty list, or the a : [a] construct. So a node with a head (the a ) that refers to an object of type a , and a tail that refers to a list [a] (which can be the empty list, or another node).

The source code of the tail in base is defined as:

 tail :: [a] -> [a] tail (_:xs) = xs tail [] = errorEmptyList "tail" 

It runs in O(1) since we simply follow the pointer to the "tail" of that node.

Mind however that Haskell works lazily . It is not because we get an object of type [a] that we have a materialized list: usually Haskell will first have to evaluate the expression tree it has been given up to the given node. This can result in evaluating a complex and time consuming algorithm. So it depends on the expression tree you have been given .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM