Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte Erklärung von Permutationen und Kombinationen in C#

Detaillierte Erklärung von Permutationen und Kombinationen in C#

黄舟
黄舟Original
2016-12-15 14:20:382464Durchsuche

Das Konzept der Permutation und Kombination

Permutation: Das Nehmen von m (m≤n) Elementen aus n verschiedenen Elementen und das Anordnen dieser Elemente in einer bestimmten Reihenfolge wird als „Anordnen von m Elementen“ bezeichnet.

Kombination: Aus m verschiedenen Elementen werden beliebige n (n≤m) Elemente als Gruppe genommen, was als Kombination von n Elementen aus m verschiedenen Elementen bezeichnet wird.

Permutations- und Kombinationsimplementierungscode

Bei der Planung des Verlaufs einer Wasserstraße im vorherigen Projekt wurde die Permutationsdatenstruktur verwendet. Ermitteln Sie die Anzahl der Kombinationen von M Punkten in unterschiedlicher Reihenfolge unter beliebigen N Punkten.

Finden Sie auf diese Weise den optimalen Weg. Hier ist ein Permutations- und Kombinationsalgorithmus, den ich nicht finden kann.

public class PermutationAndCombination<T>
 {
 /// <summary>
 /// 交换两个变量
 /// </summary>
 /// <param name="a">变量1</param>
 /// <param name="b">变量2</param>
 public static void Swap(ref T a, ref T b)
 {
 T temp = a;
 a = b;
 b = temp;
 }
 /// <summary>
 /// 递归算法求数组的组合(私有成员)
 /// </summary>
 /// <param name="list">返回的范型</param>
 /// <param name="t">所求数组</param>
 /// <param name="n">辅助变量</param>
 /// <param name="m">辅助变量</param>
 /// <param name="b">辅助数组</param>
 /// <param name="M">辅助变量M</param>
 private static void GetCombination(ref List<T[]> list, T[] t, int n, int m, int[] b, int M)
 {
 for (int i = n; i >= m; i--)
 {
 b[m - 1] = i - 1;
 if (m > 1)
 {
 GetCombination(ref list, t, i - 1, m - 1, b, M);
 }
 else
 {
 if (list == null)
 {
 list = new List<T[]>();
 }
 T[] temp = new T[M];
 for (int j = 0; j < b.Length; j++)
 {
 temp[j] = t[b[j]];
 }
 list.Add(temp);
 }
 }
 }
 /// <summary>
 /// 递归算法求排列(私有成员)
 /// </summary>
 /// <param name="list">返回的列表</param>
 /// <param name="t">所求数组</param>
 /// <param name="startIndex">起始标号</param>
 /// <param name="endIndex">结束标号</param>
 private static void GetPermutation(ref List<T[]> list, T[] t, int startIndex, int endIndex)
 {
 if (startIndex == endIndex)
 {
 if (list == null)
 {
 list = new List<T[]>();
 }
 T[] temp = new T[t.Length];
 t.CopyTo(temp, 0);
 list.Add(temp);
 }
 else
 {
 for (int i = startIndex; i <= endIndex; i++)
 {
 Swap(ref t[startIndex], ref t[i]);
 GetPermutation(ref list, t, startIndex + 1, endIndex);
 Swap(ref t[startIndex], ref t[i]);
 }
 }
 }
 /// <summary>
 /// 求从起始标号到结束标号的排列,其余元素不变
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <param name="startIndex">起始标号</param>
 /// <param name="endIndex">结束标号</param>
 /// <returns>从起始标号到结束标号排列的范型</returns>
 public static List<T[]> GetPermutation(T[] t, int startIndex, int endIndex)
 {
 if (startIndex < 0 || endIndex > t.Length - 1)
 {
 return null;
 }
 List<T[]> list = new List<T[]>();
 GetPermutation(ref list, t, startIndex, endIndex);
 return list;
 }
 /// <summary>
 /// 返回数组所有元素的全排列
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <returns>全排列的范型</returns>
 public static List<T[]> GetPermutation(T[] t)
 {
 return GetPermutation(t, 0, t.Length - 1);
 }
 /// <summary>
 /// 求数组中n个元素的排列
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <param name="n">元素个数</param>
 /// <returns>数组中n个元素的排列</returns>
 public static List<T[]> GetPermutation(T[] t, int n)
 {
 if (n > t.Length)
 {
 return null;
 }
 List<T[]> list = new List<T[]>();
 List<T[]> c = GetCombination(t, n);
 for (int i = 0; i < c.Count; i++)
 {
 List<T[]> l = new List<T[]>();
 GetPermutation(ref l, c[i], 0, n - 1);
 list.AddRange(l);
 }
 return list;
 }
 /// <summary>
 /// 求数组中n个元素的组合
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <param name="n">元素个数</param>
 /// <returns>数组中n个元素的组合的范型</returns>
 public static List<T[]> GetCombination(T[] t, int n)
 {
 if (t.Length < n)
 {
 return null;
 }
 int[] temp = new int[n];
 List<T[]> list = new List<T[]>();
 GetCombination(ref list, t, t.Length, n, temp, n);
 return list;
 }
 }

Finden Sie die Kombination: Finden Sie die Kombination von 3 beliebigen Zahlen aus 5 Zahlen

static void Main(string[] args)
{
int[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组
List<int[]> ListCombination = PermutationAndCombination<int>.GetCombination(IntArr, 3); //求全部的3-3组合
foreach(int[] arr in ListCombination)
{
foreach(int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine("");
}
Console.ReadKey();
}

Finden Sie die Anordnung: 5 Zahlen Nehmen Sie eine beliebige Permutation von 3

i

nt[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组
List<int[]> ListCombination = PermutationAndCombination<int>.GetPermutation(IntArr, 3); //求全部的5取3排列
foreach(int[] arr in ListCombination)
{
foreach(int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine("");
}

Detaillierte Erklärung von Permutationen und Kombinationen in C#

Das Obige ist eine detaillierte Erklärung der Permutationen und Kombinationen von C#. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn