대규모 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 라이브러리 활용
Intersect()
方法。对于并集运算,使用 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; }
실용 예
100만 개의 요소가 포함된 배열을 고려하고 500만 개의 요소가 포함된 다른 배열과의 교차점 및 합집합을 찾고 싶습니다.
방법 1(해시 테이블) 사용:
Hashes.php 라이브러리 사용(방법 2):
비트 연산 사용(방법 3):
보시다시피 비트별 연산은 이러한 대규모 배열을 처리하는 데 매우 효과적이며 최적의 성능을 제공합니다.
위 내용은 대규모 PHP 배열의 교차 및 합집합을 처리하기 위한 실용적인 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!