drswinghead

主站网址

导航

CLISP语言中的哈希表

  1. 概要

    hash表是一种非常重要的数据结构,用于存储键/值对. 可方便的向hash表中加入条目,使用键值取得条目. 根据运行效率的不同, CLISP中有三种hash表类型: 标准hash表,快速hash表和稳定hash表. 它们的区别是:

    对于快速hash表,垃圾回收器会便利其中的哈希值无效,被错误的回收了(除非所有的key值都是即对象,如常量字符串,数字等). 对稳定hash表,垃圾绝不会对其进行错误回收,因此key值可以是任何CLISP对象. 使用的时候注意,一般对生命周期短的hash表可以考虑使用快速hash表.

  2. hash表操作函数
    1. make-hash-table 创建一个hash表

      (MAKE-HASH-TABLE &KEY :TEST :INITIAL-CONTENTS :SIZE

      :REHASH-SIZE :REHASH-THRESHOLD :WARN-IF-NEEDS-REHASH-AFTER-GC :WEAK)

      :TEST 可选参数可以为EXT:FASTHASH-EQ, STABLEHASH-EQ,分别表示创建快速hash表和稳定hash表. :INITIAL-CONTENTS 初始化值 :SIZE hash表大小

    2. gethash 取出一条

      (gethash key hash-table)

    3. remhash 删除一条,remove from hash的意思

      (remhash key hash-table)

    4. clrhash 清空hash表,执行这个函数后,hash表中的元素个数为0,但大小不一定为0.

      (clrhash hash-table)

    5. hash-table-count hash表中的元素个数
    6. hash-table-size hash表的大小
    7. hash-table-p 检测一个对象是否是hash表.

      (hash-table-p object)

      CL> (hash-table-p (make-hash-table)) T

      CL> (hash-table-p 123456) NIL

      CL> (hash-table-p "abcd") NIL

    8. sxhash 返回一个对象的hash 值.

      CL> (sxhash 123456) 3950784

    9. hash-table-test 检测hash表使用哪种key值比较方式.

      可能的比较方式有:

      EXT:FASTHASH-EQ EXT:FASTHASH-EQUAL

      EXT:STABLEHASH-EQ EXT:STABLEHASH-EQUAL

      EXT:FASTHASH-EQL EQUALP

      EXT:STABLEHASH-EQL

  3. 遍历hash表中的元素

    宏 DOHASH , 与DOLIST比较类似.

    (EXT:DOHASH (key-var value-var hash-table-form [resultform])

    key-var 遍历过程中存储key的变量.

    value-var 遍历过程中存储value的变量.

    hash-table-form 表示一个hash表对象

    resultform 这个语句的值作为DOHASH表达式的值返回.

posted on 2010-06-20 08:35  drswinghead  阅读(167)  评论(0编辑  收藏  举报