📜  LISP-哈希表(1)

📅  最后修改于: 2023-12-03 14:44:00.844000             🧑  作者: Mango

LISP 哈希表

LISP 哈希表是一种用于存储键值对的数据结构,它可以快速地查找和访问对应的数据项。

什么是哈希表?

哈希表是一种根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过哈希函数映射到数组索引上,从而实现快速访问这些数据项。

哈希函数

哈希函数是哈希表中最重要的部分,因为它决定了键和值之间的映射关系。一般来说,哈希函数会在输入的键之上执行某种算法以生成一个散列值,然后将散列值映射到相应的数组索引上。

在 LISP 中,可以使用 sxhash 函数来生成哈希值。它能够返回一个整型数值来表示输入的对象的哈希码。

(sxhash 'hello-world) ; => 206655749
(sxhash 42) ; => 42

除了 sxhash 函数,你也可以自定义自己的哈希函数来根据特定的需求计算哈希值。

实现哈希表

在 LISP 中,哈希表可以通过 make-hash-table 函数来创建。这个函数可以接受多个关键字参数,例如 testsizerehash-size 等等,用于指定哈希表的行为和特性。

(make-hash-table) ; 创建一个默认的哈希表

在一个 LISP 哈希表上,你可以使用许多函数来进行增删改查操作。下面是一些常用的函数:

赋值操作
  • (setf (gethash key table) value)

    将指定的键值对增加到哈希表中,如果键已经存在,将只更新对应的值。

    (setf ht (make-hash-table))
    (setf (gethash 'name ht) "Alice")
    (setf (gethash 'age ht) 30)
    (setf (gethash 'name ht) "Bob") ; 更新 'name' 的值
    
  • (setf (gethash key table default-value) value)

    将指定的键值对增加到哈希表中,如果键已经存在,将只更新对应的值。如果键不存在,将创建一个新的键值对并且使用 default-value 作为默认值。

    (setf ht (make-hash-table))
    (setf (gethash 'name ht "unknown") "Alice")
    (setf (gethash 'age ht 0) 30)
    (setf (gethash 'gender ht "unknown") "Female") ; 增加新的键值对
    
获取操作
  • (gethash key table &optional default-value)

    获取指定键对应的值。如果键不存在,将返回 default-value 或者 nil

    (setf ht (make-hash-table))
    (setf (gethash 'name ht) "Alice")
    (gethash 'name ht) ; => "Alice"
    (gethash 'age ht) ; => nil
    (gethash 'age ht 0) ; => 0
    
  • (maphash function table)

    调用 function 函数并将哈希表中的每个键值对作为参数传递给它。

    (setf ht (make-hash-table))
    (setf (gethash 'name ht) "Alice")
    (setf (gethash 'age ht) 30)
    (maphash (lambda (key value) (print (list key value))) ht)
    ; 输出:
    ; (NAME "Alice")
    ; (AGE 30)
    
删除操作
  • (remhash key table)

    删除哈希表中指定的键值对。

    (setf ht (make-hash-table))
    (setf (gethash 'name ht) "Alice")
    (remhash 'name ht)
    (gethash 'name ht) ; => nil
    
结语

LISP 哈希表是一种非常常用的数据结构,它可以帮助你存储和访问大量的数据项。了解 LISP 哈希表的实现方式和操作函数可以使你更加高效地使用它。