Best recursion choice for "penultimax"

Dr Mark H Phillips mark@austrics.com.au
26 Nov 2002 16:27:33 +1030


Thanks for your alternative solutions.  (I also take
Mark Jones' point that there was an error with some of my
initial solutions.)

On Mon, 2002-11-25 at 16:36, Mark P Jones wrote:
> To your three implementations, let me add another two.  If you are
> looking
> for the smallest possible definition, consider the following:
> 
>   import List
> 
>   penultimax1 :: Ord a => [a] -> a
>   penultimax1  = head . tail . sortBy (flip compare)
> 
> A little more algorithmic sophistication leads to the following
> alternative that can find the penultimax with only  n + log2 n
> comparisons (approx), where n is the length of the list.

Is this "n + log(2n)" or "n + (log n)^2" or perhaps "n + log_base_2 n"?

Also, how did you calculate this?  (I am new to O(.) calculations
involving lots of recursion (ie in functional languages))

> 
>   penultimax :: Ord a => [a] -> (a, a)
>   penultimax  = tournament . map enter
>    where enter x = (x, [])
> 
>          tournament [(x, xds)] = (x, maximum xds)
>          tournament others     = tournament (round others)
> 
>          round ((x,xds):(y,yds):others)
>                    | x>=y      = (x, y:xds) : rest
>                    | otherwise = (y, x:yds) : rest
>                      where rest = round others
>          round xs              = xs
> 
> 
> Neat algorithm eh?  But be careful ...

It is interesting!

> 
> | How do I work out which is best to use?  Is there
> | one clear "winner", or will they each have pros and
> | cons?
> 
> Some quick tests with Hugs +s on a example list that I constructed
> with 576 elements give food for thought:

Thanks for the idea of using "hugs +s".  I haven't seen this
before.

> 
>                       reductions     cells
>    my one liner          4035        11483
>    tournament            7053        12288
>    your penultimax      16715        20180
>    your penultimax2      7466        10344
>    your penultimax3      8605        13782

> Hope this helps (or at least, is entertaining :-)

Yes.  Thanks!

Mark.

-- 
Dr Mark H Phillips
Research Analyst (Mathematician)

AUSTRICS - smarter scheduling solutions - www.austrics.com

Level 2, 50 Pirie Street, Adelaide SA 5000, Australia
Phone +61 8 8226 9850
Fax   +61 8 8231 4821
Email mark@austrics.com.au