-----------------------------------
tree.lib.php -- readme
-----------------------------------
A Tree library for PHP 4 / PHP 5
This package arose from the need for a simple, memory
efficient and upwards compatible tree module.
It provides
- n-ary trees
- efficient traversal, using pseudo-pointers "up",
"down" and "right"
- storage facility for arbitrary data within the nodes
Two shortcomings of PHP are addressed by this package:
- memory hogging: both arrays and objects reserve huge
chunks of memory for each element or instance. For
example, a simple array holding 64K characters takes
4 MB of RAM. Nested arrays reserve multiples of this
- The OOP model and implementation of references changed
significantly between PHP4 and PHP5, making it
difficult or impossible to write portable code using
object references
The present package uses fixed-length tables implemented
with the string datatype. Instead of references, it
implements pseudo-pointers, using integer indexes into
these tables. Think C.
The storage capacity is limited by the constant
TREE_POINTLEN (default: 2 bytes). The highest number
that can be stored in the pointer (actually, -1) is the
maximum total number of nodes the tree can hold,
including deleted nodes. The depth of the tree and the
number of branches is not limited, although depth values
will not be reported correctly for values taking more than
8*TREE_POINTLEN-4 bits (the missing four bits are used for
a checksum). Thus, with the default pointer size, the tree
depth is effectively limited to 2^12 == 4096.
The upper limit to TREE_POINTLEN is constituted by PHP's
maxint (4 bytes).
A disadvantage: No garbage collection implemented; our
pseudo-memory (stored in the strings) grows with each "add"
operation, but does not free unused space after "delete"
operations. (Can be retrofitted by changing the "newnode"
logic to use previously freed space instead of claiming new)
Ignore this problem if you use the tree mainly to store and
retrieve data, and if you don't reorganize the tree
extensively (many prune and graft operations)
A comparison with Richard Heyes' object-oriented Tree-Class
1.0.3. shows, how and where this approach is more
efficient, while not sacrificing speed:
tree.lib.php Tree-1.0.3.php
------------ --------------
insert 4096 CPU: 0.577s CPU: 0.186s
nodes in bintree MEM: 0.3M MEM: 3.5M
get flat list CPU: 0.099s CPU: 0.064s
from this tree MEM: 243K MEM: 206K
remove this tree's CPU: 0.125s CPU: 0.001s
root node MEM: 3456B MEM: 16B
-----------------------------------
Page: PHP/tree.lib.readme.htm
mtime: Sat Nov 11 18:17:51 CET 2006