----------------------------------- 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