int m16_mine (FIM16 *fim) { /* --- find frequent item sets */ int r, i; /* error status, buffers */ SUPP s; /* support of current prefix */ BITTA m; /* mask after item filtering, bit */ assert(fim); /* check the function argument */ if (fim->ttw <= 0) return 0; /* if the machine is empty, abort */ s = isr_supp(fim->report); /* get min. support for perfect exts. */ m = fim->tor; /* and bitwise or of all transactions */ if (fim->wgts[m] >= s) { /* if there is only one transaction, */ fim->wgts[m] = 0; /* remove it from the 16 items mach. */ for (i = 0; (unsigned int)(1 << i) <= (unsigned int)m; i++) if (m & (1 << i)) /* all items are perfect extensions */ isr_addpex(fim->report, fim->map[i]); i = hibit[m]; fim->ends[i] = fim->btas[i]; fim->ttw = 0; fim->tor = 0; /* clear 16 items machine */ return 0; /* and abort the function */ } count(fim, i = hibit[m]+1); /* count the support of all items */ m = filter(fim, i, s); /* remove infreq. and perf. exts. */ r = (fim->dir > 0) /* find freq. item sets recursively */ ? rec_pos(fim, i, m) : rec_neg(fim, i, m); fim->ttw = 0; fim->tor = 0; /* clear the total transaction weight */ return (r) ? r : m; /* return error status or mask */ } /* m16_mine() */
void main() { int size=0; order_node *pre,*in; pre=(order_node*)malloc(sizeof(order_node)); in=(order_node*)malloc(sizeof(order_node)); tree_node *root; printf("Enter data in pre order(-999 to end)\n"); create_order(pre); printf("Enter data in in-order(-999 to end)\n"); create_order(in); size = get_size(in); root=create_tree(in,pre,size); printf("\nData in tree in preorder rec\n"); rec_pre(root); printf("\nData in tree in inorder rec\n"); rec_in(root); printf("\nData in tree in posorder rec\n"); rec_pos(root); printf("\nData in tree in preorder nrec\n"); nrec_pre(root); printf("\nData in tree in inorder nrec\n"); nrec_in(root); printf("\nData in tree in posorder nrec\n"); nrec_pos(root); printf("\n\nPress Enter to exit..."); getch(); }
static int rec_pos (FIM16 *fim, int n, BITTA mask) { /* --- find frequent item sets */ int i, r; /* loop variable, error status */ SUPP s; /* item support */ BITTA m; /* filtering mask */ assert(fim && (n >= 0)); /* check the function arguments */ /* The item mask needs to be checked, because items 0,1,2 may have */ /* been identified as perfect extensions in higher recursion levels.*/ if ((mask & 1) /* if item 0 is frequent */ && (fim->supps[0] >= fim->smin)) { r = isr_add(fim->report, fim->map[0], fim->supps[0]); if (r < 0) return -1; /* add item 0 to the reporter */ if (r > 0) { /* if item 0 needs processing */ if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report,1);/* remove the item 0 again */ } /* from the item set reporter */ } if ((mask & 2) /* if item 1 is frequent */ && (fim->supps[1] >= fim->smin)) { r = isr_add(fim->report, fim->map[1], fim->supps[1]); if (r < 0) return -1; /* add item 1 to the reporter */ if (r > 0) { /* if item 1 needs processing, */ if ((mask & 1) /* if item 0 is frequent given 1 */ && (fim->wgts[3] >= fim->smin)) { if (fim->wgts[3] >= fim->supps[1]) isr_addpex(fim->report, fim->map[0]); else { /* check for a perfect extension */ r = isr_add(fim->report, fim->map[0], fim->wgts[3]); if (r < 0) return -1; /* add item 0 to the reporter */ if (r > 0) { /* if item 0 needs processing */ if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report, 1); } /* remove the item 0 again */ } /* from the item set reporter */ } if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report,1);/* remove the item 1 again */ } /* from the item set reporter */ } if (n <= 2) { /* if only two items to process */ memset(fim->wgts+1, 0, 3*sizeof(SUPP)); memset(fim->supps, 0, 2*sizeof(SUPP)); memcpy(fim->ends, fim->btas, 2*sizeof(BITTA*)); return 0; /* clear counters for items 0 and 1 */ } /* and clear the transaction lists */ if ((mask & 4) /* if item 2 is frequent */ && (fim->supps[2] >= fim->smin)) { r = isr_add(fim->report, fim->map[2], fim->supps[2]); if (r < 0) return -1; /* add item 2 to the reporter */ if (r > 0) { /* if item 2 needs processing, */ m = 0; /* project/count for items 0 and 1 */ fim->wgts[3] = fim->wgts[7]; fim->wgts[2] = fim->wgts[6]; fim->wgts[1] = fim->wgts[5]; fim->supps[0] = s = fim->wgts[3] +fim->wgts[1]; if (s >= fim->supps[2]) isr_addpex(fim->report, fim->map[0]); else if (s >= fim->smin) m = (BITTA)(m | (mask & 1)); fim->supps[1] = s = fim->wgts[3] +fim->wgts[2]; if (s >= fim->supps[2]) isr_addpex(fim->report, fim->map[1]); else if (s >= fim->smin) m = (BITTA)(m | (mask & 2)); r = rec_pos(fim, 2, m); /* perfect extension items and then */ if (r < 0) return -1; /* find freq. item sets recursively */ if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report,1);/* remove the item 2 again */ } /* from the item set reporter */ } if (n <= 3) { /* if only two items to process */ memset(fim->wgts+1, 0, 7*sizeof(SUPP)); /* clear weights, */ memset(fim->supps, 0, 3*sizeof(SUPP)); /* support and lists */ memcpy(fim->ends, fim->btas, 3*sizeof(BITTA*)); return 0; /* clear counters for items 0, 1, 2 */ } /* and clear the transaction lists */ if ((mask & 8) /* if item 3 is frequent */ && (fim->supps[3] >= fim->smin)) { r = isr_add(fim->report, fim->map[3], fim->supps[3]); if (r < 0) return -1; /* add item 3 to the reporter */ if (r > 0) { /* if item 3 needs processing, */ m = 0; /* project/count for items 0 and 1 */ fim->wgts[4] = fim->wgts[12]; fim->wgts[3] = fim->wgts[11] +(fim->wgts[7] = fim->wgts[15]); fim->wgts[2] = fim->wgts[10] +(fim->wgts[6] = fim->wgts[14]); fim->wgts[1] = fim->wgts[ 9] +(fim->wgts[5] = fim->wgts[13]); fim->supps[0] = s = fim->wgts[3] +fim->wgts[1]; if (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[0]); else if (s >= fim->smin) m = (BITTA)(m | (mask & 1)); fim->supps[1] = s = fim->wgts[3] +fim->wgts[2]; if (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[1]); else if (s >= fim->smin) m = (BITTA)(m | (mask & 2)); fim->supps[2] = s = fim->wgts[7] +fim->wgts[6] + fim->wgts[5] +fim->wgts[4]; if (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[2]); else if (s >= fim->smin) m = (BITTA)(m | (mask & 4)); r = rec_pos(fim, 3, m); /* perfect extension items and then */ if (r < 0) return -1; /* find freq. item sets recursively */ if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report,1);/* remove the item 3 again */ } /* from the item set reporter */ } memset(fim->wgts+1, 0, 15*sizeof(SUPP)); /* clear weights, */ memset(fim->supps, 0, 4*sizeof(SUPP)); /* support and lists */ memcpy(fim->ends, fim->btas, 4*sizeof(BITTA*)); for (i = 4; i < n; i++) { /* traverse the (remaining) items */ s = fim->supps[i]; /* get the support of the item and */ if (s < fim->smin) continue;/* skip infrequent/eliminated items */ r = isr_add(fim->report, fim->map[i], s); if (r < 0) return -1; /* add item i to the reporter */ if (r <= 0) { /* check if item i needs processing, */ clear(fim, i); continue;} /* otherwise delete its transactions */ assert(mask & (1 << i)); /* item must not be excluded */ if (fim->ends[i]-fim->btas[i] <= 1){ /* if only one transaction, */ fim->ends[i] = fim->btas[i]; /* add all items as perfect exts. */ fim->wgts[m = *fim->btas[i]] = 0; for (r = 0; (unsigned int)(1 << r) <= (unsigned int)m; r++) if (m & (1 << r)) isr_addpex(fim->report, fim->map[r]); } else { /* if more than one transaction */ project(fim,i,mask, fim); /* project database to item i */ count(fim, i); /* count the support of all items */ m = filter (fim, i, s); /* remove infrequent items and */ r = rec_pos(fim, i, m); /* perfect extension items and then */ if (r < 0) return -1; /* find freq. item sets recursively */ } /* and check for a recursion error */ if (isr_report(fim->report) < 0) return -1; /* report the current item set */ isr_remove(fim->report, 1); /* remove the item i again */ } /* from the item set reporter */ return 0; /* return 'ok' */ } /* rec_pos() */