从一组n中找出K个元素的所有变体

时间:2012-01-03 14:17:10

标签: c# algorithm variation

我遇到了尝试从集合[1..N]生成K个元素的所有变体的问题。我也有一个想法,我可以使用k个嵌套循环来做到这一点,并尝试递归但不成功。


我有这个功能:

public static void PrintVariation(int n, int k, int[] array) 
{ 
   //when k = 2 

   for (int i = 0; i < n; i++) 
   { 
      for (int j = 0; j < n; j++) 
      { 
         Console.WriteLine("{0}, {1}", array[i], array[j]); 
      } 
   } 
} 

但是当k具有随机值时,我想要做什么?

3 个答案:

答案 0 :(得分:0)

这是我的提示:我认为你使用递归是在正确的轨道上。

private List<Element[]> getVariations(int k, Element[] elements)
{
    // ... ^_^
    // use getVariations with less elements in here
}

答案 1 :(得分:0)

我不确定我是否会关注你,但我认为你应该这样做:

  1. 创建一个“从集合中生成K个元素变体的函数[1..N]”它应该返回该变体。
  2. 在另一个将其添加到泛型集合的方法中,在for循环中调用该函数。您可以添加另一个例程来检查该函数生成的变体是否已存在于集合中,并跳过将该变体添加到集合中。

答案 2 :(得分:-1)

public static List<List<T>> GetVariations<T>(int k, List<T> elements)
{
    List<List<T>> result = new List<List<T>>();
    if (k == 1)
    {
        result.AddRange(elements.Select(element => new List<T>() { element }));
    }
    else
    {
        foreach (T element in elements)
        {
            List<T> subelements = elements.Where(e => !e.Equals(element)).ToList();
            List<List<T>> subvariations = GetVariations(k - 1, subelements);
            foreach (List<T> subvariation in subvariations)
            {
                subvariation.Add(element);
                result.Add(subvariation);
            }
        }
     }
     return result;
 }