【问题标题】:Find all the variations of K elements from a set of n从一组 n 中找到 K 个元素的所有变体
【发布时间】:2012-01-03 14:17:10
【问题描述】:

我遇到了这个问题,试图从集合 [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 有一个随机值时我应该怎么做?

【问题讨论】:

  • 请发布您当前的代码并说明您在哪里遇到了困难。
  • 你能把你的代码放上来,以便我们更好地理解这个问题。
  • 首先,让我们看看你到目前为止做了什么。
  • python中同样的问题。
  • 你可以在这里阅读一些有趣的想法:stackoverflow.com/questions/127704/…

标签: c# algorithm variation


【解决方案1】:

这是我的提示:我认为您使用递归的方法是正确的。

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

【讨论】:

  • 嗯,有很多 [] 的提示,而我们有方便的 &lt;&gt;
  • &lt;&gt; 就是这样。这只是一个提示。 ^^
【解决方案2】:

虽然我不确定我是否关注你,但这是我认为你应该做的:

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

【讨论】:

  • 我有这个函数: public static void PrintVariation(int n, int k, int[] array) { //when k = 2 for (int i = 0; i
【解决方案3】:
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;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多