Comment implémenter une table de hachage bidirectionnelle efficace en Python ?

Patricia Arquette
Libérer: 2024-10-27 20:57:02
original
988 Les gens l'ont consulté

How to Implement an Efficient Bidirectional Hash Table in Python?

Mise en œuvre d'une table de hachage bidirectionnelle efficace

Une table de hachage bidirectionnelle permet à la fois des recherches clé-valeur et valeur-clé. Bien que la structure de données dict intégrée de Python excelle dans les recherches clé-valeur, elle n'offre pas d'extractions valeur-clé efficaces.

Une méthode efficace pour implémenter une table de hachage bidirectionnelle consiste à utiliser une classe cela étend le dict standard. Cette classe, nommée bidict, maintient un répertoire inverse qui se met automatiquement à jour avec toute modification apportée au dict normal.

Implémentation du code :

<code class="python">class bidict(dict):
    def __init__(self, *args, **kwargs):
        super(bidict, self).__init__(*args, **kwargs)
        self.inverse = {}
        for key, value in self.items():
            self.inverse.setdefault(value, []).append(key) 

    def __setitem__(self, key, value):
        if key in self:
            self.inverse[self[key]].remove(key) 
        super(bidict, self).__setitem__(key, value)
        self.inverse.setdefault(value, []).append(key)        

    def __delitem__(self, key):
        self.inverse.setdefault(self[key], []).remove(key)
        if self[key] in self.inverse and not self.inverse[self[key]]: 
            del self.inverse[self[key]]
        super(bidict, self).__delitem__(key)</code>
Copier après la connexion

Principales caractéristiques :

  • Le répertoire inverse (bd.inverse) est un dictionnaire qui mappe les valeurs à une liste de clés avec cette valeur.
  • Le répertoire inverse se met automatiquement à jour lorsque le bidict est modifié.
  • Contrairement à certaines implémentations de Bidict, cette classe permet à plusieurs clés d'avoir la même valeur.

Exemple d'utilisation :

<code class="python">bd = bidict({'a': 1, 'b': 2})  
print(bd)                     # {'a': 1, 'b': 2}                 
print(bd.inverse)             # {1: ['a'], 2: ['b']}
bd['c'] = 1                   # Now two keys have the same value (= 1)
print(bd)                     # {'a': 1, 'c': 1, 'b': 2}
print(bd.inverse)             # {1: ['a', 'c'], 2: ['b']}
del bd['c']
print(bd)                     # {'a': 1, 'b': 2}
print(bd.inverse)             # {1: ['a'], 2: ['b']}
del bd['a']
print(bd)                     # {'b': 2}
print(bd.inverse)             # {2: ['b']}
bd['b'] = 3
print(bd)                     # {'b': 3}
print(bd.inverse)             # {2: [], 3: ['b']}</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!

source:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!