2017-10-05 80 views
3

我一直在尝试对排列在简单列表中的项目进行排列,我已使用以下代码从question中进行排序,但当序列的大小变得非常大时,它非常慢。在列表中排列项目

static IEnumerable<IEnumerable<T>> 
GetPermutations<T>(IEnumerable<T> list, int length) 
{ 
if (length == 1) return list.Select(t => new T[] { t }); 

return GetPermutations(list, length - 1) 
    .SelectMany(t => list.Where(e => !t.Contains(e)), 
     (t1, t2) => t1.Concat(new T[] { t2 })); 
} 

例如,当输出的长度需要是大的,则此方法需要很长的时间被执行。

这个问题的一个例子是,我们有25个字母,我们想知道所有可能的5租客长单词,我们可以与他们产生。

有没有其他方法可以比这个更快运行?

+1

对此问题的接受答案是否有效? LINQ几乎总是很慢。 – 2017-10-05 13:32:14

+1

@someone“LINQ几乎总是很慢”Sais是谁?这完全取决于你如何迭代你的收藏,并且与linq per-sé无关。 – HimBromBeere

+1

我没有说用linq编写快速代码是不可能的,但是没有linq的代码可能会更快。 – 2017-10-05 13:36:24

回答

1

假设你有25个字母,你想知道你可以用它们生成多少个单词,它们恰好是5个字符,那么在数学上会有25^5的可能性。为了简化,我们可以得出的问题如下:

[25] [25] [25] [25] [25] 

这将是类似于异国基地(在这种情况下,它是基地25)。我认为你能做的最快的方法就是利用基础转换。让我们将字母数组的大小缩短为5,并将您的单词的长度缩短为2个字符,以便简化问题。你必须计算在这种情况下有多少可能性是[5] [5] -> 25。现在你知道这一点,你可以用类似下面的方法写的东西:

public static T[] Permute<T>(int input, List<T> items) 
    { 
     List<T> brute = new List<T>(); 
     while (true) 
     { 
      var temp = (decimal)input/(decimal)items.Count; 
      var r = input % items.Count; 
      input = (int)temp-1; 
      if (temp < 1) 
      { 
       brute.Add(items[r]); 
       break; 
      } 
      else 
      { 
       brute.Add(items[r]); 
      } 
     } 
     return brute.ToArray(); 
    } 

,并在for循环中使用它来获得所需输出:

static void Main(string[] args) 
{ 
    List<char> ls = new List<char> { 'A', 'B', 'C', 'D', 'E' }; 
    for (int i = ls.Count; i < (ls.Count * ls.Count)+ls.Count ; i++) { 
     var x = Permute(i, ls); 
     for (int j = 0; j < x.Length; j++) { 
      Console.Write(x[j] + " "); 
     } 
     Console.WriteLine(); 
    } 
    Console.ReadKey(true); 

} 

请记住,你根据输出的时间长短,最好使用Math.Pow方法而不是(ls.Count * ls.Count)。您必须计算for循环中的偏移量才能获得所需字符串的确切大小。

这种方法100%依赖于基数转换,就好像你有5个字母,你有两个地方,然后你用五个字母填写第一个地方,然后因为没有第六个,第一个必须放入另一个地点和相同的过程必须一再重复。

+0

你可能想'ref'单个列表来置换并保存几百万个列表创建并将其转换为数组。 – 2017-10-05 13:44:37

+0

@someone这个问题可能会变得非常模糊和复杂,重点在于教授OP。他们可以根据需要对其进行优化。这不是一个阅读解决方案。 – Transcendent