phpを使用して、指定した長さのユニークな組み合わせを見つけようとしていますが、2つの同一の値が複数の組み合わせで存在しないことを確認します。私は3つの値のすべてのユニークな組み合わせを検索する場合、例えば、この配列と(3が不可能である場合に2つの値の組み合わせへのフォールバック):組み合わせの複製ペアを除外した配列の値のユニークな組み合わせを見つける
$array = array(
array('1', '2'),
array('3', '4'),
array('5', '6'),
);
一つの可能なセットである123、456、14、 15,16,24,25,26,34,35,36 各番号は常に1回のみ、異なる番号で1回組み合わされることに注意してください。どのような組み合わせでも、重複した番号のペアは表示されません。明確にするために、たとえ123と135がユニークな組み合わせであっても、ペア13が両方で発生するので、これらのうちの1つだけが返されます。主な基準は、すべての数値が最終的にお互いの数でグループ化されることです。最終生成物中
、アレイおよび値の数の数は、同様に、特に大きくなる。これは最も高く評価されるだろう達成するために、任意のヘルプ/コード
$array = array(
array('1', '2', '3', '4', '5', '6', '7', '8'),
array('9', '10', '11', '12', '13', '14', '15', '16'),
array('17', '18', '19', '20', '21', '22', '23', '24'),
array('25', '26', '27', '28', '29', '30', '31')
);
。
更新日:
私はブルートフォースアプローチを採用しました。最初に、私は指定された最大サイズのグループ分けを始め、組み合わせを作成するためにナシのパッケージMath_Combinatoricsを使用しています。このようにして、グループ内の重複するクラスタを取り除くために反復処理を実行するときに、すべての組み合わせを得ることができます。このコードは機能しますが、非常にメモリを消費します。 6のグループで32個の値の配列のすべての組み合わせを生成すると、1.5Gを超えるメモリが使用されます。メモリが足りなくても大きな配列を使えるようにする、より良いアルゴリズムやアプローチがありますか?ここでは、コードの現在の状態は:
require_once 'Combinatorics.php';
$combinatorics = new Math_Combinatorics;
$array = range(1,20,1);
$maxgroup = (6);
$combinations = $combinatorics->combinations($array, $maxgroup);
for($c=$maxgroup-1;$c>1;$c--)
{
$comb = $combinatorics->combinations($array, $c);
$combinations = array_merge($combinations, $comb);
$comb = null;
}
for($j=0;$j<sizeof($combinations);$j++)
{
for($i=sizeof($combinations)-1;$i>=$j+1;$i--)
{
$diff = array_intersect($combinations[$j], $combinations[$i]);
if(count($diff)>1)
{
unset($combinations[$i]);
}
}
$combinations = array_values($combinations);
}
print_r($combinations);
ありがとうございました。入力に重複した番号がないことを正しく仮定します。構造は簡単に単一の配列として開始することができます、私は多次元配列が容易になると考えていた。私の目的のためには、その配列に100以上の値があることは決してありません。私の最大の問題は、ユニークな組み合わせを見つけるためのアルゴリズムです。私はそれを達成する方法について私の頭をかなり包むことができません。私はこれで本当に新しいです。 – user1181580