Lisp,删除带有两个公共元素的子列表

Lisp,删除带有两个公共元素的子列表,lisp,Lisp,我正在用CommonLisp编程,我需要一个算法来删除包含(至少)两个公共元素的子列表 我不知道怎样才能解决这个问题。我想用这个: (删除重复项列表(列表)(删除重复项列表:测试'equal:key'cdr)) 但是子列表之间的cdr是不同的,我只是不知道如何计算两个元素并删除子列表。 此外,我不需要删除“原始”子列表(在示例中为“(1234))、仅bot(234)和(1234) 例如: 输入:‘(1234)(234)(5678)(134)(999)) 输出:‘(1234)(56789)) 输入

我正在用CommonLisp编程,我需要一个算法来删除包含(至少)两个公共元素的子列表

我不知道怎样才能解决这个问题。我想用这个:

(删除重复项列表(列表)(删除重复项列表:测试'equal:key'cdr))

但是子列表之间的cdr是不同的,我只是不知道如何计算两个元素并删除子列表。 此外,我不需要删除“原始”子列表(在示例中为“(1234))、仅bot(234)和(1234)

例如:

输入:‘(1234)(234)(5678)(134)(999))

输出:‘(1234)(56789))

输入:“((1.1)(2.2)(3.3)(4.4))((1.1)(2.2)(4.4)))

输出:‘(1.1)(2.2)(3.3)(4.4))

谢谢大家!


对不起,如果一开始我没有很好地解释我的问题,我会纠正帖子中的许多错误。这是我关于这个社区的第一个问题,请原谅

实际上你可以用
删除重复项
。当至少有两个元素相似时,您需要创建一个返回true的测试函数。例如

(defun two-similar-p (lst1 lst2)
  ...)

(two-similar-p '(1 2 3) '(1 4 5)) ; ==> nil
(two-similar-p '(1 2 5) '(1 4 5)) ; ==> t
使用散列是最快和最好的时间复杂度,而迭代一个列表
(另一个列表的长度)
次可能是最容易的。然后,您可以通过以下方式解决问题:

(defun remove-duplicates-list (list) 
  (remove-duplicates list :test #'two-similar-p :from-end t))

(remove-duplicates-list '((1 2 3 4) (2 3 4) (5 6 7 8) (1 3 4) (9 9 9 9)))
; ==> ((1 2 3 4) (5 6 7 8) (9 9 9 9))

来自Stackoverflow帮助:“要求家庭作业帮助的问题必须包括您迄今为止为解决问题所做工作的摘要,以及您解决问题的困难的描述。”是的,谢谢您,到目前为止,我已经完成了我的项目,我是唯一一个为此编写算法的困难。这很容易,但我被卡住了。我现在将添加更多示例您是否尝试过代码?发生了什么?我的代码比较了不同子列表的cdr/rest,但是您可以看到子列表的cdr/rest发生了变化。所以我的代码(功能删除重复列表)是完全错误的。我需要一个代码来找到比“original”短的子列表(例如,原始子列表是“(1 2 3 4)),并且至少有两个元素也在“original”子列表中。因此,在第一个示例中,我需要找到子列表(2 3 4)和(1 3 4)并删除它们,因为它们有两个与(1 2 3 4)相同的元素。我将尝试编写此函数的代码(two-similable-p),谢谢您的回答。如果我有任何问题,我会更新这篇文章,或者我会在这里写评论