在LISP中是一个关联列表,类似于c#中的Dictionary
本文关键字:列表 关联 类似于 Dictionary 中的 一个 LISP | 更新日期: 2023-09-27 18:18:50
我正在读一本关于Common LISP的书,作者说:" list由存储在list中的键/值对组成。"
所以它让我思考,这是同一件事作为一个字典在c#或不?如果是,为什么呢?
抽象概念和具体数据结构是有区别的。
字典是一个抽象概念——键到值的映射。它可以通过几种不同的方法实现:
- 作为键值对的列表(Lisp的列表),键和值的交错平面列表(Lisp的列表),作为一对键和值的两个列表
- 作为一个表,无论是Lisp的哈希表/Java的HashMap还是其他类型的表
- 作为树(Java的TreeMap) 等
assoc
和rassoc
分别从左侧和右侧查找元素。(因此,与传统字典不同的是,列表中可以有多个相同键到不同值的映射)。还有acons
和pairlis
来构建alist
。
EDIT最后,没有标准函数从列表中删除项。你可以用(remove key alist :key #'car)
删除一个元素。但请注意,该操作将保留原始列表,并返回修改后的列表。
列表和哈希表之间的比较(Dictionary
使用),因为似乎还没有人触及这个:
船向一边倾斜的:
- 很容易实现(只是一对的列表)
- 具有线性时间查找(因此仅对小列表有用)
哈希表:
- 需要更多的努力来实现(特别是,你必须为密钥实现一个稳定的哈希函数)
- 已平摊恒定时间查找
这是从键到值的映射。所以它的作用类似于字典。在Lisp的发展过程中,添加了哈希表,用于类似的目的。
是的,它们非常相似,服务于相似的目的,但至少有一个显著的区别:
.NET Dictionary
不能有多个具有相同键的项!
显然,列表可以:
在关联列表中搜索与给定键的关联时,如果有多个关联,则返回找到的第一个关联。
是的,这几乎是一样的。也称为关联数组(perl)和映射(java和其他)。