#大規模な PHP 配列の交差と共用体を処理するための実用的なソリューション
はじめに
大きなデータを扱う場合、多くの場合、配列の交差演算と結合演算を実行する必要があります。ただし、数百万または数十億の要素を持つ大規模な配列の場合、デフォルトの PHP 関数は非効率的であるか、メモリの問題が発生する可能性があります。この記事では、大規模な配列を操作する際のパフォーマンスを大幅に向上させるための実用的なソリューションをいくつか紹介します。方法 1: ハッシュ テーブルを使用する
コード例:
$arr1 = range(1, 1000000); $arr2 = range(500001, 1500000); $hash = array_flip($arr1); $intersection = array_keys(array_intersect_key($hash, $arr2));
方法 2: Hashes.php ライブラリを使用する
メソッドを使用します。ユニオン演算の場合は、
Union() メソッドを使用します。
コード例:
use Hashes\Hash; $map = new Hash(); foreach ($arr1 as $val) { $map->add($val); } $intersection = $map->intersect($arr2); $union = $map->union($arr2);
方法 3: ビット単位の演算を使用する
コード例:
function bitInterset($arr1, $arr2) { $max = max(max($arr1), max($arr2)); $bitSize = 32; // 如果 max > (2^32 - 1),可以调整 bitSize $bitmap1 = array_fill(0, $bitSize, 0); $bitmap2 = array_fill(0, $bitSize, 0); foreach ($arr1 as $num) { $bitmap1[$num >> 5] |= (1 << ($num & 31)); } foreach ($arr2 as $num) { $bitmap2[$num >> 5] |= (1 << ($num & 31)); } $intersection = []; for ($i = 0; $i < $bitSize; $i++) { $mask = $bitmap1[$i] & $bitmap2[$i]; for ($j = 0; $j < 32; $j++) { if (($mask >> $j) & 1) { $intersection[] = ($i << 5) | $j; } } } return $intersection; }
実際のケース
1 億要素を含む配列を考えてみましょう。 500 万の要素を含む別の配列との交差と結合を見つけたいと考えています。 方法 1 (ハッシュ テーブル) の使用:以上が大規模な PHP 配列の交差と結合を処理するための実用的なソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。