]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - share/man/man3/tree.3
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / share / man / man3 / tree.3
1 .\"     $OpenBSD: tree.3,v 1.7 2002/06/12 01:09:20 provos Exp $
2 .\"
3 .\" Copyright 2002 Niels Provos <provos@citi.umich.edu>
4 .\" All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\"    notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\" 3. All advertising materials mentioning features or use of this software
15 .\"    must display the following acknowledgement:
16 .\"      This product includes software developed by Niels Provos.
17 .\" 4. The name of the author may not be used to endorse or promote products
18 .\"    derived from this software without specific prior written permission.
19 .\"
20 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 .\"
31 .\" $FreeBSD$
32 .\"
33 .Dd December 27, 2007
34 .Dt TREE 3
35 .Os
36 .Sh NAME
37 .Nm SPLAY_PROTOTYPE ,
38 .Nm SPLAY_GENERATE ,
39 .Nm SPLAY_ENTRY ,
40 .Nm SPLAY_HEAD ,
41 .Nm SPLAY_INITIALIZER ,
42 .Nm SPLAY_ROOT ,
43 .Nm SPLAY_EMPTY ,
44 .Nm SPLAY_NEXT ,
45 .Nm SPLAY_MIN ,
46 .Nm SPLAY_MAX ,
47 .Nm SPLAY_FIND ,
48 .Nm SPLAY_LEFT ,
49 .Nm SPLAY_RIGHT ,
50 .Nm SPLAY_FOREACH ,
51 .Nm SPLAY_INIT ,
52 .Nm SPLAY_INSERT ,
53 .Nm SPLAY_REMOVE ,
54 .Nm RB_PROTOTYPE ,
55 .Nm RB_PROTOTYPE_STATIC ,
56 .Nm RB_GENERATE ,
57 .Nm RB_GENERATE_STATIC ,
58 .Nm RB_ENTRY ,
59 .Nm RB_HEAD ,
60 .Nm RB_INITIALIZER ,
61 .Nm RB_ROOT ,
62 .Nm RB_EMPTY ,
63 .Nm RB_NEXT ,
64 .Nm RB_PREV ,
65 .Nm RB_MIN ,
66 .Nm RB_MAX ,
67 .Nm RB_FIND ,
68 .Nm RB_NFIND ,
69 .Nm RB_LEFT ,
70 .Nm RB_RIGHT ,
71 .Nm RB_PARENT ,
72 .Nm RB_FOREACH ,
73 .Nm RB_FOREACH_REVERSE ,
74 .Nm RB_INIT ,
75 .Nm RB_INSERT ,
76 .Nm RB_REMOVE
77 .Nd "implementations of splay and red-black trees"
78 .Sh SYNOPSIS
79 .In sys/tree.h
80 .Fn SPLAY_PROTOTYPE NAME TYPE FIELD CMP
81 .Fn SPLAY_GENERATE NAME TYPE FIELD CMP
82 .Fn SPLAY_ENTRY TYPE
83 .Fn SPLAY_HEAD HEADNAME TYPE
84 .Ft "struct TYPE *"
85 .Fn SPLAY_INITIALIZER "SPLAY_HEAD *head"
86 .Fn SPLAY_ROOT "SPLAY_HEAD *head"
87 .Ft bool
88 .Fn SPLAY_EMPTY "SPLAY_HEAD *head"
89 .Ft "struct TYPE *"
90 .Fn SPLAY_NEXT NAME "SPLAY_HEAD *head" "struct TYPE *elm"
91 .Ft "struct TYPE *"
92 .Fn SPLAY_MIN NAME "SPLAY_HEAD *head"
93 .Ft "struct TYPE *"
94 .Fn SPLAY_MAX NAME "SPLAY_HEAD *head"
95 .Ft "struct TYPE *"
96 .Fn SPLAY_FIND NAME "SPLAY_HEAD *head" "struct TYPE *elm"
97 .Ft "struct TYPE *"
98 .Fn SPLAY_LEFT "struct TYPE *elm" "SPLAY_ENTRY NAME"
99 .Ft "struct TYPE *"
100 .Fn SPLAY_RIGHT "struct TYPE *elm" "SPLAY_ENTRY NAME"
101 .Fn SPLAY_FOREACH VARNAME NAME "SPLAY_HEAD *head"
102 .Ft void
103 .Fn SPLAY_INIT "SPLAY_HEAD *head"
104 .Ft "struct TYPE *"
105 .Fn SPLAY_INSERT NAME "SPLAY_HEAD *head" "struct TYPE *elm"
106 .Ft "struct TYPE *"
107 .Fn SPLAY_REMOVE NAME "SPLAY_HEAD *head" "struct TYPE *elm"
108 .Fn RB_PROTOTYPE NAME TYPE FIELD CMP
109 .Fn RB_PROTOTYPE_STATIC NAME TYPE FIELD CMP
110 .Fn RB_GENERATE NAME TYPE FIELD CMP
111 .Fn RB_GENERATE_STATIC NAME TYPE FIELD CMP
112 .Fn RB_ENTRY TYPE
113 .Fn RB_HEAD HEADNAME TYPE
114 .Fn RB_INITIALIZER "RB_HEAD *head"
115 .Ft "struct TYPE *"
116 .Fn RB_ROOT "RB_HEAD *head"
117 .Ft "bool"
118 .Fn RB_EMPTY "RB_HEAD *head"
119 .Ft "struct TYPE *"
120 .Fn RB_NEXT NAME "RB_HEAD *head" "struct TYPE *elm"
121 .Ft "struct TYPE *"
122 .Fn RB_PREV NAME "RB_HEAD *head" "struct TYPE *elm"
123 .Ft "struct TYPE *"
124 .Fn RB_MIN NAME "RB_HEAD *head"
125 .Ft "struct TYPE *"
126 .Fn RB_MAX NAME "RB_HEAD *head"
127 .Ft "struct TYPE *"
128 .Fn RB_FIND NAME "RB_HEAD *head" "struct TYPE *elm"
129 .Ft "struct TYPE *"
130 .Fn RB_NFIND NAME "RB_HEAD *head" "struct TYPE *elm"
131 .Ft "struct TYPE *"
132 .Fn RB_LEFT "struct TYPE *elm" "RB_ENTRY NAME"
133 .Ft "struct TYPE *"
134 .Fn RB_RIGHT "struct TYPE *elm" "RB_ENTRY NAME"
135 .Ft "struct TYPE *"
136 .Fn RB_PARENT "struct TYPE *elm" "RB_ENTRY NAME"
137 .Fn RB_FOREACH VARNAME NAME "RB_HEAD *head"
138 .Fn RB_FOREACH_REVERSE VARNAME NAME "RB_HEAD *head"
139 .Ft void
140 .Fn RB_INIT "RB_HEAD *head"
141 .Ft "struct TYPE *"
142 .Fn RB_INSERT NAME "RB_HEAD *head" "struct TYPE *elm"
143 .Ft "struct TYPE *"
144 .Fn RB_REMOVE NAME "RB_HEAD *head" "struct TYPE *elm"
145 .Sh DESCRIPTION
146 These macros define data structures for different types of trees:
147 splay trees and red-black trees.
148 .Pp
149 In the macro definitions,
150 .Fa TYPE
151 is the name tag of a user defined structure that must contain a field of type
152 .Vt SPLAY_ENTRY ,
153 or
154 .Vt RB_ENTRY ,
155 named
156 .Fa ENTRYNAME .
157 The argument
158 .Fa HEADNAME
159 is the name tag of a user defined structure that must be declared
160 using the macros
161 .Fn SPLAY_HEAD ,
162 or
163 .Fn RB_HEAD .
164 The argument
165 .Fa NAME
166 has to be a unique name prefix for every tree that is defined.
167 .Pp
168 The function prototypes are declared with
169 .Fn SPLAY_PROTOTYPE ,
170 .Fn RB_PROTOTYPE ,
171 or
172 .Fn RB_PROTOTYPE_STATIC .
173 The function bodies are generated with
174 .Fn SPLAY_GENERATE ,
175 .Fn RB_GENERATE ,
176 or
177 .Fn RB_GENERATE_STATIC .
178 See the examples below for further explanation of how these macros are used.
179 .Sh SPLAY TREES
180 A splay tree is a self-organizing data structure.
181 Every operation on the tree causes a splay to happen.
182 The splay moves the requested
183 node to the root of the tree and partly rebalances it.
184 .Pp
185 This has the benefit that request locality causes faster lookups as
186 the requested nodes move to the top of the tree.
187 On the other hand, every lookup causes memory writes.
188 .Pp
189 The Balance Theorem bounds the total access time for
190 .Ar m
191 operations and
192 .Ar n
193 inserts on an initially empty tree as
194 .Fn O "\*[lp]m + n\*[rp]lg n" .
195 The
196 amortized cost for a sequence of
197 .Ar m
198 accesses to a splay tree is
199 .Fn O "lg n" .
200 .Pp
201 A splay tree is headed by a structure defined by the
202 .Fn SPLAY_HEAD
203 macro.
204 A
205 structure is declared as follows:
206 .Bd -ragged -offset indent
207 .Fn SPLAY_HEAD HEADNAME TYPE
208 .Va head ;
209 .Ed
210 .Pp
211 where
212 .Fa HEADNAME
213 is the name of the structure to be defined, and struct
214 .Fa TYPE
215 is the type of the elements to be inserted into the tree.
216 .Pp
217 The
218 .Fn SPLAY_ENTRY
219 macro declares a structure that allows elements to be connected in the tree.
220 .Pp
221 In order to use the functions that manipulate the tree structure,
222 their prototypes need to be declared with the
223 .Fn SPLAY_PROTOTYPE
224 macro,
225 where
226 .Fa NAME
227 is a unique identifier for this particular tree.
228 The
229 .Fa TYPE
230 argument is the type of the structure that is being managed
231 by the tree.
232 The
233 .Fa FIELD
234 argument is the name of the element defined by
235 .Fn SPLAY_ENTRY .
236 .Pp
237 The function bodies are generated with the
238 .Fn SPLAY_GENERATE
239 macro.
240 It takes the same arguments as the
241 .Fn SPLAY_PROTOTYPE
242 macro, but should be used only once.
243 .Pp
244 Finally,
245 the
246 .Fa CMP
247 argument is the name of a function used to compare tree nodes
248 with each other.
249 The function takes two arguments of type
250 .Vt "struct TYPE *" .
251 If the first argument is smaller than the second, the function returns a
252 value smaller than zero.
253 If they are equal, the function returns zero.
254 Otherwise, it should return a value greater than zero.
255 The compare
256 function defines the order of the tree elements.
257 .Pp
258 The
259 .Fn SPLAY_INIT
260 macro initializes the tree referenced by
261 .Fa head .
262 .Pp
263 The splay tree can also be initialized statically by using the
264 .Fn SPLAY_INITIALIZER
265 macro like this:
266 .Bd -ragged -offset indent
267 .Fn SPLAY_HEAD HEADNAME TYPE
268 .Va head
269 =
270 .Fn SPLAY_INITIALIZER &head ;
271 .Ed
272 .Pp
273 The
274 .Fn SPLAY_INSERT
275 macro inserts the new element
276 .Fa elm
277 into the tree.
278 .Pp
279 The
280 .Fn SPLAY_REMOVE
281 macro removes the element
282 .Fa elm
283 from the tree pointed by
284 .Fa head .
285 .Pp
286 The
287 .Fn SPLAY_FIND
288 macro can be used to find a particular element in the tree.
289 .Bd -literal -offset indent
290 struct TYPE find, *res;
291 find.key = 30;
292 res = SPLAY_FIND(NAME, head, &find);
293 .Ed
294 .Pp
295 The
296 .Fn SPLAY_ROOT ,
297 .Fn SPLAY_MIN ,
298 .Fn SPLAY_MAX ,
299 and
300 .Fn SPLAY_NEXT
301 macros can be used to traverse the tree:
302 .Bd -literal -offset indent
303 for (np = SPLAY_MIN(NAME, &head); np != NULL; np = SPLAY_NEXT(NAME, &head, np))
304 .Ed
305 .Pp
306 Or, for simplicity, one can use the
307 .Fn SPLAY_FOREACH
308 macro:
309 .Bd -ragged -offset indent
310 .Fn SPLAY_FOREACH np NAME head
311 .Ed
312 .Pp
313 The
314 .Fn SPLAY_EMPTY
315 macro should be used to check whether a splay tree is empty.
316 .Sh RED-BLACK TREES
317 A red-black tree is a binary search tree with the node color as an
318 extra attribute.
319 It fulfills a set of conditions:
320 .Bl -enum -offset indent
321 .It
322 Every search path from the root to a leaf consists of the same number of
323 black nodes.
324 .It
325 Each red node (except for the root) has a black parent.
326 .It
327 Each leaf node is black.
328 .El
329 .Pp
330 Every operation on a red-black tree is bounded as
331 .Fn O "lg n" .
332 The maximum height of a red-black tree is
333 .Fn 2lg "n + 1" .
334 .Pp
335 A red-black tree is headed by a structure defined by the
336 .Fn RB_HEAD
337 macro.
338 A
339 structure is declared as follows:
340 .Bd -ragged -offset indent
341 .Fn RB_HEAD HEADNAME TYPE
342 .Va head ;
343 .Ed
344 .Pp
345 where
346 .Fa HEADNAME
347 is the name of the structure to be defined, and struct
348 .Fa TYPE
349 is the type of the elements to be inserted into the tree.
350 .Pp
351 The
352 .Fn RB_ENTRY
353 macro declares a structure that allows elements to be connected in the tree.
354 .Pp
355 In order to use the functions that manipulate the tree structure,
356 their prototypes need to be declared with the
357 .Fn RB_PROTOTYPE
358 or
359 .Fn RB_PROTOTYPE_STATIC
360 macro,
361 where
362 .Fa NAME
363 is a unique identifier for this particular tree.
364 The
365 .Fa TYPE
366 argument is the type of the structure that is being managed
367 by the tree.
368 The
369 .Fa FIELD
370 argument is the name of the element defined by
371 .Fn RB_ENTRY .
372 .Pp
373 The function bodies are generated with the
374 .Fn RB_GENERATE
375 or
376 .Fn RB_GENERATE_STATIC
377 macro.
378 These macros take the same arguments as the
379 .Fn RB_PROTOTYPE
380 and
381 .Fn RB_PROTOTYPE_STATIC
382 macros, but should be used only once.
383 .Pp
384 Finally,
385 the
386 .Fa CMP
387 argument is the name of a function used to compare tree nodes
388 with each other.
389 The function takes two arguments of type
390 .Vt "struct TYPE *" .
391 If the first argument is smaller than the second, the function returns a
392 value smaller than zero.
393 If they are equal, the function returns zero.
394 Otherwise, it should return a value greater than zero.
395 The compare
396 function defines the order of the tree elements.
397 .Pp
398 The
399 .Fn RB_INIT
400 macro initializes the tree referenced by
401 .Fa head .
402 .Pp
403 The red-black tree can also be initialized statically by using the
404 .Fn RB_INITIALIZER
405 macro like this:
406 .Bd -ragged -offset indent
407 .Fn RB_HEAD HEADNAME TYPE
408 .Va head
409 =
410 .Fn RB_INITIALIZER &head ;
411 .Ed
412 .Pp
413 The
414 .Fn RB_INSERT
415 macro inserts the new element
416 .Fa elm
417 into the tree.
418 .Pp
419 The
420 .Fn RB_REMOVE
421 macro removes the element
422 .Fa elm
423 from the tree pointed by
424 .Fa head .
425 .Pp
426 The
427 .Fn RB_FIND
428 and
429 .Fn RB_NFIND
430 macros can be used to find a particular element in the tree.
431 .Bd -literal -offset indent
432 struct TYPE find, *res;
433 find.key = 30;
434 res = RB_FIND(NAME, head, &find);
435 .Ed
436 .Pp
437 The
438 .Fn RB_ROOT ,
439 .Fn RB_MIN ,
440 .Fn RB_MAX ,
441 .Fn RB_NEXT ,
442 and
443 .Fn RB_PREV
444 macros can be used to traverse the tree:
445 .Pp
446 .Dl "for (np = RB_MIN(NAME, &head); np != NULL; np = RB_NEXT(NAME, &head, np))"
447 .Pp
448 Or, for simplicity, one can use the
449 .Fn RB_FOREACH
450 or
451 .Fn RB_FOREACH_REVERSE
452 macro:
453 .Bd -ragged -offset indent
454 .Fn RB_FOREACH np NAME head
455 .Ed
456 .Pp
457 The
458 .Fn RB_EMPTY
459 macro should be used to check whether a red-black tree is empty.
460 .Sh NOTES
461 Trying to free a tree in the following way is a common error:
462 .Bd -literal -offset indent
463 SPLAY_FOREACH(var, NAME, head) {
464         SPLAY_REMOVE(NAME, head, var);
465         free(var);
466 }
467 free(head);
468 .Ed
469 .Pp
470 Since
471 .Va var
472 is freed, the
473 .Fn FOREACH
474 macro refers to a pointer that may have been reallocated already.
475 Proper code needs a second variable.
476 .Bd -literal -offset indent
477 for (var = SPLAY_MIN(NAME, head); var != NULL; var = nxt) {
478         nxt = SPLAY_NEXT(NAME, head, var);
479         SPLAY_REMOVE(NAME, head, var);
480         free(var);
481 }
482 .Ed
483 .Pp
484 Both
485 .Fn RB_INSERT
486 and
487 .Fn SPLAY_INSERT
488 return
489 .Dv NULL
490 if the element was inserted in the tree successfully, otherwise they
491 return a pointer to the element with the colliding key.
492 .Pp
493 Accordingly,
494 .Fn RB_REMOVE
495 and
496 .Fn SPLAY_REMOVE
497 return the pointer to the removed element otherwise they return
498 .Dv NULL
499 to indicate an error.
500 .Sh SEE ALSO
501 .Xr queue 3
502 .Sh AUTHORS
503 The author of the tree macros is
504 .An Niels Provos .