2012-02-01 10 views
3

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); 

答えて

0

構造だけで利用可能な数字を曖昧にしているので、あなたは最初にネストされた配列を展開する必要があります。私は親切にすると、あなたのためにそれをやる:

$numbers = [] 
foreach ($arrar as $subarr) { 
    foreach ($subarr as $num) { 
     $numbers[] = $num; 
    } 
} 

私は入力のいずれかの番号の重複がないと仮定しています。

次に、一意の組み合わせを見つけるアルゴリズムを実行するとします。配列がこのように小さい場合、再帰的解決法も機能します。組み合わせのすべての組み合わせをすべて試す必要はありません。

+0

ありがとうございました。入力に重複した番号がないことを正しく仮定します。構造は簡単に単一の配列として開始することができます、私は多次元配列が容易になると考えていた。私の目的のためには、その配列に100以上の値があることは決してありません。私の最大の問題は、ユニークな組み合わせを見つけるためのアルゴリズムです。私はそれを達成する方法について私の頭をかなり包むことができません。私はこれで本当に新しいです。 – user1181580

関連する問題