«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать эффективную двунаправленную хеш-таблицу в Python?

Как реализовать эффективную двунаправленную хеш-таблицу в Python?

Опубликовано 17 ноября 2024 г.
Просматривать:553

How to Implement an Efficient Bidirectional Hash Table in Python?

Реализация эффективной двунаправленной хеш-таблицы

Двунаправленная хеш-таблица позволяет выполнять поиск как по принципу «ключ-значение», так и по принципу «значение-ключ». Хотя встроенная структура данных dict в Python превосходно справляется с поиском по принципу «ключ-значение», она не обеспечивает эффективный поиск значений по ключам.

Эффективным методом реализации двунаправленной хеш-таблицы является использование класса это расширяет стандартный dict. Этот класс с именем bidict поддерживает обратный каталог, который автоматически обновляется при любых изменениях в обычном dict.

Реализация кода:

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)

Основные особенности:

  • Инверсный каталог (bd.inverse) — это словарь, который отображает значения в список ключей с этим значением.
  • Обратный каталог автоматически обновляется при изменении бидикта.
  • В отличие от некоторых реализации bidict, этот класс позволяет нескольким ключам иметь одно и то же значение.

Пример использования:

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']}
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3