Jump to content

Хеширование

В информатике , особенно в функциональном программировании , хеширование — это метод, используемый для совместного использования значений, которые структурно равны. Когда создается значение, например cons -ячейка, метод проверяет, было ли такое значение создано ранее, и если да, то повторно использует предыдущее значение, избегая нового выделения памяти . Полезным свойством хэш-консинга является то, что две структуры можно проверить на равенство за постоянное время посредством равенства указателей, что, в свою очередь, может повысить эффективность алгоритмов «разделяй и властвуй», когда наборы данных содержат перекрывающиеся блоки. [1] Было показано, что хеширование дает значительное улучшение производительности — как пространства, так и времени — для символьного и динамического программирования . алгоритмов [ нужна ссылка ]

Консервирование хеширования чаще всего реализуется с помощью хеш-таблиц, в которых хранятся слабые ссылки , которые могут быть удалены сборщиком мусора , если хранящиеся в них данные не содержат ссылок извне таблицы. [2] [3]

Просто, не очень эффективно, но подходит для демонстрации реализации концепции мемоайзера посредством хеш-таблицы и слабых ссылок в Scheme :

;; weak hashes
;;
(require 'hash-table)

(define (make-weak-table . args)
  (apply make-hash-table args))

(define (weak-table-set! table key data)
  (let ((w (hash-table-ref table key #f)))
    (if w
        (vector-set! w 0 data)
      (let ((w (make-weak-vector 1)))
        (vector-set! w 0 data)
        (hash-table-set! table key w)))))

(define (weak-table-ref table key)
  (let ((w (hash-table-ref table key #f)))
    (if w
        (vector-ref w 0)
      #f)))

;; memoizer factory: for given (side-effect-free) procedure,
;; return a procedure which does the same memoizing some of results
;; in the sense of equal? on the whole list of args
;;
(define (make-weak-memoizer proc)
  (let ((cache (make-weak-table equal?)))
    (lambda args
      (let ((x (weak-table-ref cache args)))
        (if (bwp-object? x)
            (let ((r (apply proc args)))
              (weak-table-set! cache args r)
              r)
          x)))))

Методика компиляции хэш-консенса была предложена А. П. Ершовым в 1958 году. [4] [5] Термин «хэш-консинг» возник из реализаций Lisp в 1970-х годах. [6] [7]

См. также

[ редактировать ]
  1. ^ Лильензин, Олле (2013). «Слитно устойчивые множества и карты». arXiv : 1301.3388 [ cs.DS ].
  2. ^ Аллен, Джон (1978). Анатомия Лиспа . МакГроу Хилл . ISBN  0-07-001115-Х .
  3. ^ Филлиатр, Жан-Кристоф; Коншон, Сильвен (2006). «Типобезопасное модульное хэширование». Семинар по ML . АКМ .
  4. ^ Ершов А.П. (1 августа 1958 г.). «О программировании арифметических операций» . Коммуникации АКМ . 1 (8): 3–6. дои : 10.1145/368892.368907 . ISSN   0001-0782 . S2CID   15986378 .
  5. ^ «Совместное использование и устранение общих подвыражений в компиляции EDSL» . okmij.org . Проверено 27 апреля 2023 г.
  6. ^ Дойч, Лоуренс Питер (1973). Интерактивный верификатор программы (PDF) (доктор философии). Пало-Альто: исследовательского центра Xerox Пало-Альто CSL-73-1. Технический отчет
  7. ^ Гото, Эйичи (1974). Монокопия и ассоциативные алгоритмы в расширенном Lisp (PDF) (Технический отчет). Токио: Технический отчет Токийского университета TR 74-03.

Дальнейшее чтение

[ редактировать ]


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 19c7fed6842a26d28d43b6780344860a__1691924520
URL1:https://arc.ask3.ru/arc/aa/19/0a/19c7fed6842a26d28d43b6780344860a.html
Заголовок, (Title) документа по адресу, URL1:
Hash consing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)