Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Формирование подмножеств на с++ (http://forum.oszone.net/showthread.php?t=178917)

Remisto 22-06-2010 22:04 1439703

Формирование подмножеств на с++
 
Добрый день!

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

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

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

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

pva 22-06-2010 23:02 1439739

Цитата:

Цитата Remisto
Предполагается использование 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 1440019

Идею понял, спасибо.

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

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

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

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

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

pva 24-06-2010 22:51 1441144

Цитата:

Цитата Remisto
Но мне не совсем понятно, как реализовать union.»

зачем? предлагаю не делать union
Цитата:

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

работаем как бы с двоичным числом. Например {false,false,true,false} - это аналог 2 (0b00....00000010)
Цитата:

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

нужно перебрать все их. В начале понятней выбрать нули {false,false,false,...} (0b00000000...00)
Цитата:

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

ну да, другими словами все биты станут {true,true,true...} (0b11111111...11)


Время: 16:49.

Время: 16:49.
© OSzone.net 2001-