Показать полную графическую версию : Формирование подмножеств на с++
Добрый день!
Перед сдачей экзамена возникла такая задача:
Дан массив произвольных элементов(Пусть для определенности массив типа int)
Нужно выделить из массива все подмассивы(исключая нулевой) всех размеров.
Предполагается использование union, в котором будет записано целове число и массив.
Каким-то образом изменяя целое число, будем изменять в нем биты так, чтобы получились все подмножества.
Получившиеся подмассивы вывести на экран.
Заранее спасибо, очень надеюсь на Вашу помощь.
Предполагается использование 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 и понимание программы. Сэкономленной памятью тоже можно пожертвовать в сторону понимания.
Идею понял, спасибо.
Но мне не совсем понятно, как реализовать union.
Точнее понятен принцип, но нет полного понимания :)
Когда мы увеличиваем цисло B на еденицу, в двоичном предствалении тоже добавится только еденица?
Мне без разницы, какое будет число B? Вначале я должен задать не его, а заполнить массив нулями?
Цикл выполнять до тех пор, пока количество true-битов не станет равным размеру массива A?
Заранее спасибо!
Но мне не совсем понятно, как реализовать 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.