为什么来自Hyperspec的以下声明的原因是否合乎逻辑? “如果list-1和list-2之间存在重复,则结果中只有一个重复的实例。如果list-1或list-2中包含重复的条目,则冗余条目可能会或可能不会出现在结果中。“
在我读到这篇文章之前,我假设工会应该返回一个唯一的列表,并且为什么我的代码没有这样做会感到沮丧。删除列表之间但不在列表之间的重复项似乎也很奇怪。为什么甚至指定这个?
似乎人们应该能够假设联合会产生一个唯一的集合元素列表,或者我错过了什么?
有关Hyperspec的完整页面,请参阅http://clhs.lisp.se/Body/f_unionc.htm
答案 0 :(得分:5)
如果您的代码只设置了唯一元素(例如1 2 3
),那么UNION
将保留此属性。
如果您的代码包含具有非唯一元素的集合(例如1 2 2 3
),则UNION
无需在结果集中强制执行唯一性。
使用单独的函数删除重复项:REMOVE-DUPLICATES
。
答案 1 :(得分:4)
假设作为UNION参数的两个列表的元素都是唯一的,这意味着在最坏的情况下算法的复杂性(不可排序的,不可清除的元素)是O(n * m)。另一方面,在这种情况下删除列表中的重复项是O(n ^ 2)。即使在没有重复的情况下,使UNION删除重复项也会使运行时间增加大约三倍,因为大部分时间都是通过比较来消耗的。