Как найти все подмножества множеств
На простом примере напомним, что называется подмножеством, какие бывают подмножества (собственные и несобственные), формулу нахождения числа всех подмножеств, а также калькулятор, который выдает множество всех подмножеств.
Пример 1. Дано множество А = {а, с, р, о}. Выпишите все подмножества
данного множества.
Решение:
Собственные подмножества: {а} , {с} , {р} , {о} , {а, с} , {а, р} , {а, о}, {с, р} , {с, о } ∈, {р, о}, {а, с,р} , {а, с, о}, {с, р, о}.
Несобственные: {а, с, р, о}, Ø.
Всего: 16 подмножеств.
Пояснение. Множество A является подмножеством множества B если каждый элемент множества A содержится также в B.
• пустое множество ∅ является подмножеством любого множества, называется несобственным;
• любое множество является подмножеством самого себя, также называется несобственным;
• У любого n-элементного множества ровно 2n подмножеств.
Последнее утверждение является формулой для нахождения числа всех подмножеств без перечисления каждого.
Вывод формулы: Допустим у нас имеется множество из n-элементов. При составлении подмножеств первый элемент может принадлежать подмножеству или не принадлежать, т.е. первый элемент можем выбрать двумя способами, аналогично для всех остальных элементов (всего n-элементов), каждый можем выбрать двумя способами, и по правилу умножения получаем: 2∙2∙2∙ …∙2=2n
Для математиков сформулируем теорему и приведем строгое доказательство.
Теорема . Число подмножеств конечного множества, состоящего из n элементов, равно 2n .
Доказательство. Множество, состоящее из одного элемента a, имеет два (т.е. 21 ) подмножества: ∅ и {a}. Множество, состоящее из двух элементов a и b, имеет четыре (т.е. 22 ) подмножества: ∅, {a}, {b}, {a; b}.
Множество, состоящее из трех элементов a, b, c, имеет восемь (т.е. 23 ) подмножеств:
∅, {a}, {b}, {b; a}, {c}, {c; a},{c; b}, {c; b; a}.
Можно предположить, что добавление нового элемента удваивает число подмножеств.
Завершим доказательство применением метода математической индукции. Сущность этого метода в том, что если утверждение (свойство) справедливо для некоторого начального натурального числа n0 и если из предположения, что оно справедливо для произвольного натурального n = k ≥ n0 можно доказать его справедливость для числа k + 1, то это свойство справедливо для всех натуральных чисел.
1. Для n = 1 (база индукции) (и даже для n = 2, 3) теорема доказана.
2. Допустим, что теорема доказана для n = k, т.е. число подмножеств множества, состоящего из k элементов, равно 2k .
3. Докажем, что число подмножеств множества B, состоящего из n = k + 1 элемента равно 2k+1 .
Выбираем некоторый элемент b множества B. Рассмотрим множество A = B {b}. Оно содержит k элементов. Все подмножества множества A – это подмножества множества B, не содержащие элемент b и, по предположению, их 2k штук. Подмножеств множества B, содержащих элемент b, столько же, т.е. 2k
штук.
Следовательно, всех подмножеств множества B: 2k + 2k = 2 ⋅ 2k = 2k+1 штук.
Теорема доказана.
В примере 1 множество А = {а, с, р, о} состоит из четырех элементов, n=4, следовательно, число всех подмножеств равно 24=16.
Если вам необходимо выписать все подмножества, или составить программу для написания множества всех подмножеств, то имеется алгоритма для решения: представлять возможные комбинации в виде двоичных чисел. Поясним на примере.
Пример 2. Eсть множество {a b c}, в соответствие ставятся следующие числа:
000 = {0} (пустое множество)
001 = {c}
010 = {b}
011 = {b c}
100 = {a}
101 = {a c}
110 = {a b}
111 = {a b c}
Калькулятор множества всех подмножеств.
В калькуляторе уже набраны элементы множества А = {а, с, р, о}, достаточно нажать кнопку Submit. Если вам необходимо решение своей задачи, то набираем элементы множества на латинице, через запятую, как показано в примере.
Нахождение числа всех подмножеств данного множества
Если
задано некоторое множество А,
то можно рассматривать новое множество
М (А) –
множество всех его подмножеств.
Пример
1.
Сколько
подмножеств имеет множество А={}?
По
свойствам отношения включения, имеем
ÆА
и А.
Таким
образом, одноэлементное множество А={}
имеет
2 подмножества.
Пример
2.
Сколько всего подмножеств имеет
двухэлементное множество А={а,
в}?
По
свойствам отношения включения, имеем
ÆА
и А.
Одноэлементные
подмножества: {а},
{в}.
Таким
образом, двухэлементное множество А={а,
в}
всего
имеет 4 подмножества.
Пример
3.
Сколько всего подмножеств имеет
трехэлементное множество А
=
{,
○, ◊}?
По
свойствам отношения включения, имеем
ÆА
и А.
Одноэлементные
подмножества: {},
{○},
{◊}.
Двухэлементные
подмножества: {,
○},
{,
◊},
{○,
◊}.
Таким
образом, трехэлементное множество А
=
{,
○, ◊}
всего имеет 8 подмножеств.
Пример
4.
Сколько всего подмножеств имеет
четырехэлементное множество А
=
{а,
в,
с, d}?
По
свойствам отношения включения, имеем
ÆА
и А.
Одноэлементные
подмножества: {а},
{в}, {с}, {d}.
Двухэлементные
подмножества: {а,
в}, {а, с}, {a,
d},
{в, с},
{в,
d},
{с, d}.
Трехэлементные
подмножества: {а,
в, с}, {a,
в, d},
{а, с, d},
{в, с,
d}.
Таким
образом, четырехэлементное множество
всего
имеет 16 подмножеств.
Нетрудно
заметить, что с увеличением количества
элементов множества А,
число всех его подмножеств значительно
увеличивается. Возникает
вопрос: сколько подмножеств имеет
множество из n
– элементов?
Ответ
на поставленный вопрос дает следующее
утверждение.
Теорема
5. Конечное
множество, содержащее n
элементов, имеет 2п
подмножеств, то есть если
Ап
= {а1,
а2,
… , aп
}, то
п(М(Ап))=2п.
Доказательство
проведем,
используя метод математической индукции.
1)
Путь п
=
1, то есть А1
= {
а1}.
Значит, М(А1)=
{Æ,
{
а1}}.
В
этом случае п(М(А1))
=
21
=
2 что и доказывает справедливость теоремы
при п
= 1.
2)
Пусть п
= к,
то
есть Aк
= {
а1,
а2,
…, aк
}.
Предположим,
что п(М(Aк))
=
2,
то есть множество Aк
имеет
2
подмножеств.
3)
Докажем, что тогда множество Aк+1,
имеет
2
подмножеств. В самом деле, если к элементам
множества Aк,
содержащего
к
элементов,
добавить еще один элемент aк+1,
то к имеющимся 2
подмножествам добавятся еще 2
новых подмножества, и, следовательно,
множество Aк+1,
содержащее
к
+
1 элементов, будет иметь 2
+ 2
=
2
2
= 2
подмножеств.
Таким
образом, п(М(Aк+1))
=
2.
На
основании метода математической индукции
можно сделать вывод, что Теорема. 5
справедлива для любого натурального
числа п.
Теорема
доказана.
Понятие факториала
Название «факториал»
происходит от слова «factor»
− «множитель». Термин «factorielle»
ввёл французский математик Луи Арбогаст
(1759–1803) в 1800 году.13
Факториал
– это функция,
определённая на множестве целых
неотрицательных чисел
,
значение которой равно произведению
целых неотрицательных чисел от 1 до
данного числаn,
то есть 1∙2∙3∙ …∙n;
Обозначают символом n!.
По определению 0!
= 1, 1! = 1.
Обозначение n!
впервые использовал французский
математик Христиан Крамп (1760 – 1826 гг.)
в 1808 году.
По
определению факториала имеем:
,.
Пример 1.
Вычислим:
Пример
2. Упростим
выражение:
Пример
3. Докажем
формулу
.
Воспользуемся
методом математической индукции.
-
При
п=1
имеем,
откуда 1=1, значит дляп=1
формула верна. -
Предположим,
что формула верна, для п=к,
то есть
. -
Докажем,
что формула верна, для п=к+1,
то есть
.
Действительно,
=,
что и требовалось доказать.
На
основании метода математической индукции
заключаем, что формула верна для любого
натурального числа п.
Пример
4. Найти сумму
Решение.
Заменим
каждое слагаемое разностью по формуле
.
Имеем,
=так как все слагаемые в левой части
равенства, за исключением второго и
предпоследнего взаимно уничтожаются.
Следовательно,
=
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
На диаграмме кругов Эйлера видно, что является подмножеством , а является надмножеством
В математике говорят, что множество есть подмно́жество множества , если все элементы первого множества являются и элементами второго множества.
Определение[править | править код]
Множество называется подмножеством множества , если все элементы, принадлежащие , также принадлежат [1]. Формальное определение:
Существует две системы символических обозначений для подмножеств:
« является подмножеством (нестрогим)» обозначается | « является строгим подмножеством » обозначается | Примечание |
---|---|---|
Символ является аналогом , то есть в случае допускается равенство множеств;
символ является аналогом , то есть в случае в есть элементы, которых нет в . |
||
Для понятия «(нестрогое) подмножество» используется более простой символ, так как оно считается более «фундаментальным». |
Обе системы обозначений предусмотрены стандартом ISO 31-11, но используют символ в разных смыслах, что может привести к путанице. В данной статье мы будем использовать последнюю систему обозначений.
Множество называется надмно́жеством множества , если является подмножеством множества .
То, что является надмножеством множества , записывают , то есть
Множество всех подмножеств множества обозначается .
Множества и называются равными , только когда они состоят из одних и тех же элементов, то есть и .[2]
Собственное и несобственное подмножество[править | править код]
Любое множество среди своих подмножеств содержит само себя и пустое множество. Само множество и пустое множество называют несобственными подмножествами, остальные подмножества называют собственными[3].
То есть, если мы хотим исключить само и пустое множество из рассмотрения, мы пользуемся понятием со́бственного подмножества, которое определяется так:
- множество является собственным подмножеством множества , только если и , .
Зарубежная литература[править | править код]
В зарубежной литературе несобственные подмножества в вышеуказанном смысле (само множество B и пустое множество) называют тривиальными, а собственные — нетривиальными, а термин «собственное подмножество» (proper subset) применяется в значении «строгое включение A в B» или «подмножество A, строго входящее в множество B, то есть такое, которому не принадлежит как минимум один элемент множества B», то есть здесь понятие «собственное подмножество» уже, наоборот, включает пустое множество.
В этом случае, если вдобавок нужно исключить из рассмотрения пустое множество, нужно использовать понятие нетривиа́льного подмножества, которое определяется так:
- множество является нетривиальным подмножеством множества , если является собственным подмножеством (proper subset) и .
Примеры[править | править код]
Свойства[править | править код]
Отношение подмножества обладает целым рядом свойств[4].
Подмножества конечных множеств[править | править код]
Если исходное множество конечно, то у него существует конечное количество подмножеств. А именно, у -элементного множества существует подмножеств (включая пустое). Чтобы убедиться в этом, достаточно заметить, что каждый элемент может либо входить, либо не входить в подмножество, а значит, общее количество подмножеств будет -кратным произведением двоек. Если же рассматривать только подмножества -элементного множества из элементов, то их количество выражается биномиальным коэффициентом . Для проверки этого факта можно выбирать элементы подмножества последовательно. Первый элемент можно выбрать способами, второй способом, и так далее, и, наконец, -й элемент можно выбрать способом. Таким образом мы получим последовательность из элементов, и ровно таким последовательностям соответствует одно подмножество. Значит, всего найдётся таких подмножеств.
Примечания[править | править код]
- ↑ Биркгоф, 1976, с. 10.
- ↑ Мельников О. В., Ремеслеников В. Н., Романьков В. А. Общая алгебра. Том 1. — М., Наука, 1990. — с. 11
- ↑ Подмножество. // Математический энциклопедический словарь. / ред. Ю. В. Прохоров. — М., Советская энциклопедия, 1988. — с. 465
- ↑ В. А. Ильин, В. А. Садовничий, Бл. Х. Сендов. Глава 2. Вещественные числа // Математический анализ / Под ред. А. Н. Тихонова. — 3-е изд., перераб. и доп. — М.: Проспект, 2006. — Т. 1. — С. 65. — 672 с. — ISBN 5-482-00445-7.
- ↑ Келли Дж. Общая топология = General topology — 1957 / пер. с англ. А.В. Архангельского. — 2-е изд. — М.: Наука, 1981. — С. 16. — 432 с.
Литература[править | править код]
- Верещагин Н. К., Шень А. Лекции по математической логике и теории алгоритмов. Часть 1. Начала теории множеств.. — 3-е изд., стереотип. — М.: МЦНМО, 2008. — 128 с. — ISBN 978-5-94057-321-0.
- Биркгоф Г., Барти Т. Современная прикладная алгебра. — М.: Мир, 1976. — 400 с.
Ссылки[править | править код]
- Weisstein, Eric W. Subset (англ.) на сайте Wolfram MathWorld.
Множество — это набор элементов, которые обладают общим свойством. В каждом неупорядоченном множестве существует определенное количество подмножеств, которые можно рассчитать при помощи онлайн-калькулятора.
Множество
Множество представляет собой набор элементов, сгруппированных по определенному признаку. В математике это может быть множество натуральных, целых или рациональных чисел. В природе это множества яблок на дереве, песчинок в пустыне или звезд в космосе. На практике множество может представлять собой набор данных, массивы результатов измерений или входных воздействий. Множество — это простейший математический объект, поэтому с ним можно осуществлять простые арифметические действия, то есть складывать, вычитать или разбивать на составляющие — подмножества.
Несобственные подмножества
Каждое множественный объект имеет два несобственных подмножества: само множество и пустое. Согласно канторовской теории, любое множество считается подмножеством самого себя. Пустое множество — это своеобразный нуль теории множеств, и такой набор не содержит ни одного элемента. Потребность в пустом множестве обусловлена аксиомой, что любой результат операции между множествами также должен быть множеством. Пустой набор элементов также считается подмножеством для любого набора чисел.
Собственные подмножества
Помимо самого себя и пустого множества, набор чисел может иметь определенное количество собственных подмножеств. Их численность определяется мощностью множества, то есть количеством его элементов. Для объекта A, которое состоит из n-ного числа элементов, существует количество собственных подмножеств, которое определяется по формуле:
N = 2n — 2.
Из этого следует, что для набора из 3 элементов существует 23 — 2 = 6 собственных подмножеств, из 4 членов — 24 — 2 = 14 собственных подмножеств и так далее. К примеру, для множества {X, Y, Z} существуют следующие подмножества:
- {X};
- {Y};
- {Z};
- {XY};
- {XZ};
- {ZY}.
Если не разделять подмножества на собственные и несобственные, то для каждого множества существует подмножества, количеством:
N = 2n,
где n — количество элементов.
Это означает, что для того же набора {X, Y, Z} добавятся также пустое множество и оно само.
Подмножества и парадоксы
Канторовская теория множеств зашла в тупик, когда ее постулаты породили парадоксы. Наиболее известной проблемой наивной теории множеств считается парадокс Рассела. Известный британский философ и ученый Бертран Рассел рассмотрел бесконечные множества как абстрактные объекты. Если любое множество считается подмножеством самого себя, то верно выражение A Î A. Допустим, существует глобальное множество S, содержащее в себе все наборы объектов, которые не включают самих себя.
Далее возникает вопрос, верно ли, что S Î S? Если верно, то выходит, что S не содержит самого себя, так как изначально набор S содержит все множества, не содержащие себя, следовательно, S Î S. Если неверно, значит, набор S не соответствует первичному определению, следовательно, S Î S.
Данный парадокс так же известен как проблема цирюльника. Некий брадобрей заявляет, что будет брить только тех, кто не бреет сам себя. Тех, кто сами справляются с бритвой, цирюльник брить отказывается. Возникает парадокс: кто побреет цирюльника? Если он бреется сам, то он не должен себя брить, а если не бреется, то брить себя обязан. Для решения подобных парадоксов в теорию множеств была внесен раздел о типах объектов. Согласно теории типов, подмножества всегда должны быть низшего порядка по отношению к своему надмножеству.
Наша программа позволяет сгенерировать все возможные подмножества для любого заданного набора чисел. Для этого вам достаточно ввести числа через запятую в форму онлайн-калькулятора, после чего программа рассчитает все подмножества для выбранного набора, включая собственные и несобственные. Рассмотрим пример генерации подмножеств.
Пример работы калькулятора
Допустим, у нас есть множество последовательных натуральных чисел мощностью 4. Это означает, что наш объект выглядит как А = {1, 2, 3, 4,}. Согласно формуле, для A существует 24 = 16 подмножества: 14 собственных и 2 несобственных. При помощи калькулятора рассчитаем эти составляющие. Мы получим:
- пустое множество — {};
- одноэлементные наборы — {1}, {2}, {3}, {4};
- двухэлементные — {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4};
- трехэлементные — {1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4};
- само множество — {1, 2, 3, 4}.
Точно также вы можете рассчитать количество подмножеств для множества произвольной мощности.
Заключение
Множество — это элементарный математический объект, с которым можно осуществлять разные арифметические операции. Используйте наши онлайн-калькуляторы для работы с множественными объектами.
Учитывая набор S
, сгенерировать все различные его подмножества, т. е. найти различные мощности множества S
. Силовой набор любого набора S
это множество всех подмножеств S
, включая пустое множество и S
сам.
Например, если S
установлен {x, y, x}
, то подмножества S
находятся:
- {} (also known as the empty set or the null set).
- {x}
- {y}
- {x}
- {x, y}
- {x, x}
- {y, x}
- {x, y, x}
Следовательно, различные подмножества в множестве мощностей S
находятся: { {}, {x}, {y}, {x, y}, {x, x}, {x, y, x} }
.
Потренируйтесь в этой проблеме
Подход 1: Использование рекурсии
Проблема очень похожа на 0/1 проблема с рюкзаком, где для каждого элемента множества S
, у нас есть два варианта:
- Рассмотрим этот элемент.
- Не принимайте во внимание этот элемент.
Следующее решение генерирует все комбинации подмножеств, используя приведенную выше логику. Чтобы распечатать только отдельные подмножества, сначала сортировать подмножество и исключить все соседние повторяющиеся элементы из подмножества вместе с текущим элементом в случае 2. Это показано ниже на C++, Java и Python:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <iostream> #include <vector> #include <algorithm> using namespace std; // Функция для печати элементов вектора void printVector(vector<int> const &input) { cout << “[“; int n = input.size(); for (int i: input) { cout << i; if (—n) { cout << “, “; } } cout << “]n”; } // Рекурсивная функция для вывода всех различных подмножеств `S`. // `S` ——> входной набор // `out` ——> vector для хранения подмножества // `i` ——> индекс следующего элемента в наборе `S` для обработки void printPowerSet(vector<int> &S, vector<int> &out, int i) { // если все элементы обработаны, вывести текущее подмножество if (i < 0) { printVector(out); return; } // включить текущий элемент в текущее подмножество и повторить out.push_back(S[i]); printPowerSet(S, out, i – 1); // возврат: исключить текущий элемент из текущего подмножества out.pop_back(); // удаляем соседние повторяющиеся элементы while (S[i] == S[i–1]) { i—; } // исключаем текущий элемент из текущего подмножества и повторяем printPowerSet(S, out, i – 1); } // Обертка над функцией `printPowerSet()` void findPowerSet(vector<int> S) // без ссылки, без константы { // сортируем набор sort(S.begin(), S.end()); // создаем пустой vector для хранения элементов подмножества vector<int> out; printPowerSet(S, out, S.size() – 1); } int main() { vector<int> S = { 1, 3, 1 }; findPowerSet(S); return 0; } |
Скачать Выполнить код
результат:
[3, 1, 1]
[3, 1]
[3]
[1, 1]
[1]
[]
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import java.util.ArrayDeque; import java.util.Arrays; import java.util.Deque; class Main { // Рекурсивная функция для вывода всех различных подмножеств `S`. // `S` ——> входной набор // `out` ——> список для хранения подмножества // `i` ——> индекс следующего элемента в наборе `S` для обработки public static void printPowerSet(int[] S, Deque<Integer> out, int i) { // если все элементы обработаны, вывести текущее подмножество if (i < 0) { System.out.println(out); return; } // включить текущий элемент в текущее подмножество и повторить out.addLast(S[i]); printPowerSet(S, out, i – 1); // возврат: исключить текущий элемент из текущего подмножества out.pollLast(); // удаляем соседние повторяющиеся элементы while (i > 0 && S[i] == S[i – 1]) { i—; } // исключаем текущий элемент из текущего подмножества и повторяем printPowerSet(S, out, i – 1); } // Обертка над функцией `printPowerSet()` public static void findPowerSet(int[] S) { // сортируем набор Arrays.sort(S); // создаем пустой список для хранения элементов подмножества Deque<Integer> out = new ArrayDeque<>(); printPowerSet(S, out, S.length – 1); } public static void main(String[] args) { int[] S = { 1, 3, 1 }; findPowerSet(S); } } |
Скачать Выполнить код
результат:
[3, 1, 1]
[3, 1]
[3]
[1, 1]
[1]
[]
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
from collections import deque # Рекурсивная функция для печати всех различных подмножеств `S`. # `S` ——> входной набор # `i` ——> индекс следующего элемента в наборе `S` для обработки # `out` ——> список для хранения элементов подмножества def printPowerSet(S, i, out=deque()): #, если все элементы обработаны, вывести текущее подмножество if i < 0: print(list(out)) return # включает текущий элемент в текущее подмножество и повторяет out.append(S[i]) printPowerSet(S, i – 1, out) # Возврат #: исключить текущий элемент из текущего подмножества out.pop() # удалить соседние повторяющиеся элементы while i > 0 and S[i] == S[i – 1]: i = i – 1 # исключить текущий элемент из текущего подмножества и повторить printPowerSet(S, i – 1, out) # Обертка над функцией `printPowerSet()` def findPowerSet(S): # сортировать набор S.sort() # распечатать набор мощности printPowerSet(S, len(S) – 1) if __name__ == ‘__main__’: S = [1, 3, 1] findPowerSet(S) |
Скачать Выполнить код
результат:
[3, 1, 1]
[3, 1]
[3]
[1, 1]
[1]
[]
Временная сложность приведенного выше решения равна O(n.2n), куда n
– это размер заданного набора.
Подход 2
Для данного набора S
, набор мощности можно найти, сгенерировав все двоичные числа от 0 до 2n-1
, куда n
это размер набора. Например, для набора S {x, y, z}
, генерировать двоичные числа от 0 до 23-1
и для каждого сгенерированного числа соответствующий набор можно найти, рассматривая установленные биты в числе.
- 0 = 000 = {}
- 1 = 001 = {z}
- 2 = 010 = {y}
- 3 = 011 = {y, z}
- 4 = 100 = {x}
- 5 = 101 = {x, z}
- 6 = 110 = {x, y}
- 7 = 111 = {x, y, z}
Чтобы избежать печати повторяющихся подмножеств, сначала отсортируйте набор. Кроме того, вставьте каждое подмножество в набор. Поскольку набор поддерживает все различные комбинации, у нас будут уникальные подмножества в наборе. Ниже приведена программа на C++, Java и Python, которая демонстрирует это:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <iostream> #include <set> #include <vector> #include <algorithm> #include <cmath> using namespace std; // Функция для печати заданного набора void printSet(vector<int> const &input) { cout << “[“; int n = input.size(); for (int i: input) { cout << i; if (—n) { cout << “, “; } } cout << “]n”; } // Итерационная функция для поиска всех различных подмножеств `S` set<vector<int>> findPowerSet(vector<int> S) // без ссылки, без константы { // `N` хранит общее количество подмножеств int N = pow(2, S.size()); // сортируем набор sort(S.begin(), S.end()); set<vector<int>> powerset; // генерируем каждое подмножество одно за другим for (int i = 0; i < N; i++) { vector<int> set; // проверить каждый бит `i` for (int j = 0; j < S.size(); j++) { // если установлен j-й бит `i`, добавляем `S[j]` к подмножеству if (i & (1 << j)) { set.push_back(S[j]); } } // вставляем подмножество в набор мощности powerset.insert(set); } return powerset; } int main() { vector<int> S = { 1, 2, 1 }; // находим powerset множества S set<vector<int>> powerset = findPowerSet(S); // вывести все подмножества, присутствующие в наборе мощности for (vector<int> subset: powerset) { printSet(subset); } return 0; } |
Скачать Выполнить код
результат:
[]
[1]
[1, 1]
[1, 1, 2]
[1, 2]
[2]
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import java.util.*; class Main { // Итерационная функция для вывода всех различных подмножеств `S` public static void findPowerSet(int[] S) { // `N` хранит общее количество подмножеств int N = (int)Math.pow(2, S.length); Set<List<Integer>> set = new HashSet<>(); // сортируем набор Arrays.sort(S); // генерируем каждое подмножество одно за другим for (int i = 0; i < N; i++) { List<Integer> subset = new ArrayList<>(); // проверить каждый бит `i` for (int j = 0; j < S.length; j++) { // если установлен j-й бит `i`, добавляем `S[j]` к подмножеству if ((i & (1 << j)) != 0) { subset.add(S[j]); } } // вставляем подмножество в множество set.add(subset); } // вывести все подмножества, присутствующие в наборе System.out.println(set); } public static void main(String[] args) { int[] S = { 1, 2, 1 }; findPowerSet(S); } } |
Скачать Выполнить код
результат:
[[1], [], [1, 1], [2], [1, 1, 2], [1, 2]]
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Итеративная функция для печати всех различных подмножеств `S` def findPowerSet(S): # `N` хранит общее количество подмножеств N = int(pow(2, len(S))) s = set() # сортировать набор S.sort() # генерирует каждое подмножество по одному for i in range(N): subset = [] # проверяет каждый бит `i` for j in range(len(S)): #, если установлен j-й бит `i`, добавить `S[j]` к подмножеству if i & (1 << j): subset.append(S[j]) # вставить подмножество в набор s.add(tuple(subset)) # распечатать все подмножества, присутствующие в наборе print(s) if __name__ == ‘__main__’: S = [1, 2, 1] findPowerSet(S) |
Скачать Выполнить код
результат:
{(1, 1), (1,), (1, 1, 2), (1, 2), (), (2,)}
Временная сложность приведенного выше решения равна O(n.2n), куда n
– это размер заданного набора.