我应该/可以在此函数中使用“ assoc”来重新定义函数参数吗?

德克

我正在Clojure中为一个班级项目实现Bron-Kerbosch算法,并且遇到了一些问题。问题出在算法的最后几行

BronKerbosch1(R, P, X):
 if P and X are both empty:
       report R as a maximal clique
   for each vertex v in P:
       BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
       P := P \ {v} ;This line
       X := X ⋃ {v} ;This line

我知道在Clojure中没有“设置x =某些东西”的感觉。但是确实知道有assoc我认为相似功能。我想知道是否assoc适合完成我的实施。

在我的实现中,图形表示为

[#{1 3 2} #{0 3 2} #{0 1 3} #{0 1 2}]

其中第0个节点表示为向量中的第一个集合,而该集合中的值表示其他节点的边。因此,以上所示的图具有完整的4个节点(所有节点都连接到所有其他节点)。

到目前为止,我的算法实现是

(defn neighV [graph, v]
  (let [ret-list (for [i (range (count graph)) :when (contains? (graph i) v)] i)]
    ret-list))

(defn Bron-Kerbosch [r, p, x, graph, cliques]
  (cond (and (empty? p) (empty? x)) (conj cliques r)
        :else
        (for [i (range (count p))]
          (conj cliques (Bron-Kerbosch (conj r i) (disj p (neighV graph i) (disj x (neighV graph i)) graph cliques)))
          )))

所以现在我被卡住了,p并且x按照算法。我认为可以使用assoc此功能,但我认为它仅适用于地图。可以使用,有人可以推荐其他功能吗?

噪音史密斯

assoc不会改变其论点。像Clojure中的所有其他其他基本收集操作一样,它会返回一个新的不可变收集。

为了“就地”进行更新,您将需要停止使用基本的Clojure数据类型,并使用诸如的本机Java类型java.util.HashSet

另一个(也是首选)选项是重构算法,以便将所有更新传递给代码的下一次迭代或递归。

这是将您的代码调整为这种样式的最初尝试,但需要注意的是,可能需要从递归调用中提取内部修改:

(defn Bron-Kerbosch
  [r p x graph cliques]
  (if (every? empty? [p x])
    (conj cliques r)
    (reduce (fn [[cliques p x] v]
              (let [neigh (neighV graph v)]
                [(conj cliques
                       ;; do we need to propagate updates to p and x
                       ;; from this call back up to this scope?
                       (Bron-Kerbosch (conj r v)
                                      (disj p neigh)
                                      (disj x neigh)
                                      graph
                                      cliques))
                 ;; here we pass on the new values for p and x
                 (disj p v)
                 (conj x v)]))
            [cliques p x]
            (range (count p)))))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重新定义导入函数的默认参数

来自分类Dev

重新定义导入函数的默认参数

来自分类Dev

可以重新定义constexpr和内联函数吗?

来自分类Dev

通过名称重新定义python函数的默认参数

来自分类Dev

重新定义构造函数

来自分类Dev

我可以在函数定义中使用函数typedef吗?

来自分类Dev

派生类可以重新定义具有不同签名的函数的虚函数吗?

来自分类Dev

在此函数中使用eval()是否不正确?没有它,我可以完成相同的功能吗?

来自分类Dev

我可以在函数参数中使用“ If”语句吗?

来自分类Dev

我可以在函数中使用“ifwinexist”作为参数吗?

来自分类Dev

可以在React中重新定义useState中的updater函数吗?

来自分类Dev

为什么我需要在此函数中使用return关键字,以便Promise可以正常工作?

来自分类Dev

在函数原型中重新定义“ this”并使用新参数运行它

来自分类Dev

在函数原型中重新定义“ this”并使用新参数运行它

来自分类Dev

C ++:继承并重新定义函数

来自分类Dev

从导入模块重新定义调用的函数

来自分类Dev

如何重新定义C ++指针函数?

来自分类Dev

在python中重新定义函数

来自分类Dev

Javascript重新定义私有函数

来自分类Dev

使用Javascript中的函数重新定义函数

来自分类Dev

重新定义形式参数C ++,尝试传递构造函数

来自分类Dev

重新定义形式参数C ++,尝试传递构造函数

来自分类Dev

我应该在此Django模型中使用ForeignKey吗?

来自分类Dev

可以在函数参数中使用解构吗?

来自分类Dev

我应该在自定义函数中使用回调模式吗?节点js

来自分类Dev

我应该在自定义函数中使用回调模式吗?节点js

来自分类Dev

在函数参数定义中使用“自我”

来自分类Dev

如何重新定义我在python中导入的函数使用的函数?

来自分类Dev

Ocaml - 在新函数中重新定义函数

Related 相关文章

  1. 1

    重新定义导入函数的默认参数

  2. 2

    重新定义导入函数的默认参数

  3. 3

    可以重新定义constexpr和内联函数吗?

  4. 4

    通过名称重新定义python函数的默认参数

  5. 5

    重新定义构造函数

  6. 6

    我可以在函数定义中使用函数typedef吗?

  7. 7

    派生类可以重新定义具有不同签名的函数的虚函数吗?

  8. 8

    在此函数中使用eval()是否不正确?没有它,我可以完成相同的功能吗?

  9. 9

    我可以在函数参数中使用“ If”语句吗?

  10. 10

    我可以在函数中使用“ifwinexist”作为参数吗?

  11. 11

    可以在React中重新定义useState中的updater函数吗?

  12. 12

    为什么我需要在此函数中使用return关键字,以便Promise可以正常工作?

  13. 13

    在函数原型中重新定义“ this”并使用新参数运行它

  14. 14

    在函数原型中重新定义“ this”并使用新参数运行它

  15. 15

    C ++:继承并重新定义函数

  16. 16

    从导入模块重新定义调用的函数

  17. 17

    如何重新定义C ++指针函数?

  18. 18

    在python中重新定义函数

  19. 19

    Javascript重新定义私有函数

  20. 20

    使用Javascript中的函数重新定义函数

  21. 21

    重新定义形式参数C ++,尝试传递构造函数

  22. 22

    重新定义形式参数C ++,尝试传递构造函数

  23. 23

    我应该在此Django模型中使用ForeignKey吗?

  24. 24

    可以在函数参数中使用解构吗?

  25. 25

    我应该在自定义函数中使用回调模式吗?节点js

  26. 26

    我应该在自定义函数中使用回调模式吗?节点js

  27. 27

    在函数参数定义中使用“自我”

  28. 28

    如何重新定义我在python中导入的函数使用的函数?

  29. 29

    Ocaml - 在新函数中重新定义函数

热门标签

归档