需要一个算法来计算所有变化(组合计算)
本文关键字:计算所 有变化 组合 计算 一个 算法 | 更新日期: 2023-09-27 18:00:26
我有一个列表,它的项目数总是偶数。
我需要一个算法来找到所有两个成员的组合。
例如,如果项目计数为4,则输出为;
项目:
{1,2,3,4}
ResulSet:
{12} ,{34}
{13} ,{24}
{14} ,{23}
顺序没有区别,{12}涵盖了{21}。
对于项目计数6,输出将为;
项目:
{1,2,3,4,5,6}
ResulSet:
12 34 56
12 35 46
12 36 45
13 24 56
13 25 46
13 26 45
14 23 56
14 25 36
14 26 35
15 23 46
15 24 36
15 26 34
16 23 45
16 24 35
16 25 34
你能给我指一条路吗?
谢谢。
编辑:
这个问题读起来很短,如果你花1分钟的时间读这个问题,你会发现它并不像大多数人认为的那样重复(可能他们是半文盲)
{1,2,3,4,5,6}的组合是
123456,正如您在顶部看到的,这不是我想要的。若你们想帮忙或下车,请阅读问题。
祝你今天愉快。
由于组合中总是有两个成员,因此一个简单的嵌套for循环应该可以工作:
for (int i = 0; i < data.Length - 1; i++)
for (int j = i + 1; j < data.Length; j++
Console.WriteLine({0}{1}, i, j);
我们迭代列表中的每个项目,直到倒数第二个项目(因为我们不能有1个数字组合)。在这些迭代中,我们从外部迭代变量加1(没有重复元素)一直迭代到列表的末尾。
这将生成所有唯一的组合。不过,要进行两个或三个以上的成员输出,您需要研究递归。我将把输出的格式设置为与您的问题相匹配,作为读者的练习:)。
对于6个元素的组合,我们将不得不深入研究递归的狂野世界。递归真的会扰乱你的头脑,所以如果你不明白什么,请问一下。递归的一般原理是:"用第一个元素做一些事情,调用自己并传递其余的"。在这种情况下,代码看起来像:
public List<List<int>> GetAllCombos (int[] values)
{
//Kick it off with the 0 index
return GetCombos(values, 0);
}
private List<List<int>> GetCombos(int[] values, int myIndex)
{
//A holder for combinations from this index onward
List<List<int>> combos = new List<List<int>>();
for (int i = myIndex; i < values.Length; i++)
{
if (myIndex + 1 < values.Length)
{
foreach (List<int> combo in GetCombos(values, myIndex + 1))
{
combo.Add(values[myIndex][i]);
combos.Add(combo);
}
}
else
{
List<int> newCombination = new List<int>() { values[myIndex][i] };
combos.Add(newCombination);
}
}
return combos;
}
再说一遍,如果你不明白什么,请一定要问。递归可能是一个很难理解的概念!
你做过研究吗?5分钟(甚至不是那样)与谷歌和我得到:
- 生成置换和组合
- 排列和组合的算法
- 基于树的计算k-组合和k+/em>-组合的算法
- 组合算法
所有这些都将向你展示如何做到这一点。
搜索SO,你很快就会发现这个问题,返回n中k个元素的所有组合的算法,甚至有更多的资源(更不用说实际的解决方案)。
如果你是IEEE或ACM的成员,几秒钟搜索他们的在线图书馆就会得到你所需要的一切。