factor/extra/benchmark/binary-trees/binary-trees.factor

56 lines
1.3 KiB
Factor
Raw Normal View History

2008-04-20 06:15:46 -04:00
USING: kernel math accessors prettyprint io locals sequences
2008-04-26 12:03:41 -04:00
math.ranges math.order ;
2008-04-20 06:15:46 -04:00
IN: benchmark.binary-trees
TUPLE: tree-node item left right ;
C: <tree-node> tree-node
: bottom-up-tree ( item depth -- tree )
dup 0 > [
1 -
[ drop ]
[ >r 2 * 1 - r> bottom-up-tree ]
[ >r 2 * r> bottom-up-tree ] 2tri
] [
drop f f
] if <tree-node> ;
GENERIC: item-check ( node -- n )
M: tree-node item-check
[ item>> ] [ left>> ] [ right>> ] tri [ item-check ] bi@ - + ;
M: f item-check drop 0 ;
: min-depth 4 ; inline
: stretch-tree ( max-depth -- )
1 + 0 over bottom-up-tree item-check
[ "stretch tree of depth " write pprint ]
[ "\t check: " write . ] bi* ;
2008-04-20 06:15:46 -04:00
:: long-lived-tree ( max-depth -- )
0 max-depth bottom-up-tree
min-depth max-depth 2 <range> [| depth |
max-depth depth - min-depth + 2^ [
[1,b] 0 [
dup neg
[ depth bottom-up-tree item-check + ] bi@
2008-04-20 06:15:46 -04:00
] reduce
]
[ 2 * ] bi
pprint "\t trees of depth " write depth pprint
"\t check: " write .
] each
"long lived tree of depth " write max-depth pprint
"\t check: " write item-check . ;
: binary-trees ( n -- )
min-depth 2 + max [ stretch-tree ] [ long-lived-tree ] bi ;
: binary-trees-main ( -- )
16 binary-trees ;