Разбиение множества на уникальные последовательности - C#
Формулировка задачи:
Добрый день
Задача такова: имеется множество А {a,b,c,d ...}. Из этого множества нужно составить уникальные последовательности заданного размера(это часть ассоциативного алгоритма А'приори).
Если размер 1, то это соответственно a,b,c,d и тд.
Если размер 2, то - ab,ac,ad,bc,bd,cd...
Если размер 3, то - abc,abd,bcd.
Сложность состоит в том, что размер множества можно задавать динамически (N). Соответственно размер последовательностей будет расти от 1 до N-1.
Я пока что совсем не понимаю как к этому всему подступится. Возможно нужно реализовывать через рекурсию. Но если я понимаю хотя бы, по какому принципу выбирать последовательности при N<= 3, то вот как программно описать, что творится дальше - не знаю.
Решение задачи: «Разбиение множества на уникальные последовательности»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication13 { class Program { static void Main() { const string input = "ABCDEF"; var gen = Generate(input); foreach (string s in gen.Where(x => x.Length == 3)) { Console.WriteLine(s); } Console.ReadKey(); } private static IEnumerable<string> Generate(string s) { return PowerSet(s).Select(x => new string(x.ToArray())); } static IEnumerable<IEnumerable<T>> PowerSet<T>(IEnumerable<T> initialSet) { var set = new List<IEnumerable<T>> { Enumerable.Empty<T>() }; return initialSet.Aggregate((IEnumerable<IEnumerable<T>>)set, (x, y) => x.Concat(x.Select(z => z.Concat(new List<T> { y })))); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д