2017-10-05 84 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