int main(int argc, char **argv) { int nuniv; int nelem; int ncombo, *elems, cnum, i; Combinations vp; if (argc != 3) { printf("usage: %s nuniv nelem\n", argv[0]); return 1; } nuniv = atoi(argv[1]); nelem = atoi(argv[2]); vp = init_combinations(nuniv, nelem); if (vp == NULL) { printf("init_combinations failed\n"); return 1; } ncombo = num_combinations(vp); elems = (int *) malloc(nelem * sizeof(int)); for (cnum=0; cnum<ncombo; cnum++) { get_combination(vp, cnum, elems); for (i=0; i<nelem; i++) printf("%d ", elems[i] + 1); printf("\n"); } free_combinations(vp); return 0; }
/* * statext_ndistinct_build * Compute ndistinct coefficient for the combination of attributes. * * This computes the ndistinct estimate using the same estimator used * in analyze.c and then computes the coefficient. */ MVNDistinct * statext_ndistinct_build(double totalrows, int numrows, HeapTuple *rows, Bitmapset *attrs, VacAttrStats **stats) { MVNDistinct *result; int k; int itemcnt; int numattrs = bms_num_members(attrs); int numcombs = num_combinations(numattrs); result = palloc(offsetof(MVNDistinct, items) + numcombs * sizeof(MVNDistinctItem)); result->magic = STATS_NDISTINCT_MAGIC; result->type = STATS_NDISTINCT_TYPE_BASIC; result->nitems = numcombs; itemcnt = 0; for (k = 2; k <= numattrs; k++) { int *combination; CombinationGenerator *generator; /* generate combinations of K out of N elements */ generator = generator_init(numattrs, k); while ((combination = generator_next(generator))) { MVNDistinctItem *item = &result->items[itemcnt]; int j; item->attrs = NULL; for (j = 0; j < k; j++) item->attrs = bms_add_member(item->attrs, stats[combination[j]]->attr->attnum); item->ndistinct = ndistinct_for_combination(totalrows, numrows, rows, stats, k, combination); itemcnt++; Assert(itemcnt <= result->nitems); } generator_free(generator); } /* must consume exactly the whole output array */ Assert(itemcnt == result->nitems); return result; }