Version 0 of binary-trees benchmark

Updated 2008-06-04 14:23:27 by SL

Discipline of Computer Language Benchmarks Game.


#!/usr/bin/tclsh
##
## The Computer Lannguage Shootout
## http://shootout.alioth.debian.org/ 
## Contributed by Heiner Marxen
##
## "binary-trees"	for Tcl
## Call:	tclsh binarytrees.tcl 16
##
## $Id: binarytrees-tcl.code,v 1.21 2007-11-17 01:27:15 igouy-guest Exp $

## A tree node is implemented as a list with 3 elements:
##	0 left  subtree
##	1 right subtree
##	2 item
## An empty tree is an empty list {}, an thus has llength 0.

proc ItemCheck {tree} {
    if {![llength [lindex $tree 0]} {
	return lindex $tree 2
    } else {
	return expr {             [lindex $tree 2
		      + [ItemCheck [lindex $tree 0]
		      - ItemCheck [lindex $tree 1]}
    }
}

proc BottomUpTree {item depth} {
    if {$depth > 0} {
	set ndepth expr {$depth - 1}
	return list [BottomUpTree [expr {2 * $item - 1} $ndepth] \
		     BottomUpTree [expr {2 * $item    } $ndepth] \
		     $item
	       ]
    } else {
	return list {} {} $item
    }
}

proc tellTree {typ depth check} {
    puts "$typ tree of depth $depth\t check: $check"
}

proc main {argv} {
    set N lindex $argv 0

    set minDepth 4

    if {($minDepth + 2) > $N} {
	set maxDepth expr {$minDepth + 2}
    } else {
	set maxDepth $N
    }

    set stretchDepth expr {$maxDepth + 1}

    set stretchTree BottomUpTree 0 $stretchDepth
    tellTree "stretch" $stretchDepth ItemCheck $stretchTree
    set stretchTree {}

    set longLivedTree BottomUpTree 0 $maxDepth

    for {set dep $minDepth} {$dep <= $maxDepth} {incr dep 2} {
	set iterations expr {1 << ($maxDepth - $dep + $minDepth)}
	set check 0
	for {set i 1} {$i <= $iterations} {incr i} {
	    set tempTree BottomUpTree $i $dep
	    set check expr {$check + [ItemCheck $tempTree}]
	    set tempTree {}

	    set tempTree BottomUpTree [expr {-$i} $dep]
	    set check expr {$check + [ItemCheck $tempTree}]
	    set tempTree {}
	}

	puts "expr {$iterations * 2}\t trees of depth $dep\t check: $check"
    }

    tellTree "long lived" $maxDepth ItemCheck $longLivedTree

    return 0
}

main $argv

Category Performance