~ubuntu-branches/ubuntu/trusty/libbsd/trusty

« back to all changes in this revision

Viewing changes to man/tree.3

  • Committer: Package Import Robot
  • Author(s): Guillem Jover
  • Date: 2012-05-29 08:11:13 UTC
  • mfrom: (1.2.6)
  • Revision ID: package-import@ubuntu.com-20120529081113-ymoqb4ohrvldiuoj
Tags: 0.4.0-1
* New upstream release. (Closes: #668705)
  - Autoconfiscated, supports cross-building natively. (Closes: #665997)
  - Provide endian encoding/decoding inline functions. (Closes: #635377)
  - Provide expand_number(). (Closes: #635379)
  - Ship <nlist.h> under /usr/include/bsd/. (Closes: #634955, #657772)
  - Ship <libutil.h> under /usr/include/bsd/. (Closes: #640895)
  - Fix header protections when using the overlay. (Closes: #630907)
  - Fix .so symlinks to be relative even when the .so.N shared library
    is on a different directory. (Closes: #580372)
  - Remove all deprecated headers and inclusions.
* Avoid leaving the system w/o an <nlist.h> previously owned by either
  libelfg0-dev or libelf-dev when upgrading from old libsd-dev versions
  which used to Replace them, by restoring <nlist.h> from <bsd/nlist.h>.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 bsd/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 .