【发布时间】:2011-04-27 13:55:05
【问题描述】:
我需要一个有效的算法来获取整数列表的所有可用组合。我也需要部分结果。
一个例子:
{1, 2, 3}
{4, 5}
{6, 7, 8}
我需要得到:
1
2
3
1/4
1/5
2/4
2/5
3/4
3/5
1/4/6
1/4/7
1/4/8
1/5/6
1/5/7
1/5/8
2/4/6
2/4/7
2/4/8
2/5/6
2/5/7
2/5/8
3/4/6
3/4/7
3/4/8
3/5/6
3/5/7
3/5/8
如果可能的话,我需要它以最快的方式。我已经有了一个算法,但我想知道是否有更好的替代方案。
谢谢。
编辑: 这是我当前的代码。对不起意大利的cmets。
// Istanzia una lista per contenere le liste di valori
List<List<int>> allLists = new List<List<int>>();
... CODE TO FILL THE LISTS ...
// Esegue un ciclo fino al numero di liste recuperate
for (int listIndex = 0; listIndex < allLists.Count; listIndex++)
{
// Istanzia una lista per contenere le liste di valori fino allo
// step corrente
List<List<int>> stepLists = new List<List<int>>();
// Esegue un ciclo sulle liste fino allo step corrente
for (int stepListIndex = 0; stepListIndex <= listIndex; stepListIndex++)
{
// Aggiunge la lista a quelle dello step corrente
stepLists.Add(allLists[stepListIndex]);
}
// Esegue il prodotto vettoriale delle liste specificate
List<List<int>> crossLists =
Mathematics.CrossProduct(stepLists, new List<int>());
// Carica l'elenco delle combinazioni
CombinationsCollection allCombinations =
new CombinationsCollection(Kernel);
allCombinations.Load();
// Esegue un ciclo su ciascuna lista recuperata
foreach (List<int> crossList in crossLists)
{
}
}
... OTHER CODE ...
public static List<List<int>> CrossProduct(
List<List<int>> lists,
List<int> root)
{
// Istanzia delle liste per contenere le combinazioni
List<List<int>> results = new List<List<int>>();
// Se ce n'è almeno una
if (lists.Count > 0)
{
// Recupera la prima lista
List<int> list = (List<int>)lists[0];
// Se è rimasta solo una lista
if (lists.Count == 1)
{
// Esegue un ciclo su tutti i valori
foreach (int value in list)
{
// Aggiunge un risultato con radice e valore
results.Add(new List<int>(root) { value });
}
}
else
{
// Esegue un ciclo su ogni valore della lista
foreach (int value in list)
{
// Aggiunge ai risultati la prosecuzione del prodotto
// vettoriale dalla lista successiva
results.AddRange(CrossProduct(
lists.GetRange(1, lists.Count - 1),
new List<int>(root) { value })
);
}
}
}
return results;
}
【问题讨论】:
-
您似乎没有在所需的输出中包含所有可能的组合。例如 4, 5, 6, 7, 8, 1/6, 1/7, ... 为什么会这样?
-
抱歉,所有可能的组合都会按顺序排列。
-
所以澄清一下,如果“x”表示“笛卡尔积”和“|”表示“连接”,那么您想要获取一系列序列 { A, B, C } 并生成序列 (A) | (AxB) | (AxBxC),是吗?
-
另外,我很确定您不想要“可能的最快方式”,因为您可能不愿意用在液冷超级计算机上运行的经过严格优化的机器代码编写算法。要求“最快”的方式做某事是行不通的。如果您有一个性能预算并且您无法满足它,那么这是该问题的工程标准;说明您的预算是多少以及超出了多少。
-
显然,意思是“C#中最快的方式”。我不知道生产时将在哪台机器上托管代码。
标签: c# algorithm combinations