Rumah >pembangunan bahagian belakang >tutorial php >Penyelesaian praktikal untuk mengendalikan persimpangan dan penyatuan tatasusunan PHP berskala besar

Penyelesaian praktikal untuk mengendalikan persimpangan dan penyatuan tatasusunan PHP berskala besar

WBOY
WBOYasal
2024-05-01 11:27:02719semak imbas

Penyelesaian praktikal untuk mengendalikan persimpangan dan penyatuan tatasusunan PHP berskala besar

Penyelesaian praktikal untuk memproses persilangan dan penyatuan tatasusunan PHP berskala besar

Pengenalan

Apabila memproses data yang besar, selalunya perlu melakukan operasi persimpangan tatasusunan dan kesatuan. Tetapi untuk tatasusunan besar dengan berjuta-juta atau berbilion-bilion elemen, fungsi PHP lalai mungkin tidak cekap atau mengalami masalah ingatan. Artikel ini akan memperkenalkan beberapa penyelesaian praktikal untuk meningkatkan prestasi dengan ketara apabila bekerja dengan tatasusunan yang besar.

Kaedah 1: Menggunakan Jadual Hash

  • Tukar tatasusunan kepada jadual cincang, menggunakan elemen sebagai kunci.
  • Lelaran pada tatasusunan lain dan semak sama ada kunci wujud dalam jadual cincang. Jika ada, elemen itu berada di persimpangan.
  • Kerumitan masa: O(n)

Contoh kod:

$arr1 = range(1, 1000000);
$arr2 = range(500001, 1500000);

$hash = array_flip($arr1);

$intersection = array_keys(array_intersect_key($hash, $arr2));

Kaedah 2: Menggunakan perpustakaan Hashes.php

  • Gunakan perpustakaan seperti Hashes ialah Hash., yang menyediakan jadual yang cekap disedari.
  • Untuk operasi persimpangan, gunakan kaedah Intersect() 方法。对于并集运算,使用 Union().
  • Kerumitan masa: O(n)

Contoh kod:

use Hashes\Hash;

$map = new Hash();
foreach ($arr1 as $val) {
    $map->add($val);
}

$intersection = $map->intersect($arr2);
$union = $map->union($arr2);

Kaedah 3: Gunakan operasi bitwise

  • untuk menukar setiap nombor dalam tatasusunan kepada peta bit bitwise.
  • Persimpangan boleh didapati dengan DANing dua peta bit.
  • Kesatuan boleh diperolehi dengan ORing dua peta bit.
  • Kerumitan masa: O(n), dengan n ialah bilangan digit dalam nombor terbesar dalam tatasusunan.

Contoh Kod:

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

Contoh Praktikal

Mari kita pertimbangkan tatasusunan yang mengandungi satu juta elemen dan kami ingin mencari persilangan dan penyatuannya dengan tatasusunan lain yang mengandungi lima juta elemen.

Menggunakan kaedah 1 (jadual cincang):

  • Memproses persimpangan mengambil masa 4.5 saat
  • Kesatuan pemprosesan mengambil masa 4.12 saat

Menggunakan perpustakaan Hashes.php (Kaedah 2. Proses persilangan

    2):
  • Perlu 2.45 saat untuk memproses kesatuan

Menggunakan operasi bitwise (Kaedah 3):

  • Ia mengambil masa 1.2 saat untuk memproses persimpangan
  • Ia mengambil masa 1.08 saat untuk memproses kesatuan

yang anda boleh lihat, operasi bitAswise anda boleh lihat, sangat berkesan dalam memproses susunan yang begitu besar memberikan prestasi yang optimum.

Atas ialah kandungan terperinci Penyelesaian praktikal untuk mengendalikan persimpangan dan penyatuan tatasusunan PHP berskala besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn