Hi,
I'm currently struggleing with trees built from arrays of arrays and their
performance. During tree traversal php spends a frightening amount of time in
there, which (I guess) is due to the way the tree is constructed.
What I have is an unbalanced binary tree, the inner nodes of which are
encoded as Array( [0] -> left subtree, [1] -> right subtree )
and a string as a leaf.
Where I need to go is encoded as a binary string, consisting of the letters
"0" and "1". My tree-traversal algorithm looks like this:
$bit_array = str_split( $bitstring );
$tree_climber = $tree; // assign tree-climber to the tree root
// main loop
while( !is_null( $bit = array_shift( $bit_array ) ) ) {
$tree_climber = $tree_climber[$bit]; // going down...
if( !is_array( $tree_climber ) ) { // we reached a node
process( $tree_climber );
$tree_climber = $tree; // and back up to the root we go
}
}
I'm seeing execution times in excess of 30 seconds for a few hundred (~ 200 -
300 ) tree-runs (with the tree in question being of average depth 5,
translating to 1000 - 1500 assignments, which is way to slow to be practical.
And the main holdup _is_ the tree-traversal, the sum of the process()
functions is in the range of 0.3 seconds (measured with microtime(true) ).
Is there any way to speed this up? I've already tried constructing a
lookup-table from the tree, and going through the bitstring along the lines of
// Pseudocode
while( not_done ) {
for( $i = 1; $i < $max_tree_path; ++$i ) {
$examined = substr( $bitstring, 0, $i ); // lets look at the first $i bits
if( is_set( $lut[$examined ] ) ) {
$result = $lut[$examined];
$bitstring = substr( $bitstring, $i );
break;
}
}
but this actually fares worse in terms of runtime.
I'm using php 5.0.
Regs,
Sven
--
---------------------Trigital-
Sven Riedel
. Tel: +49 511 1236364
. Fax: +49 511 1690746
. email: [EMAIL PROTECTED]
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php