0

検出してグループ化する必要のある重複を含む1,000,000を超える行があります。

グループ化は次のようになります(配列内):

0 -> 4123
3 -> 344,98222
10 -> 12,333423
12 -> 756
15 -> 1,10,30400

私がする必要があるのは、このリストを調べて、重複の各グループにグループ番号を割り当てることです。ここでの問題は、あるキーが別のキーにグループ化される可能性があることですが、このキーはグループ化されておらず、別のキーに再びグループ化されています。これらはすべて同じグループに属している必要があります。

上記の例を使用すると、10が12にグループ化され、12が756にグループ化され、15が1,10と30400にグループ化されていることがわかります。これは、10,12,333423,756,15,1,30400すべてを意味します。同じグループに属する必要があります!

したがって、これらすべてのグループに数値を適用するための効率的な方法が必要です。つまり$group[10]=1; $group[12]=1; $group[333423]=1;、これらすべて、およびすべてのグループ化のためです。

行が非常に多いため、これを行うための効率的な方法を見つける必要があります。それらは実際には一度だけループすることができます。私はすべてをチェックする力任せでこれを実行しようとしましたが、1,000,0000 * 1,000,0000を繰り返す必要がある場合、計算が多すぎるため、スクリプトが終了することはありません。

これはすべてPHPであり、すべてが配列になっています。必要がないので、現時点ではMySQLデータベースにはありません。

アイデア?

アップデート

私はそれを自分で理解しました、私の答えを見てください。

4

1 に答える 1

0

私はそれを考え出した:

$test[0]=array(4123);
$test[3]=array(344,98222);
$test[10]=array(12,333423);
$test[12]=array(756);
$test[15]=array(1,10,30400);

$ongroup=1;
$assigned=array();
$group=array();
$idlist=array_keys($test);
foreach($idlist as $id)
    {
    if (!isset($group[$id]))
        {
        $group[$id]=$ongroup;
        $assigned[$ongroup][0]=$id;
        $ongroup++;
        }
    foreach($test[$id] as $val)
        {
        if (!isset($group[$val])) {$group[$val]=$group[$id]; $assigned[$group[$id]][]=$val;}
        else
            {
            foreach($assigned[$group[$val]] as $val2)
                {
                $group[$val2]=$group[$id];
                $assigned[$group[$id]][]=$val2;
                }
            unset($assigned[$group[$val]]);
            $group[$val]=$group[$id];
            $assigned[$group[$id]][]=$val;
            }
        }
    }

foreach($group as $id => $val)
echo $id." = $val \n";

結果:

0 = 1
4123 = 1
3 = 2
344 = 2
98222 = 2
10 = 4
12 = 4
333423 = 4
756 = 4
15 = 4
1 = 4
30400 = 4
于 2013-02-25T07:07:39.577 に答える