Maison > Java > javaDidacticiel > 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
Libérer: 2024-11-06 03:55:02
original
673 Les gens l'ont consulté

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>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal