CS 3343/3341 Analysis of Algorithms Spring 2012 |
Random Binary Search Trees
Depth of Nodes |
Random Binary Search Trees, Depth of Nodes | |
---|---|
/* treed.c: tree of random doubles Create a binary search tree of random doubles. Then record the depth of all nodes, and the depth of leaf nodes. */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define TABSIZE 70 // size of tables #define SAMPLESIZE 10000000 // RNGs struct tnode { double d; // data, random double int depth; // depth of this node struct tnode *left; struct tnode *right; }; void addtree(struct tnode *, double ); struct tnode *newnode(double ); void treeprint(struct tnode *, int); struct tnode *talloc(void); void tabulate(struct tnode *, int [], int []); double ran(void); double seed = 11111.0; // for ran, RNG main(){ struct tnode *root; int leaves[TABSIZE]; // depth of leaves int all[TABSIZE]; // depth of all nodes double x; int i; root = NULL; for (i = 0; i < SAMPLESIZE; i++) { x = ran(); if (root == NULL) root = newnode(x); else addtree(root, x); } treeprint(root, 0); // not printing printf("\n"); for (i = 0; i < TABSIZE; i++) { leaves[i] = 0; all[i] = 0; } tabulate(root, leaves, all); printf (" i leaves all\n"); for (i = 0; i < TABSIZE; i++) { printf("%7i%8i\n", leaves[i], all[i]); } return 0; } | /* addtree: add a node, non-recursive */ void addtree(struct tnode *p, double x){ for (;;) { if ((p -> d) == x) return;// ignore else if ((p -> d) > x) { //go left if ((p -> left) == NULL) { p -> left = newnode(x); return; } else p = p -> left; } else if ((p -> d) < x) { //go right if ((p -> right) == NULL) { p -> right = newnode(x); return; } else p = p -> right; } } } /* newnode: fix up a new node */ struct tnode *newnode(double x){ struct tnode *p = talloc(); p -> d = x; p -> left = p -> right = NULL; p -> depth = 0; return p; } /* treeprint: rec. inorder trav. of tree. Record depths */ void treeprint(struct tnode *p, int dep){ if (p != NULL) { treeprint(p -> left, dep + 1); p -> depth = dep; treeprint(p -> right, dep + 1); } } /* tabulate: rec. inorder tabulation */ void tabulate(struct tnode *p, int leaves[], int all[]){ if (p != NULL) { tabulate(p -> left, leaves, all); // here we are at a node all[p -> depth]++; if (p -> left == NULL && p -> right == NULL) leaves[p -> depth]++; tabulate(p -> right, leaves, all); } } /* talloc: make a tnode */ struct tnode *talloc(void){ return (struct tnode *) malloc(sizeof(struct tnode)); } /* the random num generator */ double ran(){ double a = 16807.0, m = 2147483647.0; double q; seed = a*seed; q = floor(seed/m); seed = seed - q*m; return(seed/m); } |
Count of depths of nodes, in each case (leaf nodes, all nodes) | |||||||
---|---|---|---|---|---|---|---|
Depth | 100 | 1000 | 10000 | 100000 = 105 | 1000000 = 106 | 10000000 = 107 | Depth |
0 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 |
0 1 0 2 0 4 3 8 1 6 0 7 1 12 3 16 10 20 8 14 5 7 1 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
0 1 0 2 0 4 0 8 1 15 2 26 14 40 12 41 9 49 15 75 23 96 33 110 34 119 56 130 44 102 36 73 21 51 21 38 16 18 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
0 1 0 2 0 4 0 8 0 16 1 31 3 59 13 99 26 154 41 215 56 296 71 396 110 526 154 677 223 847 286 962 327 1009 384 1003 338 887 341 776 252 616 229 504 173 371 138 256 87 150 43 76 30 41 6 11 3 5 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
0 1 0 2 0 4 0 8 0 16 0 32 0 64 4 124 17 225 37 392 74 635 140 972 222 1426 358 2050 542 2817 819 3751 1066 4800 1408 6028 1973 7288 2458 8148 2718 8665 3101 8847 3114 8424 2976 7754 2720 6808 2463 5743 1950 4542 1687 3578 1222 2519 826 1697 598 1142 403 692 196 365 114 207 65 116 40 65 21 32 9 13 3 4 0 1 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
0 1 0 2 0 4 0 8 0 16 0 32 0 64 1 127 4 248 13 472 33 875 109 1583 270 2705 513 4321 938 6674 1580 9925 2499 14247 3751 19771 5231 26601 7686 35048 10498 44387 13644 53967 17356 63365 20788 71015 24053 76425 26063 78837 27155 78128 27313 74589 25965 68518 24158 60906 21658 52008 18171 42537 15031 33681 11762 25414 8696 18407 6451 12996 4428 8654 2977 5547 1765 3302 1092 1972 648 1154 355 660 215 378 121 206 70 106 21 43 14 27 7 17 5 13 8 11 2 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
0 1 0 2 0 4 0 8 0 16 0 32 0 64 0 128 2 255 5 503 17 975 47 1859 141 3491 399 6342 828 11023 1912 18516 3568 29678 6320 45838 10611 68605 16836 99146 25399 139048 37470 189934 53220 251549 73133 323293 97809 402691 125393 484445 154177 562960 184931 633159 210745 685380 231826 717399 246097 725604 249815 709648 246265 673550 235378 619304 217136 550523 193010 473725 166292 394922 138594 318711 111360 248712 86550 188052 65101 138007 47637 98110 33625 67342 22956 44701 14916 28575 9441 17871 5878 10969 3649 6600 2095 3828 1222 2211 725 1260 381 674 221 374 106 190 61 103 27 49 17 26 8 11 2 3 1 1 0 0 0 0 |
0 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 |
Max Depth | 12 | 19 | 29 | 41 | 51 | 59 | Max Depth |