removing last element from the list

Richard A. O'Keefe ok@REDACTED
Thu May 26 08:44:41 CEST 2005


Gaspar Chilingarov <nm@REDACTED> wrote:
	are there any really fast ways to remove last element from list?
	
No.  However, there _is_ the standard "functional" representation for
queues:

hi_add(X, {L,R}) -> {[X|L],R}.

hi_rem({[X|L],R}) -> {X, {L,R}};
hi_rem({[],[X|R]} -> hi_rem(reverse([X|R])).

lo_add(X, {L,R}) -> {L,[X|R]}.

lo_rem({L,[X|R]}) -> {X, {L,R}};
lo_rem({[X|L],[]}) -> lo_rem(reverse([X|L])).

q_len({L,R}) -> length(L) + length(R).

q_empty({[],[]}) -> true;
q_empty(_) -> false.

	I need to implement something like FIFO,
	new elements inserted in list push old elements out.
	
Use the data structure above.  Use lo_add/2 to add new elements
	Q1 = lo_add(Elem, Q0)
and hi_rem/2 to remove old elements
	{Elem, Q1} = hi_rem(Q0)
Or of course you could use hi_add/2 to add and lo_rem/2 to remove.

This isn't constant time, but it is constant _average_ time when used
as a queue.  You do O(1) work to add an element and O(1) work *per element*
to reverse the list, although the peak cost per removal is O(|q_len|).




More information about the erlang-questions mailing list