File: tree1.d

package info (click to toggle)
ldc 1%3A0.14.0.dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 29,416 kB
  • ctags: 10,371
  • sloc: ansic: 101,656; cpp: 28,021; sh: 484; makefile: 324; asm: 274
file content (69 lines) | stat: -rw-r--r-- 1,892 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
 * Benchmark the GC on tree building.  Thanks to Bearophile.
 *
 * Copyright: Copyright David Simcha 2011 - 2011.
 * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
 * Authors:   David Simcha
 */

/*          Copyright David Simcha 2011 - 2011.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
import std.stdio, std.conv;

class TreeNode {
    private TreeNode left, right;
    private int item;

    this(int item) {
        this.item = item;
    }

    this(TreeNode left, TreeNode right, int item){
        this.left = left;
        this.right = right;
        this.item = item;
    }

    private static TreeNode bottomUpTree(int item, int depth) {
        if (depth > 0) {
            return new TreeNode(bottomUpTree(2 * item - 1, depth - 1),
                                bottomUpTree(2 * item, depth - 1),
                                item);
        } else {
            return new TreeNode(item);
        }
    }

    private int itemCheck() {
        if (left is null)
            return item;
        else
            return item + left.itemCheck() - right.itemCheck();
    }
}


void main(string[] args) {
    enum int minDepth = 4;
    enum n = 18;

    int maxDepth = (minDepth + 2 > n) ? minDepth + 2 : n;
    int stretchDepth = maxDepth + 1;

    int check = (TreeNode.bottomUpTree(0,stretchDepth)).itemCheck();

    TreeNode longLivedTree = TreeNode.bottomUpTree(0, maxDepth);

    for (int depth = minDepth; depth <= maxDepth; depth += 2) {
        int iterations = 1 << (maxDepth - depth + minDepth);
        check = 0;

        foreach (int i; 1 .. iterations+1) {
            check += (TreeNode.bottomUpTree(i, depth)).itemCheck();
            check += (TreeNode.bottomUpTree(-i, depth)).itemCheck();
        }
    }
}