Previous Contents Next

Module Maxseq

let rec max_praefix l = (* determine the ``maximal'' prefix *)
   match l with
     [ ] ® ([ ],0)
   | x::tl ® 
       let (l'm) = (max_praefix tl)
       in
       if (x+m³ 0
       then (x::l'x+m)
       else ( [ ], 0)

let max_postfix l = (* analogoulsy for postfix *)
   let (postfixm) = (max_praefix (List.rev l))
   in (List.rev postfixm)

let rec step (l: (int list × int list × intlist) =
(* sub list max seq max *)
   match l with
     [ ] ® [ ]
   | [e® [e]
   | (llseq_lmax_l) :: (lrseq_rmax_r) :: tl ® 
       let (postmax_1) = max_postfix ll
       and (praemax_2) = max_praefix lr
       in 
       match ( max_1+max_2£ max_lmax_l £ max_rmax_r £ max_1+max_2
       with 
         (truetrue_ ) ® (ll@lrseq_rmax_r) :: step tl
       | (true_ , true® (ll@lrseq_lmax_l) :: step tl
       | ( _ , truetrue® (ll@lrpost@praemax_1+max_2) :: step tl
       | (truefalse,false® (ll@lrseq_lmax_l) :: step tl
       | (false,truefalse® (ll@lrseq_rmax_r) :: step tl
       | (false,false,true® (ll@lrpost@praemax_1+max_2) :: step tl
       | _ ® raise ( Failure "Cannot happen")

let rec steps (l: (int list × int list × intlist) =
   match l with
     [ ] ® ([ ],[ ],0)
   | [l1® l1
   | _ ® steps (step l)

let rec explode_seq (l : int list) =
   match l with
     [ ] ® [ ]
   | x::tl ® 
       if x³
       then ([x], [x], x) :: explode_seq tl
       else ([x], [ ], 0) :: explode_seq tl

let maxseq (l : int list) = 
   let (_,s,_) = steps(explode_seq lin s
January 31, 2002
Previous Contents Next