Lisp/列表的交集

标签 lisp common-lisp set-intersection

你好,我正在尝试在 common-lisp 中创建一个函数,它接受两个列表,并输出它们的交集,假设每个列表中没有重复而不使用交集函数。似乎不起作用。有人可以帮忙吗?

(defun isect (lst_1 lst_2)
    (setq newlist nil)
    (dolist (x lst_1 newlist)
        (dolist (y lst_2) 
            (if (equal x y) (setf newlist (append newlist x)))
        )
    )
)

最佳答案

我假设两个参数均为同一列表的 isect 应该返回一个相等的列表,而不是一个被展平的列表。在这种情况下,(append newlist x) 不会将元素添加到列表末尾。这是我的建议:

(defun intersect (lst-a lst-b &aux result)
  (dolist (a lst-a (nreverse result))
    (dolist (b lst-b)
      (when (equal a b)
        (push a result)))))

这是 O(n^2),而您可以使用哈希表在 O(n) 内完成。

关于Lisp/列表的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53209247/

相关文章:

clojure - LISP 的魅力是什么?

common-lisp - 如何保证从 sbcl 干净退出

r - 从翻转对象中提取交叉点列表

python - 使用Python,比较两个大型字典同时返回匹配超过特定阈值的键(作为卡住集)的最快方法是什么?

c++ - set_intersection 用于两种不同类型的集合

autocomplete - 在 sbcl 中启用自动完成

lisp - Common Lisp 中的值函数

variables - 如何访问列表中变量的值?

vim - 新的 SLIMV 0.8.4 安装,paren 匹配有效,缩进没有

common-lisp - 哪些标准 Common Lisp 宏/特殊形式建立了名为 nil 的隐式 block ?