2016-12-27 6 views
0

n要素の配列から一意の3要素のすべての組み合わせを返す最速のアルゴリズムについて考えていました。明らかなのはO(n^3)ソリューションです。これは考えられるすべての組み合わせを考慮に入れていますが、これはブルートフォースであり、私はもっと迅速に何かを見つけるつもりです。 C++で答えを探すn要素の配列から3要素のすべての組み合わせを見つける

+2

本当に 'すべての'組み合わせが必要な場合は、O(n^3)よりも高速に解を作ることは不可能です出力はすでにO(n^3)です。 – newbie

+0

申し訳ありませんが、私はユニークなソリューションについて考えていました。私の質問を編集するつもりだ – PaulW

+0

ユニークな解決策は? – coderredoc

答えて

1

(配列のすべての項目が異なっている)あなたは出力に

n !/((n - 3)! * 3!) == n * (n - 1) * (n - 2)/6 

明確なアイテムを持っているので、O(n**3)はあなたが達成することができ、すべてのです。配列は、多くのアイテムが、いくつか明確なものを持っている場合 は、あなたがそれを前処理することができます。すべての項目ocurrenciesを削除しますが、3 :

[0, 1, 1, 1, 1, 0, 2, 1, 2, 2, 2, 1] -> [0, 0, 1, 1, 1, 2, 2, 2] 

あなたは、配列の項目の前処理のための良好なハッシュ関数を使用している場合ステージはO(N)となります。 の場合、の場合(すべての項目が同じです)、プリプロセスにはO(N) が、唯一の回答出力はO(1)となり、 ルーチン全体ではO(N)になります。

任意の配列の場合、配列全体をスキャンする必要があるため、O(N)より複雑ではありません。プロセスがはるかに速くなります運がよけれ場合は最後に、配列の項目のための前処理との良好なハッシュ関数の場合の複雑さは

[O(N)..O(N**3)] 

の範囲です。大量のデータを出力する場合は、大きなコレクションを出力します。

0

これを行う方法はありません。あなたが何をしていても、それらの3つの要素を得る必要があるからです。サイズはnC3 = n*(n-1)*(n-2)/6です。いつでもこれを繰り返す必要があります。したがって、複雑さの最小値はO(n^3)になります。 最悪場合

+0

(私の質問で述べたように)私はユニークな順列だけを見ていますか?そのような – PaulW

+0

のセットはその順列[1 2 3]は[3 2 1]と同じです – PaulW

+0

はい、nC3異なる場合が必要です....来る – coderredoc

関連する問題