在LISP中是一个关联列表,类似于c#中的Dictionary

本文关键字:列表 关联 类似于 Dictionary 中的 一个 LISP | 更新日期: 2023-09-27 18:18:50

我正在读一本关于Common LISP的书,作者说:" list由存储在list中的键/值对组成。"

所以它让我思考,这是同一件事作为一个字典在c#或不?如果是,为什么呢?

在LISP中是一个关联列表,类似于c#中的Dictionary

抽象概念和具体数据结构是有区别的。

字典是一个抽象概念——键到值的映射。它可以通过几种不同的方法实现:

  • 作为键值对的列表(Lisp的列表),键和值的交错平面列表(Lisp的列表),作为一对键和值的两个列表
  • 作为一个表,无论是Lisp的哈希表/Java的HashMap还是其他类型的表
  • 作为树(Java的TreeMap)
c#的Dictionary是一种支持(平摊)常量查找时间的数据结构,就像CL的哈希表一样。在这方面,它与list不同,后者具有线性查找时间。此外,列表不依赖于元素的哈希码来存储/检索它。alist的API也不同于Dictionary的API。assocrassoc分别从左侧和右侧查找元素。(因此,与传统字典不同的是,列表中可以有多个相同键到不同值的映射)。还有aconspairlis来构建alist

EDIT最后,没有标准函数从列表中删除项。你可以用(remove key alist :key #'car)删除一个元素。但请注意,该操作将保留原始列表,并返回修改后的列表。

列表和哈希表之间的比较(Dictionary使用),因为似乎还没有人触及这个:

船向一边倾斜的:

  • 很容易实现(只是一对的列表)
  • 具有线性时间查找(因此仅对小列表有用)

哈希表:

  • 需要更多的努力来实现(特别是,你必须为密钥实现一个稳定的哈希函数)
  • 已平摊恒定时间查找

这是从键到值的映射。所以它的作用类似于字典。在Lisp的发展过程中,添加了哈希表,用于类似的目的。

是的,它们非常相似,服务于相似的目的,但至少有一个显著的区别:

.NET Dictionary不能有多个具有相同键的项!

显然,列表可以:

在关联列表中搜索与给定键的关联时,如果有多个关联,则返回找到的第一个关联。

是的,这几乎是一样的。也称为关联数组(perl)和映射(java和其他)。