Учитывая набор, я хочу отобразить все его подмножества (его мощность). Я нашел этот код:Набор питания заданного набора
void printPowerSet(char *set, int set_size)
{
/*set_size of power set of a set with set_size
n is (2**n -1)*/
unsigned int pow_set_size = pow(2, set_size);
int counter, j;
/*Run from counter 000..0 to 111..1*/
for(counter = 0; counter < pow_set_size; counter++)
{
for(j = 0; j < set_size; j++)
{
if(counter & (1<<j))
printf("%c", set[j]);
}
printf("\n");
}
}
Я не могу понять, почему эта часть используется
if(counter & (1<<j))
чем ее смысл?
Сложность времени для этого алгоритма O(n2^n)
есть ли какой-нибудь лучший метод?
Это означает, что если 'counter', bitwise имеет бит nbr. 'j' установлен в 1, затем ... –
Размер вывода O (n * 2^n), поэтому не может быть асимптотически более быстрый метод. – interjay