Heim  >  Artikel  >  Backend-Entwicklung  >  Praktische Lösung für den Umgang mit Schnittmengen und Vereinigungen großer PHP-Arrays

Praktische Lösung für den Umgang mit Schnittmengen und Vereinigungen großer PHP-Arrays

WBOY
WBOYOriginal
2024-05-01 11:27:02710Durchsuche

Praktische Lösung für den Umgang mit Schnittmengen und Vereinigungen großer PHP-Arrays

Eine praktische Lösung für die Verarbeitung großer PHP-Array-Schnitt- und Vereinigungsoperationen

Einführung

Bei der Verarbeitung großer Datenmengen ist es häufig erforderlich, Array-Schnitt- und Vereinigungsoperationen durchzuführen. Bei großen Arrays mit Millionen oder Milliarden von Elementen können die Standard-PHP-Funktionen jedoch ineffizient sein oder unter Speicherproblemen leiden. In diesem Artikel werden mehrere praktische Lösungen vorgestellt, um die Leistung bei der Arbeit mit großen Arrays deutlich zu verbessern.

Methode 1: Hash-Tabelle verwenden

  • Konvertieren Sie ein Array in eine Hash-Tabelle und verwenden Sie Elemente als Schlüssel.
  • Durchlaufen Sie ein anderes Array und prüfen Sie, ob der Schlüssel in der Hash-Tabelle vorhanden ist. Falls vorhanden, befindet sich das Element im Schnittpunkt.
  • Zeitliche Komplexität: O(n)

Codebeispiel:

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

$hash = array_flip($arr1);

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

Methode 2: Verwendung der Hashes.php-Bibliothek

  • Verwenden Sie eine Bibliothek wie Hashes.php, die eine effiziente Hashes-Tabelle bereitstellt erkannte.
  • Für Kreuzungsoperationen verwenden Sie die Intersect() 方法。对于并集运算,使用 Union()-Methode.
  • Zeitkomplexität: O(n)

Codebeispiel:

use Hashes\Hash;

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

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

Methode 3: Verwenden Sie bitweise Operationen

  • , um jede Zahl im Array in eine bitweise Bitmap umzuwandeln.
  • Der Schnittpunkt kann durch UND-Verknüpfung zweier Bitmaps ermittelt werden.
  • Die Vereinigung kann durch ODER-Verknüpfung zweier Bitmaps erhalten werden.
  • Zeitliche Komplexität: O(n), wobei n die Anzahl der Ziffern in der größten Zahl im Array ist.

Codebeispiel:

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

Praktisches Beispiel

Betrachten wir ein Array mit einer Million Elementen und wir möchten seinen Schnittpunkt und seine Vereinigung mit einem anderen Array mit fünf Millionen Elementen finden.

Mit Methode 1 (Hash-Tabelle):

  • Die Verarbeitung der Schnittmenge dauert 4,5 Sekunden.
  • Die Verarbeitung der Vereinigung dauert 4,12 Sekunden.

Mit der Hashes.php-Bibliothek (Methode 2):

  • Die Verarbeitung der Schnittmenge dauert 2,8 Sekunden.
  • Es dauert 2,45 Sekunden, um die Vereinigung zu verarbeiten

Verwendung der bitweisen Operation (Methode 3):

  • Die Verarbeitung der Schnittmenge dauert 1,2 Sekunden
  • Die Verarbeitung der Vereinigung dauert 1,08 Sekunden

Wie Sie sehen können, ist die bitweise Operation Sehr effektiv bei der Verarbeitung eines so großen Arrays und bietet optimale Leistung.

Das obige ist der detaillierte Inhalt vonPraktische Lösung für den Umgang mit Schnittmengen und Vereinigungen großer PHP-Arrays. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn