12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- # -*- nim -*-
- import os, strutils
- type
- PNode = ref TNode
- TNode {.final, acyclic.} = object
- left, right: PNode
- item: int
- proc checkTree(node: PNode): int =
- result = node.item
- if node.left != nil:
- inc result, checkTree(node.left) - checkTree(node.right)
- proc makeTreeAux(item, depth: int): PNode =
- new(result)
- result.item = item
- if depth > 0:
- result.left = makeTreeAux(2 * item - 1, depth - 1)
- result.right = makeTreeAux(2 * item, depth - 1)
- proc makeTree(item, depth: int): PNode =
- #GC_disable()
- result = makeTreeAux(item, depth)
- #GC_enable()
- proc main =
- var n = parseInt(paramStr(1))
- const minDepth = 4
- var maxDepth = if minDepth+2 > n: minDepth+2 else: n
- var stretchDepth = maxDepth + 1
- echo("stretch tree of depth ", stretchDepth, "\t check: ", checkTree(
- makeTree(0, stretchDepth)))
- var longLivedTree = makeTree(0, maxDepth)
- var iterations = 1 shl maxDepth
- for depth in countup (minDepth, stretchDepth-1, 2):
- var check = 0
- for i in 1..iterations:
- check += checkTree(makeTree(i, depth)) + checkTree(makeTree(-i, depth))
- echo(iterations*2, "\t trees of depth ", depth, "\t check: ", check)
- iterations = iterations div 4
- echo("long lived tree of depth ", maxDepth, "\t check: ",
- longLivedTree.checkTree)
- echo GC_getstatistics()
- main()
|