Common lisp 为什么union不返回唯一列表?

Common lisp 为什么union不返回唯一列表?,common-lisp,Common Lisp,Hyperspec中的以下语句是这样的,有逻辑原因吗? 如果列表-1和列表-2之间存在重复,则结果中只会有一个重复实例。如果列表-1或列表-2中有重复项,则冗余项可能会出现在结果中,也可能不会出现在结果中 在我读到这篇文章之前,我一直认为工会应该返回一个唯一的列表,并对我的代码为什么没有这样做感到沮丧。删除列表之间的重复项而不是列表中的重复项似乎也很奇怪。为什么还要具体说明这一点 似乎人们应该能够假设联合会产生一个集合元素的唯一列表,或者我遗漏了什么 有关Hyperspec中的完整页面,请参见假

Hyperspec中的以下语句是这样的,有逻辑原因吗? 如果列表-1和列表-2之间存在重复,则结果中只会有一个重复实例。如果列表-1或列表-2中有重复项,则冗余项可能会出现在结果中,也可能不会出现在结果中

在我读到这篇文章之前,我一直认为工会应该返回一个唯一的列表,并对我的代码为什么没有这样做感到沮丧。删除列表之间的重复项而不是列表中的重复项似乎也很奇怪。为什么还要具体说明这一点

似乎人们应该能够假设联合会产生一个集合元素的唯一列表,或者我遗漏了什么


有关Hyperspec中的完整页面,请参见

假设两个列表中作为UNION参数的元素都是唯一的,这意味着在最坏的情况下(不可排序、不可散列的元素)算法的复杂性为O(n*m)。另一方面,在这种情况下删除列表中的重复项是O(n^2)。即使在没有重复项的情况下,使UNION remove duplicates也将使运行时间大约增加三倍,因为大部分时间都用于比较。

如果您的代码只有具有唯一元素的集合(如
1 2 3
),则
UNION
将保留此属性

如果您的代码具有具有非唯一元素的集合(如
1 2 3
),则
UNION
无需在结果集中强制唯一性


删除重复项是通过一个单独的函数完成的:
REMOVE-duplicates

为什么不添加两个列表,那么这应该需要O(1)个时间?列表之间无重复的要求阻止了这一点,所以这可能就是它被包含在规范中的原因;买为什么?因为追加不是联合。Union是一个集合操作,当对集合(即:test下唯一的元素列表)调用时,它执行集合操作。该规范允许UNION不强制要求参数是逻辑集,因为这很昂贵。(同样在CL中,附加在O(n)中,其中n是除第一个参数外的所有参数的长度。默认CL中没有实际列表)。Errr@拉马伦。。。链接列表如何“不是真正的列表”?诚然,没有指向尾部的指针(至少默认情况下没有),但我很难将它们视为非真实的东西。这有点夸张,滥用了“真实”一词。我认为列表的真实性只是和APPEND的复杂性有着松散的联系。但问题实际上在于默认类型层次结构,它是为了与旧的Lisp兼容而构建的。在CL中,列表类型不是列表,而是CONS和NULL的联合,后者是实际(“正确”)列表的超集。在CL中表示列表的级别太低,并且在很多情况下不能忽略此表示(例如,为什么不能更改空列表)。