Рубрики
Без рубрики

Создайте набор питания

Создание набора мощности. Помеченный структурами данных, java, программированием.

Что такое набор мощности?

Почему это называется набором мощности? Хорошо это или плохо для нас? Понадобится ли мне это в моем следующем проекте Angular/машинного обучения?

Если мы посмотрим на Википедию для определения powerset , мы увидим следующее:

В математике набор мощности (или набор мощности) любого множества S – это множество всех подмножеств S,…

Круто, это означает, что если у нас есть набор из нескольких предметов {1, 2}, то набор мощности будет набором всех наборов, в случае {1, 2} это будет:

{ {1}, {2}, {1, 2}}

Продолжая читать определение Википедии, мы видим, что ребята там говорят:

включая пустой набор и сам S

Знаете что, эти ребята говорят, что нам нужно добавить пустой набор давайте просто добавим его и двинемся дальше:

{ {}, {1}, {2}, {1, 2}}

Итак, мы добавили пустое множество, определение теперь счастливое. 🙂

Хорошо, я думаю, теперь мы соответствуем определению, хорошо.

Компьютер создает набор питания

Теперь вопрос в том, как нам запрограммировать компьютер, чтобы он дал нам набор питания? Компьютер не читал определение Википедии, поэтому он не имеет ни малейшего представления о том, как это закодировать, давайте поможем ему.

Рекурсия сразу приходит на ум . С помощью рекурсии, если нам удастся решить проблему в терминах меньшей проблемы, мы могли бы объединить меньшее решение проблемы с большим, поэтому мы берем наш исходный набор:

{1, 2} , меньший набор или меньшая проблема здесь были бы: {1, 2}.хвост => {2} . Если мы волшебным образом (или, другими словами, рекурсивно) изменим набор его возможностей:

{ {}, {2}} . Все, что нам тогда оставалось бы, – это объединить его с набором полномочий head – {1, 2}.head => {1} который: { {}, {1}} а затем добавьте сам набор, который: { {1, 2} } .

Я не знаю, как вы, но, как бы ни была романтична рекурсия, я всегда чувствую, что это обман, так как бы мы это сделали без обмана, то есть без рекурсии?

Если мы просканируем набор только один раз и выполним одно вычисление для каждого элемента, у нас действительно не будет возможности выполнить все комбинации подмножеств, поэтому кажется, что нам нужен вложенный цикл. Давайте начнем писать это, но подождите перед этим, давайте немного разогреем наши синтаксические движки java .

Набор питания с Java

Разогрев навыков набора java :

Определите новый набор в java:

Set set = new HashSet<>(); // define a set of integers in java.
Set> setOfSets = new HashSet<>(); // PowerSet is a set of sets..
Set> copiedSet = new HashSet(setOfSets); // Copy a set into a new variable.

Мы начинаем с подписи , получаем набор и возвращаем набор, оба являются набором целых чисел:

публичный набор<Набор<Целое число>> Набор мощности(Набор <Целое число> набор)//мы получаем набор и возвращаем набор мест, набор мощности – это набор наборов.

Теперь, когда у нас есть набор, давайте начнем повторять элементы набора:

public Set> powerSet(Set set) {
    Set powerSet = new HashSet<>();

    for (Integer item: set) {
        powerSet.add(item);
    }

    // omg omgI'm stuck here...
    // but now what after we added all items how do we combine them all to the power set?
}

Похоже, этого недостаточно, мы не можем просто сканировать предметы и создавать набор наборов. Давайте немного поразмышляем над этим.

хмм…

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

Каждый набор, который нам удастся создать, нам понадобится этот набор с каждым другим элементом в наборе, поэтому смотрите, для каждого найденного набора, независимо от того, какое это подмножество, для каждого подмножества другим допустимым подмножеством будет это подмножество с каждым другим элементом в исходном наборе.

Найдено подмножество { 1, 2 }? и у вас есть { 4 } в исходном наборе: вот еще одно подмножество для вас { 1, 2, 4 }.

По этой причине то, что мы собираемся сделать, это сохранить все временные подмножества, которые нам удастся найти и для каждого такого подмножества добавьте каждый элемент из исходного набора, что означает, что он будет следовать:

  1. Найдите первое подмножество – например, пустое множество.
  2. Добавьте его к уже найденным подмножествам.
  3. Добавьте каждый элемент из исходного набора в.

Хорошо, все готово? давайте перейдем к полной реализации PowerSet! :

     public static Set> powerSet(Set set) {
       Set> powerSets = new HashSet<>();  // we define powerset.

       Set emptySet = new HashSet<>();
       powerSets.add(emptySet); // start with the empty set.


       for (Integer item: set) { // We want to add each item to all previous subsets.
         Set> foundSets = new HashSet(powerSets);
         for (Set foundSet: foundSets) {
           Set newSet = new HashSet(foundSet);
           newSet.add(item); // Add each item to all previously found subsets.
           powerSets.add(newSet); // Add new subset to all subsets found.

         }
       }

       return powerSets;

     }

And if we run it with:

         Set set = new HashSet();
         set.add(1);
         set.add(2);
         set.add(3);
         System.out.println(powerSet(set));

We get:

// [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] Looks like a power set to me! What do you say? ;)

Теперь, когда у нас есть императивный метод, давайте посмотрим на scala:: функциональный:: декларативный:: краткий метод:))

  def powerSet(set: Set[Int]): Set[Set[Int]] = {

    set.toList match {
      case Nil => Set(Set.empty[Int])
      case x :: xs => powerSet(xs.toSet).map(xsi => xsi + x) ++ powerSet(xs.toSet)
    }
  }

  println(powerSet(Set(1,2,3))) // Set(Set(), Set(3, 1), Set(2), Set(2, 1), Set(3, 2), Set(3), Set(3, 2, 1), Set(1))

Так круто!

Подводя итог, мы начали с добавления пустого набора . Затем мы сканируем каждый элемент от 1 ..n и добавляем этот элемент в пустой набор, в итоге мы получаем каждый раз только один раз в наборе питания.

Затем мы берем каждый такой элемент и добавляем его в существующие в настоящее время наборы, когда мы добавляем { 1 } в набор { 1 }, это не будет { 1, 1 } только с { 1 } ( psst, это набор, помните? ). И мы продолжаем сканировать каждый элемент в наборе и добавляем каждый из них в текущие наборы, что будет означать, что у нас будут все подмножества – наборы мощности.

Как это поможет нам с AngularJS или машинным обучением? это просто, по крайней мере, на мой взгляд, овладев синтаксисом и языком, овладев базовыми структурами данных, будь то наборы, списки, карты , из них мы можем создавать очереди, кучи, деревья, а из них еще более сложные структуры данных. Все это важно, и как инженеры-программисты мы имеем дело с ними каждый день, прямо или косвенно, поэтому лучше всего освоить эти очень простые базовые термины.

Цикл for, набор, список являются базовыми, но они являются мощными с помощью этих базовых конструкций мы создали набор функций.

Оригинал: “https://dev.to/tomerbendavid/build-a-powerset–2210”