In: Computer Science
Scheme Programming - Racket R5RS
Longest Non-Decreasing Subsequence
You will write two Scheme functions that compute a longest non-decreasing subsequence from a list of numbers. For example, if you type
> (lis '(1 2 3 2 4 1 2))
you might get
(1 2 3 4)
Note that there may be more than one longest non-decreasing subsequence. In the above example, your program might also find (1 2 2 4) or (1 2 2 2).
You should concentrate first on simply getting a solution working. One possibility is simple exhaustive search:
for i := n downto 1, where n is the length of the input list
for all i-element sublists s of the input list
if s is a non-decreasing sequence of numbers
print s and quit
Unfortunately, this algorithm is inefficient. The number of distinct sublists of a given list is 2n (to generate a sublist, we have two choices -- include or exclude -- for each of n elements).
Once you have a simple version running using the above algorithm, your next task is to find a polynomial-time solution.
To avoid typing long lists at the interpreter line, I suggest you create a few sample arguments in a file, say my_lists.rkt. You can create those definitions in DrRacket's definition window and save them in file my_lists.rkt. For example, if my_lists.rkt may contain definitions
(define list1 '(1 2 3 2 4 1 2))
(define list2 '(2 4 3 1 2 1))
you can call
> (lis list1)
and
> (lis list2)
#lang racket/base
(require data/gvector)
 
(define (gvector-last gv)
  (gvector-ref gv (sub1 (gvector-count gv))))
 
(define (lis-patience-sort input-list)
  (let ([piles (gvector)])
    (for ([item (in-list input-list)])
      (insert-item! piles item))
    (reverse (gvector-last piles))))
 
(define (insert-item! piles item)
  (if (zero? (gvector-count piles))
      (gvector-add! piles (cons item '()))
      (cond
        [(not (<= item (car (gvector-last piles))))
         (gvector-add! piles (cons item (gvector-last piles)))]
        [(<= item (car (gvector-ref piles 0)))
         (gvector-set! piles 0 (cons item '()))]
        [else (let loop ([first 1] [last (sub1 (gvector-count piles))])
                (if (= first last)
                    (gvector-set! piles first (cons item (gvector-ref piles (sub1 first))))
                    (let ([middle (quotient (+ first last) 2)])
                      (if (<= item (car (gvector-ref piles middle)))
                          (loop first middle)
                          (loop (add1 middle) last)))))])))
Output:
'(2 4 5) '(0 2 6 9 11 15)
Note: Plzzz don' t give dislike.....Plzzz comment if u have any problem i will try to resolve it.......