Разбиение множества на уникальные последовательности - 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 }))));
}
}
}