Hash consing - Hash consing - Wikipedia
v počítačová věda, zejména v Funkcionální programování, hash consing je technika používaná ke sdílení hodnot, které jsou strukturálně stejné. Termín hash consing pochází z implementací Lisp[1][2] ten pokus o opětovné použití nevýhody buňky, které byly postaveny dříve, vyhnout se trestu alokace paměti. Hash consing je nejčastěji implementován s hash tabulky skladování slabé reference to může být sbírat odpadky pokud v nich uložená data neobsahují č Reference zpoza stolu.[3][4] Ukázalo se, že hash consing dramaticky vylepšuje výkon - jak prostor, tak čas symbolický a dynamické programování algoritmy.[Citace je zapotřebí ] Zajímavou vlastností hash consing je, že dvě struktury mohou být testovány na rovnost v konstantním čase, což může zlepšit účinnost rozděl a panuj algoritmy, když datové sady obsahují překrývající se bloky.[5]
Příklad
Jednoduché, ne příliš efektivní, ale vhodné k předvedení implementace konceptu a memoizer pomocí hash tabulky a slabých odkazů v Systém:
;; slabý hash;;(vyžadovat „hash tabulka)(definovat (udělat slabý stůl . args) (aplikovat make-hash-tabulka args))(definovat (slabý stůl! stůl klíč data) (nechat ((w (hash-table-ref stůl klíč #F))) (-li w (vektorová sada! w 0 data) (nechat ((w (udělat slabý vektor 1))) (vektorová sada! w 0 data) (hash-table-set! stůl klíč w)))))(definovat (slabý stolní ref stůl klíč) (nechat ((w (hash-table-ref stůl klíč #F))) (-li w (vektorový ref w 0) #F)));; memoizer factory: pro daný postup (bez vedlejších účinků),;; vrací proceduru, která provádí stejné memoizace některých výsledků;; ve smyslu rovnosti? na celý seznam arg;;(definovat (make-slabý memoizer proc) (nechat ((mezipaměti (udělat slabý stůl rovnat se?))) (lambda args (nechat ((X (slabý stolní ref mezipaměti args))) (-li (BWP-objekt? X) (nechat ((r (aplikovat proc args))) (slabý stůl! mezipaměti args r) r) X)))))
Viz také
Reference
- ^ Deutsch, Laurence Peter (1973). "Interaktivní programový ověřovatel". Palo Alto: Výzkumné centrum Xerox Palo Alto Terhnical Report CSL-73-1. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Jdi, Eiichi (1974). "Monokopie a asociativní algoritmy v rozšířeném Lispu". Tokio: Tokijská univerzita Technická zpráva TR 74-03. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Allen, John (1978). Anatomy of Lisp. McGraw Hill. ISBN 0-07-001115-X.
- ^ Fillâtre, Jean-Christophe; Conchon, Sylvain (2006). "Typově bezpečný modulární Hash-Consing". Workshop o ML. ACM.
- ^ Liljenzin, Olle (2013). "Confluently Persistent Sets and Maps". arXiv:1301.3388. Bibcode:2013arXiv1301.3388L. Citovat deník vyžaduje
| deník =
(Pomoc)
Další čtení
- Ershov, A.P. (1958). "O programování aritmetických operací". Komunikace ACM. 1 (8): 3–6. doi:10.1145/368892.368907.
- Jean Goubault. Implementace funkčních jazyků s rychlou rovností, sadami a mapami: cvičení v hashování. v Journées Francophones des Langages Applicatifs (JFLA’93), strany 222–238, Annecy, únor 1993.
Tento počítačová věda článek je a pahýl. Wikipedii můžete pomoci pomocí rozšiřovat to. |