【发布时间】:2011-06-23 06:18:42
【问题描述】:
我正在尝试编写一个函数来比较两个列表以查看它们是否代表相同的集合。那就是'(a b c d d) 和'(d c b a d) 代表同一个集合。元素可以按任意顺序排列。
这就是我所拥有的,它有效:
(defun samesetp (list1 list2)
(cond
((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1))))))
我不喜欢这样的原因是 (remove (car list1) list2 :count 1)) 被计算了两次 - 一次是为了测试 remove 操作是否真的删除了任何东西,一次是为了递归地测试没有该元素的列表的其余部分。
谁能提出一种在不使用不同算法的情况下改进这一点的方法?
【问题讨论】:
-
你应该使用哈希表,这会将复杂度从 O(n^2) 降低到 O(n)。
-
我很困惑。您正在使用一种糟糕的算法,并且希望改进,只要它们不涉及修复错误的算法。为什么?正如@leppie 所说,使用哈希表。或者对两个列表进行排序,然后并行遍历它们。与您关注的微优化相比,更好的算法会产生更大的影响。
-
冷静下来,我们不允许使用哈希表。这是家庭作业问题的一部分。如果你能想到一个更高效的算法,可以包含在大约 10 行代码之内,请赐教。
-
不要在自己的行上使用尾括号。 Lisp 不是 C 或 Java。
-
支持 Rainer 的评论 - 见 mumble.net/~campbell/scheme/style.txt
标签: lisp common-lisp