Data structures `clojure中列表的conj`and`disj`?是否可能使用其他数据结构?包含SCCEE

Data structures `clojure中列表的conj`and`disj`?是否可能使用其他数据结构?包含SCCEE,data-structures,clojure,Data Structures,Clojure,对于一个类项目,我正在实现在图中查找最大团的方法。在其他人的帮助下,我开始着手解决最后几个问题 此链接包含我当前实施的SSCCE,概述了该问题。我认为问题在于我使用disj查找两个列表的交集。我认为这是基于当我用理智输入调用BK call时给出的错误 fptests.core> (BK-Call (sanity1)) ClassCastException clojure.lang.PersistentList$EmptyList cannot be cast to clojure.lang

对于一个类项目,我正在实现在图中查找最大团的方法。在其他人的帮助下,我开始着手解决最后几个问题

此链接包含我当前实施的SSCCE,概述了该问题。我认为问题在于我使用disj查找两个列表的交集。我认为这是基于当我用理智输入调用BK call时给出的错误

fptests.core> (BK-Call (sanity1))
ClassCastException clojure.lang.PersistentList$EmptyList cannot be cast to clojure.lang.IPersistentSet  clojure.core/disj (core.clj:1449)
在我的Bron-Kerbosch函数中,这个错误可以追溯到几行

(defn Bron-Kerbosch [r p x graph cliques]
  (cond (and (empty? p) (empty? x)) (conj cliques r)
        :else
        (let [neigh (neighV graph (dec (count p)))]
          (loop [loop-clq '(cliques)
                 loop-cnt '(dec (count p))
                 loop-p '(p)
                 loop-x '(x)]
            (cond (= -1 loop-cnt) loop-clq
                  :else
                  (recur (conj loop-clq (Bron-Kerbosch (conj r loop-cnt) (conj p neigh) (disj x neigh)))
                         (dec loop-cnt)
                         (disj p loop-cnt)
                         (conj x loop-cnt)))))))
特别是在递归调用递归形式的函数时。虽然我认为这个问题适用于conj和disj的所有用法。看来conj是有效的,但不是我想象的那样

fptests.core> (disj '(1) '(1 2 3))
ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IPersistentSet  clojure.core/disj (core.clj:1449)
fptests.core> (conj '(1) '(2 3))
((2 3) 1)
我假设conj'1'23将返回123,而不是123。因此,我在函数中使用列表似乎是个问题。有没有办法克服这个问题

我不得不想象有像conj和disj这样的函数可以处理列表。如果这不是真的,我想我的另一个选择是在算法中使用其他数据结构。什么是合适的?

使用cons、rest和concat

使用cons、rest和concat


我确实建议使用更适合当前问题的数据结构,即集合

您已经在图形表示中使用Clojure哈希集,在空图形中重复n{};Bron-Kerbosch阶跃函数的r、p和x参数都是概念集,因此将它们表示为Clojure集也是有意义的

有了这种表示方式的选择,事情将变得更简单——可以使用clojure.set/intersection计算集合交集,disj用于删除单个关键点等


另一方面,如果在Bron Kerbosch中使用的两个cond实际上只有两个分支,而不是cond,则更为自然。更重要的是,您需要从循环的init表达式中删除引号—“dec count p notice the”,举一个例子,是一个两元素列表,而不是一个数字。在Clojure中,函数名包含大写字母也有点不寻常,但当然这纯粹是风格问题。

我确实建议使用更适合当前问题的数据结构,即集合

您已经在图形表示中使用Clojure哈希集,在空图形中重复n{};Bron-Kerbosch阶跃函数的r、p和x参数都是概念集,因此将它们表示为Clojure集也是有意义的

有了这种表示方式的选择,事情将变得更简单——可以使用clojure.set/intersection计算集合交集,disj用于删除单个关键点等


另一方面,如果在Bron Kerbosch中使用的两个cond实际上只有两个分支,而不是cond,则更为自然。更重要的是,您需要从循环的init表达式中删除引号—“dec count p notice the”,举一个例子,是一个两元素列表,而不是一个数字。在Clojure中,函数名包含大写字母也有点不寻常,但当然这纯粹是风格问题。

我想我必须编写一个小的辅助函数来查找两个列表的交集;而不是disj?我看到的另一个问题是cons'1'23评估为1 2 3而不是1 2 3,有没有办法让后一种情况发生?删除对您的问题有效吗?def x'b然后remove{x}'abc返回一个c,remove set'bd'abc返回一个c。使用concat处理concat'1'2 3返回1 2 3。哎呀,看得太快了。//删除本身不起作用,我需要在列表中找到值的交集。我认为一个小的helper函数就可以了。谢谢你的帮助!过滤器集l1 l2将返回l1和l2的交集,我假设我必须编写一个小的辅助函数来查找两个列表的交集;而不是disj?我看到的另一个问题是cons'1'23评估为1 2 3而不是1 2 3,有没有办法让后一种情况发生?删除对您的问题有效吗?def x'b然后remove{x}'abc返回一个c,remove set'bd'abc返回一个c。使用concat处理concat'1'2 3返回1 2 3。哎呀,看得太快了。//删除本身不起作用,我需要在列表中找到值的交集。我认为一个小的helper函数就可以了。谢谢你的帮助!过滤器集l1将返回l1和l2Great通知的交集。我认为所有这些init都应该是列表,所以。。。应替换为列表。。。在每一种情况下,当然除了十二月。伟大的建议。我认为所有这些init都应该是列表,所以。。。应替换为列表。。。在每种情况下,当然除了12月。
user=> (cons 1 '(2 3))
(1 2 3)
user=> (cons '(1) '(2 3))
((1) 2 3)
user=> (cons 1 ())
(1)
user=> (rest '(1 2 3))
(2 3)
user=> (concat '(1) '(2 3))
(1 2 3)