1

こんにちは私は非常に多くの値を比較することになっています、私は配列を使用しましたが、メモリが不足しています。配列の値は約5000000であり、すべての値に対して再び5000000のループが実行されます。つまり、5000000x5000000サイクルが実行されます。

私がしているのは、単に2つのループを実行することです。このプログラムはメモリが原因で停止するため、これを行うための効率的な方法を教えてください。

for($k=0;$k<sizeof($pid);$k++) // size of $pid = 5000000
{
$out =0;
        for ($m=0;$m<sizeof($outid);$m++) // size of $out 5000000
        {
                    if ($pid[$k] == $out[$m])
                    {
                            $out ++;
                    }

        }
}
4

3 に答える 3

3

両方のリストを並べ替えることができれば、最初のリストのインデックスと 2 番目のリストのインデックスを持つことができるため、各リストのすべてを 1 回見るだけで済みます。最初のインデックスの要素が 2 番目のインデックスの要素より小さい場合は、最初のインデックスを増やします。それ以外の場合は、2 番目のインデックスを増やします。次に、それらを通過するときに、いくつの要素が等しいかを追跡します。

于 2011-04-08T19:13:14.680 に答える
1

アルゴリズムの複雑さは、ほとんどの VB および PHP プログラマーにとって複雑な問題になる可能性があります。これは些細なことではありません。

アプローチ1

あなたのアプローチを使用する方法を見つけたとしましょうO(n^2)。あなたのコンピューターが 1 秒間に 1000000 回の比較を実行できるとしましょう。今ループを開始すると2:04:45 pm EEST | Wednesday, June 23, 2010、ループは で終了し6:58:05 am EET | Monday, January 23, 2012ます。

私は PHP の専門家ではありませんが、ページに提供する必要がある時間制限があるか、ページ タイムアウト例外がスローされることは確かです。その制限は 30 秒、90 秒、または何を定義してもかまいませんが、このループに必要な時間制限はばかげています。

アプローチ 2

配列を並べ替えることにしました。このアクションはO(n log n)両方の配列に対して行われO(n log n)、比較されます。これにより、滞在時間の合計は になり3 * O(n log n)ます100.5 seconds。または33.49 seconds、配列が事前に並べ替えられている場合。

私があなただったら、アプローチ 2を選びます。

配列をソートする方法がわからない場合は、新しい質問をしてデータを説明してください。つまり、データ インスタンスのカスタム コンパレータが必要です。比較するにはO(n log n)、線形比較を使用できませんが、通常は言語のデフォルト ライブラリに組み込まれている効率的な深い比較関数が必要です。見つからなかったり、使い方がわからない場合は、別の質問をしてください。

于 2011-04-08T19:54:09.050 に答える
0

array-intersect 関数http://ua.php.net/manual/en/function.array-intersect.phpを試すことができます。これはC ベースであり、より最適化された動作をするはずです。

于 2011-04-08T19:27:02.530 に答える