長さ N のビットセットがあります (約 500 ~ 700 になります)。1 のみを含むすべてのサブセットの数を取得する必要があります
例
N = 32
セット = 0* 11 *0* 111 *00* 1 *0* 1 *00* 1111 *0* 11 *00* 111 *000* 1 *0* 1 *
出力 = { [1] = 4、[2] = 2、[3] = 2、[4] = 1、[5] = 0、... [32] = 0 }
void get_count(int tab[], int len) {
int *out = calloc(1, sizeof(*out) * INT_BIT * len);
int i, j, k;
int cur;
int count = 0;
for(i = 0; i < len; i++) {
cur = tab[i];
for(j = 0; j < INT_BIT; j++) {
count += (cur & 1);
if(!(cur & 1)) {
out[count]++;
count = 0;
}
cur >>= 1;
}
}
for(i = 0; i < INT_BIT * len; i++) {
printf("%d ", out[i]);
}
printf("\n");
free(out);
}
この単純な操作は、約数十億回実行されます。すべてのビットを繰り返すのは遅すぎます。このアルゴリズムを最適化する方法は?