長さがN
の配列がM
の異なるオブジェクト(M < N
)の場合、これらのオブジェクトの一部がN_i ... N_M
回繰り返されるとしましょう。私はすべての可能性のあるユニークなの配列の要素の配置(のような、配置)を見つける前に並べ替えの完全なリスト(時間とメモリの両方の制約の両方)を事前に計算しないでください。もちろんおそらく繰り返す配列要素の一意の順列を返します。
、素朴なソリューションは、すべての可能な順列を生成するperms
を使用することで、その後、独自のものを選択します:
A = [1, 1, 2];
all_perms = perms(A)
% all_perms =
% 2 1 1
% 2 1 1
% 1 2 1
% 1 1 2
% 1 2 1
% 1 1 2
unique_perms = unique(all_perms, 'rows')
% unique_perms =
% 1 1 2
% 1 2 1
% 2 1 1
が、これはすべてN!
順列、代わりにちょうどN!/(N_1! * N_2! * ... * N_M!)
を生成します。 。 N = 3
の場合、これはメモリ消費やタイミングにほとんど影響を与えませんが、N
が増加し、ユニークな要素の数が減少すると、その差は大きくなります。だから、:
は中間すべて順列を維持せずに、非個別のオブジェクトを含む配列のすべてのユニークな順列をリストアップする(うまくいけば内蔵)方法はありますか?以下
ニース!それは確かに他の方法よりも速いです。私はそのスレッドを見ましたが、私はこの解決策を見落とさなければならないでしょう。残念ながら私はnchoosek置換関数をコンパイルできませんが、これはAskUbuntu上でより良いスレッドを作成します:) – UJIN