static void randomForest(void) { int i, b, k; for (i = 0; i < FOREST_ITERS; i++) { int treeno; struct tree *t; if (i % FOREST_GC == 0) { stoGc(); stoAudit(); } /* Select a random tree for replacement */ treeno = rand() % FOREST_SIZE; /* Either make a new leaf, or construct a new root */ /* One in 4 times make a leaf. */ if ((rand() & 0x30) == 0) { /* LEAF: One in 8 times make a big one */ long r = rand(); int fz = r % TREE_FUZZ; int sz = 120 + fz; if ((r & 0x70) == 0) sz *= 100; treeCheck(forest[treeno], treeNo); /* treeFree(forest[treeno]); */ forest[treeno] = leafNewEmpty(rand() % sz); } else { /* ROOT: Fill with subtrees */ t = treeNewEmpty(rand() % TREE_MAX_WIDTH); /* treeFree(forest[treeno]); */ treeCheck(forest[treeno], treeNo); forest[treeno] = 0; for (b = 0; b < t->argc; b++) { k = rand() % FOREST_SIZE; treeSetElt(t, b, forest[k]); } forest[treeno] = t; } } stoGc(); stoAudit(); stoShow(); }
static void treeCheck(tree_sTable *tp, tree_sNode *np, int *count, int *maxlevel, int *hight, int level, char *(*printKey)(tree_sNode *)) { int comp; int hleft; int hright; if (np == tp->null) { *hight = 0; return; } if (level > *maxlevel) *maxlevel = level; treeCheck(tp, np->left, count, maxlevel, &hleft, level+1, printKey); if (np->left != tp->null) { if (np->left->parent != np) { printf("leftLinkerror: Node key: %s not linked to parent key: %s\n", printKey(np->left), printKey(np)); } comp = tp->compareFunc(tp, np, np->left); if (comp < 1) { printf("leftLink sort error: Node key: %s not less than key: %s\n", printKey(np->left), printKey(np)); } } (*count)++; treeCheck(tp, np->right, count, maxlevel, &hright, level+1, printKey); if (np->right != tp->null) { if (np->right->parent != np) { printf("rightLinkerror: Node key: %s not linked to parent key: %s\n", printKey(np->right), printKey(np)); } comp = tp->compareFunc(tp, np, np->right); if (comp > -1) { printf("rightLink sort error: Node key: %s not greater than key: %s\n", printKey(np->right), printKey(np)); } } if ((hright - hleft) != np->bal) { printf("balerror key: %s, level: %d, hr: %d, hl: %d, bal: %d\n", printKey(np), level, hright, hleft, np->bal); } *hight = (hright > hleft ? hright : hleft) + 1; }
void testStore2(void) { int i; long bO, bF, grossBytes; bO = stoBytesAlloc - stoBytesFree - stoBytesGc; printforest = 1; grossBytes = 0; forest = (struct tree **)stoAlloc(int0, FOREST_SIZE*sizeof(struct tree *)); for (i = 0; i < FOREST_SIZE; i++) forest[i] = 0; randomForest(); for (i = 0; i < FOREST_SIZE; i++) { long sz = treeSize(forest[i]); printf("%d: %ld bytes\n", i, sz); grossBytes += sz; if (printforest) treePrint(osStdout, forest[i]); } for (i = 0; i < FOREST_SIZE; i++) { treeCheck(forest[i], treeNo); treeFree(forest[i]); } bF = stoBytesAlloc - stoBytesFree - stoBytesGc; printf("Memory: %lu (owned) %lu (alloc) %ld (net) %ld (gross)\n", stoBytesOwn, bF - bO, treeBytes, grossBytes); stoFree(forest); }
void tree_PrintTable(pwr_tStatus *sts, tree_sTable *tp, void (*printNode)(tree_sNode *), char *(*printKey)(tree_sNode *)) { int count = 0; int maxlevel = 0; int hight = 0; #if 1 treePrintInorder(tp, tp->root, printNode); #endif treeCheck(tp, tp->root, &count, &maxlevel, &hight, 0, printKey); printf("count: %d, maxlevel: %d, hight: %d\n", count, maxlevel, hight); printf("nNode.......: %d\n", tp->nNode); printf("nError......: %d\n", tp->nError); printf("nHZ.........: %d\n", tp->nHZ); printf("nHN.........: %d\n", tp->nHN); printf("nHP.........: %d\n", tp->nHP); printf("maxDepth....: %d\n", tp->maxDepth); printf("nLL.........: %d\n", tp->nLL); printf("nLR.........: %d\n", tp->nLR); printf("nRL.........: %d\n", tp->nRL); printf("nRR.........: %d\n", tp->nRR); printf("nMalloc.....: %d\n", tp->nMalloc); printf("nAlloc......: %d\n", tp->nAlloc); printf("nFree.......: %d\n", tp->nFree); printf("nInsert.....: %d\n", tp->nInsert); printf("nDelete.....: %d\n", tp->nDelete); printf("nSearch.....: %d\n", tp->nSearch); }
static void treeCheck(struct tree *t, int treeno) { if (!t) return; assert(t->treeno <= treeno); if (!t->isLeaf) { int i; for (i = 0; i < t->argc; i++) treeCheck(t->u.argv[i], t->treeno); } }