(length my-list) - O(n) or O(1) ?

Notices and updates
Locked
itistoday
Posts: 429
Joined: Sun Dec 02, 2007 5:10 pm
Contact:

(length my-list) - O(n) or O(1) ?

Post by itistoday »

Does (length) calculate the size of a list by iterating through its elements or is there a value stored somewhere internally?

Cyril
Posts: 183
Joined: Tue Oct 30, 2007 6:27 pm
Location: Moscow, Russia
Contact:

Re: (length my-list) - O(n) or O(1) ?

Post by Cyril »

itistoday wrote:Does (length) calculate the size of a list by iterating through its elements or is there a value stored somewhere internally?
I haven't look in C sources of newLISP, but direct timing reveals that answer is O(1). There is another wonder here: '(push elt lst -1)' works in a constant time. Therefore I believe that the pointer to the last element of a list is stored somewhere. But then '(last lst)' works in a linear time. Why? Maybe Lutz will explain?
With newLISP you can grow your lists from the right side!

Lutz
Posts: 5289
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California
Contact:

Post by Lutz »

You got it right Cyril, a pointer to the last element is stored in the list envelope to optimize appending a list. For 'last' the optimization was never done, but is trivial to add for 9.2.9.

Lutz

itistoday
Posts: 429
Joined: Sun Dec 02, 2007 5:10 pm
Contact:

Post by itistoday »

Thanks guys!
Lutz wrote:For 'last' the optimization was never done, but is trivial to add for 9.2.9.
That would be just hunky-dory! :-D

Cyril
Posts: 183
Joined: Tue Oct 30, 2007 6:27 pm
Location: Moscow, Russia
Contact:

Re: (length my-list) - O(n) or O(1) ?

Post by Cyril »

Cyril wrote:I haven't look in C sources of newLISP, but direct timing reveals that answer is O(1).
Oops! Wrong! It's O(n)! Very, very evil typo. Sorry, folks. And nobody have corrected me. :-( But you should'n trust me, try it yourself:

Code: Select all

(setq x (sequence 1 (eval-string (main-args 2))))
(setq a (time-of-day))
(setq y (length x))
(setq b (time-of-day))
(println (- b a))
(exit)
This gives 380ms for 5000000 and 770ms for 10000000 on my system.
With newLISP you can grow your lists from the right side!

itistoday
Posts: 429
Joined: Sun Dec 02, 2007 5:10 pm
Contact:

Re: (length my-list) - O(n) or O(1) ?

Post by itistoday »

Cyril wrote:Oops! Wrong! It's O(n)! Very, very evil typo. Sorry, folks. And nobody have corrected me. :-(
Are you saying that's what I get for trusting you? ;)

Yeah. That's a problem I think... Lutz?

Locked