2016-09-13 4 views
2

元のリストの各要素がそのリストの連続したサブリストに何回現れるかを計算する必要があります。例えば、リストの各要素が連続するサブリストの数を計算する

セット[A、B、C]の場合、隣接するサブリスト[A、B、C]、[A、B]、[B、C]、[A]、[B] [C]、これは数字に従う私を与える:
AはBは4回使用
Cリスト3回

を用いる[A、B、C、D]が[Aであるべきで3回
を使用B、C、D]、[B、C、D]、[A、B]、[B、C]、[C、D]、[A] [C]、[D]、数字:
A 4回
B 6回使用
Cは6回使用
Dは、私はすべての連続したサブリストを生成し、私は私の計算を行うことができたコードを持って4回

を使用しました。しかし、大きな入力に対しては遅すぎると同時に、すべての連続したサブリストを生成せずに計算を行うことができたと思っています。など

public static IEnumerable<int[]> Permutate(int[] a) 
    { 
     for (int i = 1; i < a.Length; i++) 
     { 
      for (int j = 0; j < a.Length-i; j++) 
      { 
       yield return a.Skip(j).Take(i).ToArray(); 
      } 
     } 
    } 
+2

これまでに書いたことをお伝えください。 – Max

+4

これをコンピュータプログラムとして回答してもよろしいですか?私には数学的な問題のようです。 – SJuan76

+3

ところで、[permutations](https://en.wikipedia.org/wiki/Permutation)には、セットの各要素が含まれているため、正しい用語を使用する必要があります。元の注文を保存します)。 – SJuan76

答えて

12

が最初の要素とリストの先頭の間だけでなく、あなたのリスト内の要素間のポイントの数を考慮して、キーワード、コードをグーグル、そして: 私は非常に任意の助けのために理解されるであろう最後の要素とリストの最後。

各サブリストは、この一連のポイントから開始点と終了点で構成されています。したがって、特定の要素を含むサブリストの数は、その要素の左と右の点の数の積です。

[A、B、C、D]の例では、 '|'を使用します。ポイントのために。 | A | B | C | D |

'B'の場合、左に2つ、右に3つありますので、2 * 3 = 6となります。

一般に、元のリストがn個の要素を持ち、要素kを考慮している場合、最初の要素がk = 0であるようにゼロインデックスされているので、n + 1個の点があります。これらのうち、k + 1は要素kの左側にあり、n + 1 - (k + 1)= n-kは右側にあります。これは、要素kを含む(k + 1)*(n-k)個のサブリストが存在することを意味する。

関連する問題