Update.
[glibc.git] / manual / search.texi
blob013c5849140e97ed56392bb74900698a9abc2f5b
1 @node Searching and Sorting, Pattern Matching, Message Translation, Top
2 @chapter Searching and Sorting
4 This chapter describes functions for searching and sorting arrays of
5 arbitrary objects.  You pass the appropriate comparison function to be
6 applied as an argument, along with the size of the objects in the array
7 and the total number of elements.
9 @menu
10 * Comparison Functions::        Defining how to compare two objects.
11                                  Since the sort and search facilities
12                                  are general, you have to specify the
13                                  ordering.
14 * Array Search Function::       The @code{bsearch} function.
15 * Array Sort Function::         The @code{qsort} function.
16 * Search/Sort Example::         An example program.
17 * Hash Search Function::        The @code{hsearch} function.
18 * Tree Search Function::        The @code{tsearch} function.
19 @end menu
21 @node Comparison Functions
22 @section Defining the Comparison Function
23 @cindex Comparison Function
25 In order to use the sorted array library functions, you have to describe
26 how to compare the elements of the array.
28 To do this, you supply a comparison function to compare two elements of
29 the array.  The library will call this function, passing as arguments
30 pointers to two array elements to be compared.  Your comparison function
31 should return a value the way @code{strcmp} (@pxref{String/Array
32 Comparison}) does: negative if the first argument is ``less'' than the
33 second, zero if they are ``equal'', and positive if the first argument
34 is ``greater''.
36 Here is an example of a comparison function which works with an array of
37 numbers of type @code{double}:
39 @smallexample
40 int
41 compare_doubles (const double *a, const double *b)
43   return (int) (*a - *b);
45 @end smallexample
47 The header file @file{stdlib.h} defines a name for the data type of
48 comparison functions.  This type is a GNU extension.
50 @comment stdlib.h
51 @comment GNU
52 @tindex comparison_fn_t
53 @smallexample
54 int comparison_fn_t (const void *, const void *);
55 @end smallexample
57 @node Array Search Function
58 @section Array Search Function
59 @cindex search function (for arrays)
60 @cindex binary search function (for arrays)
61 @cindex array search function
63 Generally searching for a specific element in an array means that
64 potentially all elements must be checked.  The GNU C library contains
65 functions to perform linear search.  The prototypes for the following
66 two functions can be found in @file{search.h}.
68 @comment search.h
69 @comment SVID
70 @deftypefun {void *} lfind (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar})
71 The @code{lfind} function searches in the array with @code{*@var{nmemb}}
72 elements of @var{size} bytes pointed to by @var{base} for an element
73 which matches the one pointed to by @var{key}.  The function pointed to
74 by @var{compar} is used decide whether two elements match.
76 The return value is a pointer to the matching element in the array
77 starting at @var{base} if it is found.  If no matching element is
78 available @code{NULL} is returned.
80 The mean runtime of this function is @code{*@var{nmemb}}/2.  This
81 function should only be used elements often get added to or deleted from
82 the array in which case it might not be useful to sort the array before
83 searching.
84 @end deftypefun
86 @comment search.h
87 @comment SVID
88 @deftypefun {void *} lsearch (const void *@var{key}, void *@var{base}, size_t *@var{nmemb}, size_t @var{size}, comparison_fn_t @var{compar})
89 The @code{lsearch} function is similar to the @code{lfind} function.  It
90 searches the given array for an element and returns it if found.  The
91 difference is that if no matching element is found the @code{lsearch}
92 function adds the object pointed to by @var{key} (with a size of
93 @var{size} bytes) at the end of the array and it increments the value of
94 @code{*@var{nmemb}} to reflect this addition.
96 This means for the caller that if it is not sure that the array contains
97 the element one is searching for the memory allocated for the array
98 starting at @var{base} must have room for at least @var{size} more
99 bytes.  If one is sure the element is in the array it is better to use
100 @code{lfind} so having more room in the array is always necessary when
101 calling @code{lsearch}.
102 @end deftypefun
104 To search a sorted array for an element matching the key, use the
105 @code{bsearch} function.  The prototype for this function is in
106 the header file @file{stdlib.h}.
107 @pindex stdlib.h
109 @comment stdlib.h
110 @comment ISO
111 @deftypefun {void *} bsearch (const void *@var{key}, const void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare})
112 The @code{bsearch} function searches the sorted array @var{array} for an object
113 that is equivalent to @var{key}.  The array contains @var{count} elements,
114 each of which is of size @var{size} bytes.
116 The @var{compare} function is used to perform the comparison.  This
117 function is called with two pointer arguments and should return an
118 integer less than, equal to, or greater than zero corresponding to
119 whether its first argument is considered less than, equal to, or greater
120 than its second argument.  The elements of the @var{array} must already
121 be sorted in ascending order according to this comparison function.
123 The return value is a pointer to the matching array element, or a null
124 pointer if no match is found.  If the array contains more than one element
125 that matches, the one that is returned is unspecified.
127 This function derives its name from the fact that it is implemented
128 using the binary search algorithm.
129 @end deftypefun
131 @node Array Sort Function
132 @section Array Sort Function
133 @cindex sort function (for arrays)
134 @cindex quick sort function (for arrays)
135 @cindex array sort function
137 To sort an array using an arbitrary comparison function, use the
138 @code{qsort} function.  The prototype for this function is in
139 @file{stdlib.h}.
140 @pindex stdlib.h
142 @comment stdlib.h
143 @comment ISO
144 @deftypefun void qsort (void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare})
145 The @var{qsort} function sorts the array @var{array}.  The array contains
146 @var{count} elements, each of which is of size @var{size}.
148 The @var{compare} function is used to perform the comparison on the
149 array elements.  This function is called with two pointer arguments and
150 should return an integer less than, equal to, or greater than zero
151 corresponding to whether its first argument is considered less than,
152 equal to, or greater than its second argument.
154 @cindex stable sorting
155 @strong{Warning:} If two objects compare as equal, their order after
156 sorting is unpredictable.  That is to say, the sorting is not stable.
157 This can make a difference when the comparison considers only part of
158 the elements.  Two elements with the same sort key may differ in other
159 respects.
161 If you want the effect of a stable sort, you can get this result by
162 writing the comparison function so that, lacking other reason
163 distinguish between two elements, it compares them by their addresses.
164 Note that doing this may make the sorting algorithm less efficient, so
165 do it only if necessary.
167 Here is a simple example of sorting an array of doubles in numerical
168 order, using the comparison function defined above (@pxref{Comparison
169 Functions}):
171 @smallexample
173   double *array;
174   int size;
175   @dots{}
176   qsort (array, size, sizeof (double), compare_doubles);
178 @end smallexample
180 The @code{qsort} function derives its name from the fact that it was
181 originally implemented using the ``quick sort'' algorithm.
182 @end deftypefun
184 @node Search/Sort Example
185 @section Searching and Sorting Example
187 Here is an example showing the use of @code{qsort} and @code{bsearch}
188 with an array of structures.  The objects in the array are sorted
189 by comparing their @code{name} fields with the @code{strcmp} function.
190 Then, we can look up individual objects based on their names.
192 @comment This example is dedicated to the memory of Jim Henson.  RIP.
193 @smallexample
194 @include search.c.texi
195 @end smallexample
197 @cindex Kermit the frog
198 The output from this program looks like:
200 @smallexample
201 Kermit, the frog
202 Piggy, the pig
203 Gonzo, the whatever
204 Fozzie, the bear
205 Sam, the eagle
206 Robin, the frog
207 Animal, the animal
208 Camilla, the chicken
209 Sweetums, the monster
210 Dr. Strangepork, the pig
211 Link Hogthrob, the pig
212 Zoot, the human
213 Dr. Bunsen Honeydew, the human
214 Beaker, the human
215 Swedish Chef, the human
217 Animal, the animal
218 Beaker, the human
219 Camilla, the chicken
220 Dr. Bunsen Honeydew, the human
221 Dr. Strangepork, the pig
222 Fozzie, the bear
223 Gonzo, the whatever
224 Kermit, the frog
225 Link Hogthrob, the pig
226 Piggy, the pig
227 Robin, the frog
228 Sam, the eagle
229 Swedish Chef, the human
230 Sweetums, the monster
231 Zoot, the human
233 Kermit, the frog
234 Gonzo, the whatever
235 Couldn't find Janice.
236 @end smallexample
239 @node Hash Search Function
240 @section The @code{hsearch} function.
242 The functions mentioned so far in this chapter are searching in a sorted
243 or unsorted array.  There are other methods to organize information
244 which later should be searched.  The costs of insert, delete and search
245 differ.  One possible implementation is using hashing tables.
247 @comment search.h
248 @comment SVID
249 @deftypefun int hcreate (size_t @var{nel})
250 The @code{hcreate} function creates a hashing table which can contain at
251 least @var{nel} elements.  There is no possibility to grow this table so
252 it is necessary to choose the value for @var{nel} wisely.  The used
253 methods to implement this function might make it necessary to make the
254 number of elements in the hashing table larger than the expected maximal
255 number of elements.  Hashing tables usually work inefficient if they are
256 filled 80% or more.  The constant access time guaranteed by hashing can
257 only be achieved if few collisions exist.  See Knuth's ``The Art of
258 Computer Programming, Part 3: Searching and Sorting'' for more
259 information.
261 The weakest aspect of this function is that there can be at most one
262 hashing table used through the whole program.  The table is allocated
263 in local memory out of control of the programmer.  As an extension the
264 GNU C library provides an additional set of functions with an reentrant
265 interface which provide a similar interface but which allow to keep
266 arbitrary many hashing tables.
268 It is possible to use more than one hashing table in the program run if
269 the former table is first destroyed by a call to @code{hdestroy}.
271 The function returns a non-zero value if successful.  If it return zero
272 something went wrong.  This could either mean there is already a hashing
273 table in use or the program runs out of memory.
274 @end deftypefun
276 @comment search.h
277 @comment SVID
278 @deftypefun void hdestroy (void)
279 The @code{hdestroy} function can be used to free all the resources
280 allocated in a previous call of @code{hcreate}.  After a call to this
281 function it is again possible to call @code{hcreate} and allocate a new
282 table with possibly different size.
284 It is important to remember that the elements contained in the hashing
285 table at the time @code{hdestroy} is called are @emph{not} freed by this
286 function.  It is the responsibility of the program code to free those
287 strings (if necessary at all).  Freeing all the element memory is not
288 possible without extra, separately kept information since there is no
289 function to iterate through all available elements in the hashing table.
290 If it is really necessary to free a table and all elements the
291 programmer has to keep a list of all table elements and before calling
292 @code{hdestroy} s/he has to free all element's data using this list.
293 This is a very unpleasant mechanism and it also shows that this kind of
294 hashing tables is mainly meant for tables which are created once and
295 used until the end of the program run.
296 @end deftypefun
298 Entries of the hashing table and keys for the search are defined using
299 this type:
301 @deftp {Data type} {struct ENTRY}
302 Both elements of this structure are pointers to zero-terminated strings.
303 This is a limiting restriction of the functionality of the
304 @code{hsearch} functions.  They can only be used for data sets which use
305 the NUL character always and solely to terminate the records.  It is not
306 possible to handle general binary data.
308 @table @code
309 @item char *key
310 Pointer to a zero-terminated string of characters describing the key for
311 the search or the element in the hashing table.
312 @item char *data
313 Pointer to a zero-terminated string of characters describing the data.
314 If the functions will be called only for searching an existing entry
315 this element might stay undefined since it is not used.
316 @end table
317 @end deftp
319 @comment search.h
320 @comment SVID
321 @deftypefun {ENTRY *} hsearch (ENTRY @var{item}, ACTION @var{action})
322 To search in a hashing table created using @code{hcreate} the
323 @code{hsearch} function must be used.  This function can perform simple
324 search for an element (if @var{action} has the @code{FIND}) or it can
325 alternatively insert the key element into the hashing table, possibly
326 replacing a previous value (if @var{action} is @code{ENTER}).
328 The key is denoted by a pointer to an object of type @code{ENTRY}.  For
329 locating the corresponding position in the hashing table only the
330 @code{key} element of the structure is used.
332 The return value depends on the @var{action} parameter value.  If it is
333 @code{FIND} the value is a pointer to the matching element in the
334 hashing table or @code{NULL} if no matching element exists.  If
335 @var{action} is @code{ENTER} the return value is only @code{NULL} if the
336 programs runs out of memory while adding the new element to the table.
337 Otherwise the return value is a pointer to the element in the hashing
338 table which contains newly added element based on the data in @var{key}.
339 @end deftypefun
341 As mentioned before the hashing table used by the functions described so
342 far is global and there can be at any time at most one hashing table in
343 the program.  A solution is to use the following functions which are a
344 GNU extension.  All have in common that they operate on a hashing table
345 which is described by the content of an object of the type @code{struct
346 hsearch_data}.  This type should be treated as opaque, none of its
347 members should be changed directly.
349 @comment search.h
350 @comment GNU
351 @deftypefun int hcreate_r (size_t @var{nel}, struct hsearch_data *@var{htab})
352 The @code{hcreate_r} function initializes the object pointed to by
353 @var{htab} to contain a hashing table with at least @var{nel} elements.
354 So this function is equivalent to the @code{hcreate} function except
355 that the initialized data structure is controlled by the user.
357 This allows to have more than once hashing table at one time.  The
358 memory necessary for the @code{struct hsearch_data} object can be
359 allocated dynamically.
361 The return value is non-zero if the operation were successful.  if the
362 return value is zero something went wrong which probably means the
363 programs runs out of memory.
364 @end deftypefun
366 @comment search.h
367 @comment GNU
368 @deftypefun void hdestroy_r (struct hsearch_data *@var{htab})
369 The @code{hdestroy_r} function frees all resources allocated by the
370 @code{hcreate_r} function for this very same object @var{htab}.  As for
371 @code{hdestroy} it is the programs responsibility to free the strings
372 for the elements of the table.
373 @end deftypefun
375 @comment search.h
376 @comment GNU
377 @deftypefun int hsearch_r (ENTRY @var{item}, ACTION @var{action}, ENTRY **@var{retval}, struct hsearch_data *@var{htab})
378 The @code{hsearch_r} function is equivalent to @code{hsearch}.  The
379 meaning of the first two arguments is identical.  But instead of
380 operating on a single global hashing table the function works on the
381 table described by the object pointed to by @var{htab} (which is
382 initialized by a call to @code{hcreate_r}).
384 Another difference to @code{hcreate} is that the pointer to the found
385 entry in the table is not the return value of the functions.  It is
386 returned by storing it in a pointer variables pointed to by the
387 @var{retval} parameter.  The return value of the function is an integer
388 value indicating success if it is non-zero and failure if it is zero.
389 In the later case the global variable @var{errno} signals the reason for
390 the failure.
392 @table @code
393 @item ENOMEM
394 The table is filled and @code{hsearch_r} was called with an so far
395 unknown key and @var{action} set to @code{ENTER}.
396 @item ESRCH
397 The @var{action} parameter is @code{FIND} and no corresponding element
398 is found in the table.
399 @end table
400 @end deftypefun
403 @node Tree Search Function
404 @section The @code{tsearch} function.
406 Another common form to organize data for efficient search is to use
407 trees.  The @code{tsearch} function family provides a nice interface to
408 functions to organize possibly large amounts of data by providing a mean
409 access time proportional to the logarithm of the number of elements.
410 The GNU C library implementation even guarantees that this bound is
411 never exceeded even for input data which cause problems for simple
412 binary tree implementations.
414 The functions described in the chapter are all described in the @w{System
415 V} and X/Open specifications and are therefore quite portable.
417 In contrast to the @code{hsearch} functions the @code{tsearch} functions
418 can be used with arbitrary data and not only zero-terminated strings.
420 The @code{tsearch} functions have the advantage that no function to
421 initialize data structures is necessary.  A simple pointer of type
422 @code{void *} initialized to @code{NULL} is a valid tree and can be
423 extended or searched.
425 @comment search.h
426 @comment SVID
427 @deftypefun {void *} tsearch (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar})
428 The @code{tsearch} function searches in the tree pointed to by
429 @code{*@var{rootp}} for an element matching @var{key}.  The function
430 pointed to by @var{compar} is used to determine whether two elements
431 match.  @xref{Comparison Functions} for a specification of the functions
432 which can be used for the @var{compar} parameter.
434 If the tree does not contain a matching entry the @var{key} value will
435 be added to the tree.  @code{tsearch} does not make a copy of the object
436 pointed to by @var{key} (how could it since the size is unknown).
437 Instead it adds a reference to this object which means the object must
438 be available as long as the tree data structure is used.
440 The tree is represented by a pointer to a pointer since it is sometimes
441 necessary to change the root node of the tree.  So it must not be
442 assumed that the variable pointed to by @var{rootp} has the same value
443 after the call.  This also shows that it is not safe to call the
444 @code{tsearch} function more than once at the same time using the same
445 tree.  It is no problem to run it more than once at a time on different
446 trees.
448 The return value is a pointer to the matching element in the tree.  If a
449 new element was created the pointer points to the new data (which is in
450 fact @var{key}).  If an entry had to be created and the program ran out
451 of space @code{NULL} is returned.
452 @end deftypefun
454 @comment search.h
455 @comment SVID
456 @deftypefun {void *} tfind (const void *@var{key}, void *const *@var{rootp}, comparison_fn_t @var{compar})
457 The @code{tfind} function is similar to the @code{tsearch} function.  It
458 locates an element matching the one pointed to by @var{key} and returns
459 a pointer to this element.  But if no matching element is available no
460 new element is entered (note that the @var{rootp} parameter points to a
461 constant pointer).  Instead the function returns @code{NULL}.
462 @end deftypefun
464 Another advantage of the @code{tsearch} function in contrast to the
465 @code{hsearch} functions is that there is an easy way to remove
466 elements.
468 @comment search.h
469 @comment SVID
470 @deftypefun {void *} tdelete (const void *@var{key}, void **@var{rootp}, comparison_fn_t @var{compar})
471 To remove a specific element matching @var{key} from the tree
472 @code{tdelete} can be used.  It locates the matching element using the
473 same method as @code{tfind}.  The corresponding element is then removed
474 and the data if this tree node is returned by the function.  If there is
475 no matching entry in the tree nothing can be deleted and the function
476 returns @code{NULL}.
477 @end deftypefun
479 @comment search.h
480 @comment GNU
481 @deftypefun void tdestroy (void *@var{vroot}, __free_fn_t @var{freefct})
482 If the complete search tree has to be removed one can use
483 @code{tdestroy}.  It frees all resources allocated by the @code{tsearch}
484 function to generate the tree pointed to by @var{vroot}.
486 For the data in each tree node the function @var{freefct} is called.
487 The pointer to the data is passed as the argument to the function.  If
488 no such work is necessary @var{freefct} must point to a function doing
489 nothing.  It is called in any case.
491 This function is a GNU extension and not covered by the @w{System V} or
492 X/Open specifications.
493 @end deftypefun
495 In addition to the function to create and destroy the tree data
496 structure there is another function which allows to apply a function on
497 all elements of the tree.  The function must have this type:
499 @smallexample
500 int __action_fn_t (const void *nodep, VISIT value, int level);
501 @end smallexample
503 The @var{nodep} is the data value of the current node (nce given as the
504 @var{key} argument to @code{tsearch}).  @var{level} is a numeric value
505 which corresponds to the depth of the current node in the tree.  The
506 root node has the depth @math{0} and its children have a depth of
507 @math{1} and so on.  The @code{VISIT} type is an enumeration type.
509 @deftp {Data Type} VISIT
510 The @code{VISIT} value indicates the status of the current node in the
511 tree and how the function is called.  The status of a node is either
512 `leaf' or `internal node'.  For each leaf node the function is called
513 exactly once, for each internal node it is called three times: before
514 the first child is processed, after the first child is processed and
515 after both children are processed.  This makes it possible to handle all
516 three methods of tree traversal (or even a combination of them).
518 @table @code
519 @item preorder
520 The current node is an internal node and the function is called before
521 the first child was processed.
522 @item endorder
523 The current node is an internal node and the function is called after
524 the first child was processed.
525 @item postorder
526 The current node is an internal node and the function is called after
527 the second child was processed.
528 @item leaf
529 The current node is a leaf.
530 @end table
531 @end deftp
533 @comment search.h
534 @comment SVID
535 @deftypefun void twalk (const void *@var{root}, __action_fn_t @var{action})
536 For each node in the tree with a node pointed to by @var{root} the
537 @code{twalk} function calls the function provided by the parameter
538 @var{action}.  For leaf nodes the function is called exactly once with
539 @var{value} set to @code{leaf}.  For internal nodes the function is
540 called three times, setting the @var{value} parameter or @var{action} to
541 the appropriate value.  The @var{level} argument for the @var{action}
542 function is computed while descending the tree with increasing the value
543 by one for the descend to a child, starting with the value @math{0} for
544 the root node.
546 Since the functions used for the @var{action} parameter to @code{twalk}
547 must not modify the tree data it is safe to run @code{twalk} is more
548 than one thread at the same time working on the same tree.  It is also
549 safe to call @code{tfind} in parallel.  Functions which modify the tree
550 must not be used.  Otherwise the behaviour is undefined.
551 @end deftypefun