Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
lstlec

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

     LSTLEC ( Last character element less than or equal to. )

     INTEGER FUNCTION  LSTLEC ( STRING, N, ARRAY )

Abstract

     Find the index of the largest array element less than or equal to 
     a given character string in an ordered array of character strings.

Required_Reading

     None.

Keywords

     ARRAY
     SEARCH

Declarations

     IMPLICIT NONE

     CHARACTER*(*)    STRING
     INTEGER          N
     CHARACTER*(*)    ARRAY ( * )

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     STRING     I   Upper bound value to search against.
     N          I   Number of elements in ARRAY.
     ARRAY      I   Array of possible lower bounds.

     The function returns the index of the last element of ARRAY that
     is lexically less than or equal to STRING.

Detailed_Input

     STRING   is a string acting as an upper bound: the element of
              ARRAY that is lexically the greatest element less than or
              equal to STRING is to be found. Trailing blanks in this
              bound value are not significant.

     N        is the total number of elements in ARRAY.

     ARRAY    is an array of character strings to be searched. Trailing
              blanks in the strings in this array are not significant.
              The strings in ARRAY must be sorted in non-decreasing
              order. The elements of ARRAY need not be distinct.

Detailed_Output

     The function returns the index of the highest-indexed element in
     the input array that is lexically less than or equal to STRING.
     The routine assumes the array elements are sorted in
     non-decreasing order.

     Indices range from 1 to N.

     If all elements of ARRAY are lexically greater than STRING, the
     routine returns the value 0. If N is less than or equal to zero,
     the routine returns the value 0.

Parameters

     None.

Exceptions

     Error free.

     1)  If N is less than or equal to zero, the function returns 0.
         This case is not treated as an error.

     2)  If the input array is not sorted in non-decreasing order, the
         output of this routine is undefined. No error is signaled.

Files

     None.

Particulars

     This routine uses a binary search algorithm and so requires
     at most on the order of

        log (N)
           2

     steps to compute the value of LSTLEC.

     Note: If you need to find the first element of the array that is
     lexically greater than STRING, simply add 1 to the result returned
     by this function and check to see if the result is within the
     array bounds given by N.

Examples

     Suppose that you have a long list of words, sorted alphabetically
     and entirely in upper case. Furthermore suppose you wished to
     find all words that begin the sequence of letters PLA,  then
     you could execute the following code.

           START = 0
           I     = 1

           DO I = 1, NWORDS

              IF ( WORD(I)(1:3) .EQ. 'PLA' ) THEN

                 IF ( START .EQ. 0 ) THEN
                    START = I
                 END IF

                 END = I
              END IF

           END DO

     This can of course be improved by stopping the loop once START
     is non-zero and END remains unchanged after a pass through the
     loop. However, this is a linear search  and on average can be
     expected to take NWORDS/2 comparisons. The above algorithm
     fails to take advantage of the structure of the list of words
     (they are sorted).

     The code below is much simpler to code, simpler to check, and
     much faster than the code above.

           START = LSTLEC( 'PL ', NWORDS, WORDS ) + 1
           END   = LSTLEC( 'PLA', NWORDS, WORDS )

           do something in case there are no such words.

           IF ( START .GT. END ) THEN
              START = 0
              END   = 0
           END IF

     This code will never exceed 2 * LOG_2 ( NWORDS ) comparisons.
     For a large list of words (say 4096) the second method will
     take 24 comparisons  the first method requires on average
     2048 comparisons. About 200 times as much time. Its clear
     that if searches such as this must be performed often, that
     the second approach could make the difference between being
     able to perform the task in a few minutes as opposed to
     several hours.

     For more ideas regarding the use of this routine see LSTLEI
     and LSTLTI.

Restrictions

     1)  If the sequence of character strings in the input array ARRAY
         is not non-decreasing, the program will run to completion but
         the index found will not mean anything.

Literature_References

     None.

Author_and_Institution

     J. Diaz del Rio    (ODC Space)
     H.A. Neilan        (JPL)
     W.L. Taber         (JPL)

Version

    SPICELIB Version 1.1.0, 26-OCT-2021 (JDR)

        Added IMPLICIT NONE statement.

        Edited the header to comply with NAIF standard. Removed
        unnecessary $Revisions section. Improved $Detailed_Input,
        $Detailed_Output, $Particulars, $Exceptions and $Restrictions
        sections.

    SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)

        Comment section for permuted index source lines was added
        following the header.

    SPICELIB Version 1.0.0, 31-JAN-1990 (WLT) (HAN)
Fri Dec 31 18:36:32 2021