PDA

Показать полную графическую версию : Формирование подмножеств на с++


Remisto
22-06-2010, 22:04
Добрый день!

Перед сдачей экзамена возникла такая задача:
Дан массив произвольных элементов(Пусть для определенности массив типа int)
Нужно выделить из массива все подмассивы(исключая нулевой) всех размеров.

Предполагается использование union, в котором будет записано целове число и массив.
Каким-то образом изменяя целое число, будем изменять в нем биты так, чтобы получились все подмножества.

Получившиеся подмассивы вывести на экран.

Заранее спасибо, очень надеюсь на Вашу помощь.

pva
22-06-2010, 23:02
Предполагается использование union, в котором будет записано целове число и массив.
Каким-то образом изменяя целое число, будем изменять в нем биты так, чтобы получились все подмножества. »
вот не понял идеи про юнион. Про увеличение целого понял. Но что делать, если массив из 65 элементов?

Предлагаю усовершенствовать так: пусть есть начальный массив A. Задать массив из булевских переменных B такого же размера как A, который отражает наши биты.
1) реализовать операцию ++B (увеличение на единицу числа, представленного "битами" B)
2) реализовать операцию unsigned sparse_array(A,B,C), которая заполняет массив C так: если бит B[i] установлен, значит надо в C добавить A[i].
3) вывести C на экран
4) скакать циклом в шаг 1 пока все биты B не установятся в true.

Можно упаковать биты B в байты (по 8 штук), но это упростит одну операцию ++ ничего не упростит, а усложнит sparse_array и понимание программы. Сэкономленной памятью тоже можно пожертвовать в сторону понимания.

Remisto
23-06-2010, 12:11
Идею понял, спасибо.

Но мне не совсем понятно, как реализовать union.
Точнее понятен принцип, но нет полного понимания :)

Когда мы увеличиваем цисло B на еденицу, в двоичном предствалении тоже добавится только еденица?

Мне без разницы, какое будет число B? Вначале я должен задать не его, а заполнить массив нулями?

Цикл выполнять до тех пор, пока количество true-битов не станет равным размеру массива A?

Заранее спасибо!

pva
24-06-2010, 22:51
Но мне не совсем понятно, как реализовать union.»
зачем? предлагаю не делать union
Когда мы увеличиваем цисло B на еденицу, в двоичном предствалении тоже добавится только еденица? »
работаем как бы с двоичным числом. Например {false,false,true,false} - это аналог 2 (0b00....00000010)
Мне без разницы, какое будет число B? Вначале я должен задать не его, а заполнить массив нулями? »
нужно перебрать все их. В начале понятней выбрать нули {false,false,false,...} (0b00000000...00)
Цикл выполнять до тех пор, пока количество true-битов не станет равным размеру массива A? »
ну да, другими словами все биты станут {true,true,true...} (0b11111111...11)




© OSzone.net 2001-2012