为什么工会不会返回唯一的清单?

时间:2012-05-30 15:24:16

标签: common-lisp

为什么来自Hyperspec的以下声明的原因是否合乎逻辑? “如果list-1和list-2之间存在重复,则结果中只有一个重复的实例。如果list-1或list-2中包含重复的条目,则冗余条目可能会或可能不会出现在结果中。“

在我读到这篇文章之前,我假设工会应该返回一个唯一的列表,并且为什么我的代码没有这样做会感到沮丧。删除列表之间但不在列表之间的重复项似乎也很奇怪。为什么甚至指定这个?

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

有关Hyperspec的完整页面,请参阅http://clhs.lisp.se/Body/f_unionc.htm

2 个答案:

答案 0 :(得分:5)

如果您的代码只设置了唯一元素(例如1 2 3),那么UNION将保留此属性。

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

使用单独的函数删除重复项:REMOVE-DUPLICATES

答案 1 :(得分:4)

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