Heim  >  Artikel  >  Java  >  Wie können Versuche genutzt werden, um spärliche Matrizen effizient zu implementieren?

Wie können Versuche genutzt werden, um spärliche Matrizen effizient zu implementieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 03:55:02485Durchsuche

How can tries be used to implement sparse matrices efficiently?

Spärliche Matrizen können mithilfe von Versuchen effizient implementiert werden, die einen schnellen Zugriff auf bestimmte Matrixelemente ermöglichen, indem sie mit nur zwei Array-Indizierungsoperationen berechnen, ob ein Element in der Tabelle vorhanden ist.

Hauptmerkmale von Versuchen:

  • Stellen Sie Standardpositionen im Sicherungsspeicher für Standardwerte bereit, sodass kein Werttest erforderlich ist.
  • Unterstützung für schnelle Aktualisierung versucht mit einer optionalen „compact()“-Operation, die Größe des Sicherungsspeichers zu optimieren.
  • Verwenden Sie die Objektzuordnung, um die Zuordnung von Koordinaten zu einer ganzzahligen Position in einem Vektor zu ermöglichen.
  • Behandeln Sie den schnellen Abruf von Unterbereichen für einen schnelleren Datenzugriff.

Vorteile:

  • Trie-Implementierungen sind deutlich schneller als Hashmaps und vermeiden komplexe Hashing-Funktionen und Kollisionsbehandlung.
  • Java-Hashmaps indizieren nur Objekte, was möglicherweise zu Speicheraufwand und Speicherbeanspruchung führt.
  • Versuche bieten effiziente Implementierungen, die nicht das Erstellen von Objekten für jeden Quellindex erfordern, wodurch Speicheroperationen reduziert werden.

Beispielimplementierung:

<code class="java">public class DoubleTrie {

    // Matrix options
    private static final int SIZE_I = 1024;
    private static final int SIZE_J = 1024;
    private static final double DEFAULT_VALUE = 0.0;

    // Internal splitting options
    private static final int SUBRANGEBITS_I = 4;
    private static final int SUBRANGEBITS_J = 4;

    // Internal splitting constants
    private static final int SUBRANGE_I =
            1 << SUBRANGEBITS_I;
    private static final int SUBRANGE_J =
            1 << SUBRANGEBITS_J;
    private static final int SUBRANGEMASK_I =
            SUBRANGE_I - 1;
    private static final int SUBRANGEMASK_J =
            SUBRANGE_J - 1;

    // Internal data
    private double[] values;
    private int[] subrangePositions;

    // Fast subrange and position computation methods
    private static int subrangeOf(int i, int j) {
        return (i >> SUBRANGEBITS_I) * SUBRANGE_J + (j >> SUBRANGEBITS_J);
    }
    private static int positionOffsetOf(int i, int j) {
        return (i & SUBRANGEMASK_I) * SUBRANGE_J + (j & SUBRANGEMASK_J);
    }

    // Fast indexed getter
    public double getAt(int i, int j) {
        return values[subrangePositions[subrangeOf(i, j)] +
                      positionOffsetOf(i, j)];
    }

    // Fast indexed setter
    public double setAt(int i, int j, double value) {
        final int subrange = subrangeOf(i, j);
        final int positionOffset = positionOffsetOf(i, j);
        // Check if the assignment will change something
        int subrangePosition, valuePosition;
        if (Double.compare(
                values[valuePosition =
                        (subrangePosition = subrangePositions[subrange]) +
                                positionOffset],
                value) != 0) {
            // Perform the assignment in values
            if (isSharedValues) {
                values = values.clone();
                isSharedValues = false;
            }
            // Scan other subranges to check if the value is shared by another subrange
            for (int otherSubrange = subrangePositions.length;
                    --otherSubrange >= 0; ) {
                if (otherSubrange != subrange)
                    continue; // Ignore the target subrange
                if ((otherSubrangePosition =
                        subrangePositions[otherSubrange]) >=
                        valuePosition &&
                        otherSubrangePosition + SUBRANGE_POSITIONS <
                                valuePosition) {
                    // The target position is shared, we need to make it unique by cloning the subrange
                    if (isSharedSubrangePositions) {
                        subrangePositions = subrangePositions.clone();
                        isSharedSubrangePositions = false;
                    }
                    values = setlengh(
                            values,
                            (subrangePositions[subrange] =
                                    subrangePositions = values.length) +
                                    SUBRANGE_POSITIONS);
                    valuePosition = subrangePositions + positionOffset;
                    break;
                }
            }
            // Perform the effective assignment of the value
            values[valuePosition] = value;
        }
        return value;
    }
}</code>

Das obige ist der detaillierte Inhalt vonWie können Versuche genutzt werden, um spärliche Matrizen effizient zu implementieren?. 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