Jump to content

Hash consing

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by 194.138.39.56 (talk) at 15:04, 7 November 2011. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

In computer science, particularly in functional programming, hash consing is a technique used to share values that are structurally equal. The term hash consing originates from implementations of Lisp[1] that attempt to reuse cons cells that have been constructed before, avoiding the penalty of memory allocation. Hash consing is most commonly implemented with hash tables storing weak references that may be garbage-collected when the data stored therein contains no references from outside the table.[2][3] Hash consing has been shown to give dramatic performance improvements—both space and time—for symbolic and dynamic programming algorithms.[citation needed]

In other communities a similar idea is known as the Flyweight pattern. When applied to strings this technique is also known as string interning.

Examples

Scheme

Simple, not very efficient, but suitable for demonstration of the concept implementation of a memoizer by means of hash table and weak references in 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)))))

References

  1. ^ Goto, Eiichi (1974). "Monocopy and associative algorithms in extended Lisp" (Document). Tokyo: University of Tokyo Technical Report TR 74-03.
  2. ^ Allen, John (1978). Anatomy of Lisp. McGraw Hill. ISBN 007001115X.
  3. ^ Fillâtre, Jean-Christophe; Conchon, Sylvain (2006). "Workshop on ML" (Document). ACM. {{cite document}}: Unknown parameter |contribution= ignored (help)

Further reading