Как найти множество всех подмножеств множества

Как найти все подмножества множеств

На простом примере напомним, что называется подмножеством, какие бывают подмножества (собственные и несобственные), формулу нахождения числа всех подмножеств, а также калькулятор, который выдает множество всех подмножеств.

Пример 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
    формула верна.

  2. Предположим,
    что формула верна, для п=к,
    то есть
    .

  3. Докажем,
    что формула верна, для п=к+1,
    то есть

.

Действительно,

=,
что и требовалось доказать.

На
основании метода математической индукции
заключаем, что формула верна для любого
натурального числа п.

Пример
4.
Найти сумму

Решение.
Заменим
каждое слагаемое разностью по формуле

.

Имеем,

=так как все слагаемые в левой части
равенства, за исключением второго и
предпоследнего взаимно уничтожаются.

Следовательно,
=

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

На диаграмме кругов Эйлера видно, что A является подмножеством B, а B является надмножеством A.

В математике говорят, что множество A есть подмно́жество множества B, если все элементы первого множества являются и элементами второго множества.

Определение[править | править код]

Множество A называется подмножеством множества B, если все элементы, принадлежащие A, также принадлежат B[1]. Формальное определение:

{displaystyle (Asubset B)Leftrightarrow left(forall x(xin ARightarrow xin B)right),}

Существует две системы символических обозначений для подмножеств:

«A является подмножеством B (нестрогим)» обозначается «A является строгим подмножеством B» обозначается Примечание
A subseteq B Asubset B Символ subseteq является аналогом leq , то есть в случае Asubseteq B допускается равенство A=B множеств;

символ subset является аналогом {displaystyle <}, то есть в случае Asubset B в B есть элементы, которых нет в A.

Asubset B {displaystyle Asubsetneq B} Для понятия «(нестрогое) подмножество» используется более простой символ, так как оно считается более «фундаментальным».

Обе системы обозначений предусмотрены стандартом ISO 31-11, но используют символ subset в разных смыслах, что может привести к путанице. В данной статье мы будем использовать последнюю систему обозначений.

Множество B называется надмно́жеством множества A, если A является подмножеством множества B.

То, что B является надмножеством множества A, записывают {displaystyle Bsupset A}, то есть
{displaystyle (Asubset B)Leftrightarrow (Bsupset A),.}

Множество всех подмножеств множества A обозначается {displaystyle {mathcal {P}}(A)}.

Множества A и B называются равными {displaystyle A=B}, только когда они состоят из одних и тех же элементов, то есть A subseteq B и {displaystyle Bsubseteq A}.[2]

Собственное и несобственное подмножество[править | править код]

Любое множество B среди своих подмножеств содержит само себя и пустое множество. Само множество B и пустое множество называют несобственными подмножествами, остальные подмножества называют собственными[3].

То есть, если мы хотим исключить само B и пустое множество из рассмотрения, мы пользуемся понятием со́бственного подмножества, которое определяется так:

множество A является собственным подмножеством множества B, только если Asubset B и {displaystyle Aneq B}, {displaystyle Aneq varnothing }.

Зарубежная литература[править | править код]

В зарубежной литературе несобственные подмножества в вышеуказанном смысле (само множество B и пустое множество) называют тривиальными, а собственные — нетривиальными, а термин «собственное подмножество» (proper subset) применяется в значении «строгое включение A в B» или «подмножество A, строго входящее в множество B, то есть такое, которому не принадлежит как минимум один элемент множества B», то есть здесь понятие «собственное подмножество» уже, наоборот, включает пустое множество.

В этом случае, если вдобавок нужно исключить из рассмотрения пустое множество, нужно использовать понятие нетривиа́льного подмножества, которое определяется так:

множество A является нетривиальным подмножеством множества B, если A является собственным подмножеством (proper subset) B и {displaystyle Aneq varnothing }.

Примеры[править | править код]

Свойства[править | править код]

Отношение подмножества обладает целым рядом свойств[4].

Подмножества конечных множеств[править | править код]

Если исходное множество конечно, то у него существует конечное количество подмножеств. А именно, у n-элементного множества существует 2^{n} подмножеств (включая пустое). Чтобы убедиться в этом, достаточно заметить, что каждый элемент может либо входить, либо не входить в подмножество, а значит, общее количество подмножеств будет n-кратным произведением двоек. Если же рассматривать только подмножества n-элементного множества из {displaystyle kleq n} элементов, то их количество выражается биномиальным коэффициентом textstyle {binom  {n}{k}}. Для проверки этого факта можно выбирать элементы подмножества последовательно. Первый элемент можно выбрать n способами, второй n-1 способом, и так далее, и, наконец, k-й элемент можно выбрать {displaystyle n-k+1} способом. Таким образом мы получим последовательность из k элементов, и ровно k! таким последовательностям соответствует одно подмножество. Значит, всего найдётся {displaystyle textstyle {frac {n(n-1)dots (n-k+1)}{k!}}={binom {n}{k}}} таких подмножеств.

Примечания[править | править код]

  1. Биркгоф, 1976, с. 10.
  2. Мельников О. В., Ремеслеников В. Н., Романьков В. А. Общая алгебра. Том 1. — М., Наука, 1990. — с. 11
  3. Подмножество. // Математический энциклопедический словарь. / ред. Ю. В. Прохоров. — М., Советская энциклопедия, 1988. — с. 465
  4. В. А. Ильин, В. А. Садовничий, Бл. Х. Сендов. Глава 2. Вещественные числа // Математический анализ / Под ред. А. Н. Тихонова. — 3-е изд., перераб. и доп. — М.: Проспект, 2006. — Т. 1. — С. 65. — 672 с. — ISBN 5-482-00445-7.
  5. Келли Дж. Общая топология = 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} существуют следующие подмножества:

  1. {X};
  2. {Y};
  3. {Z};
  4. {XY};
  5. {XZ};
  6. {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, у нас есть два варианта:

  1. Рассмотрим этот элемент.
  2. Не принимайте во внимание этот элемент.

Следующее решение генерирует все комбинации подмножеств, используя приведенную выше логику. Чтобы распечатать только отдельные подмножества, сначала сортировать подмножество и исключить все соседние повторяющиеся элементы из подмножества вместе с текущим элементом в случае 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[i1]) {

        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 – это размер заданного набора.

Добавить комментарий