Maison  >  Article  >  Java  >  Comment les tentatives peuvent-elles être utilisées pour implémenter efficacement des matrices clairsemées ?

Comment les tentatives peuvent-elles être utilisées pour implémenter efficacement des matrices clairsemées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 03:55:02485parcourir

How can tries be used to implement sparse matrices efficiently?

Les matrices clairsemées peuvent être implémentées efficacement à l'aide d'essais, qui fournissent un accès rapide à des éléments matriciels spécifiques en calculant si un élément est présent dans la table à l'aide de seulement deux opérations d'indexation de tableau.

Principales caractéristiques des essais :

  • Fournir des positions par défaut dans le magasin de sauvegarde pour les valeurs par défaut, éliminant ainsi le besoin de tests de valeur.
  • Support à mise à jour rapide essaie avec une opération facultative "compact()" d'optimiser la taille du magasin de sauvegarde.
  • Utiliser le mappage d'objets, permettant de mapper les coordonnées dans une position entière dans un vecteur.
  • Gérer la récupération rapide des sous-plages pour un accès plus rapide aux données.

Avantages :

  • Les implémentations de Trie sont nettement plus rapides que les hashmaps, évitant les fonctions de hachage complexes et la gestion des collisions.
  • Les hashmaps Java indexent uniquement les objets, ce qui peut entraîner une surcharge de mémoire et un stress lié au garbage collection.
  • Les essais fournissent des implémentations efficaces qui ne nécessitent pas de création d'objets pour chaque index source, réduisant ainsi les opérations de mémoire.

Exemple de mise en œuvre :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn