2017-06-04 138 views
-1

我在Common lisp中编程,我需要一个算法删除具有(至少)两个公共元素的子列表。Lisp,删除具有两个公共元素的子列表

我不知道如何解决问题。我想使用此:

(defun定义除去-重复表(列表)(删除-重复列表:测试 '等于:键' CDR))

但子列表之间的CDR是不同,以及i只是无法弄清楚我如何计算两个元素并删除子列表。 另外我需要不删除的 “原始” 的子表(在本例中“(1 2 3 4))中,只有机器人(2 3 4)和(1 3 4)

实施例:

输入:'((1 2 3 4)(2 3 4)(5 6 7 8)(1 3 4)(9 9 9 9))

输出:'((1 2 3 4)(5 6输入:'(((1.1)(2.2)(3.3)(4.4))((1.1)(2.2)(9.9 9 9))

输入: )(4。4)))

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

谢谢!

P.s抱歉,如果起初我没有解释清楚我的问题,我纠正了很多错误。这是我对这个社区的第一个问题,请原谅

+2

从帮助#1“的问题,要求作业帮助必须包括到目前为止你已经做解决问题的工作的总结,和难度的描述你正在解决它。“ –

+0

是的,谢谢你,到目前为止我已经完成了我的项目,我唯一难以为此写出一个算法。这很容易,但我卡住了。我将添加更多示例 –

+0

您是否尝试过您的代码?发生了什么? –

回答

1

其实你可以用remove-duplicates做到这一点。当至少有两个元素相似时,您需要创建一个返回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 

使用散列函数是最快最好的时间复杂度,同时遍历一个列表(length other-list)时间可能是最容易的。然后你就可以解决你的问题是这样的:

(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)) 
+0

我会尝试写这个函数的代码(two-similar-p),谢谢你的回答。如果我有任何问题,我会更新这篇文章,也许我会在这里写评论 –