在Common Lisp中表示有向无环图

时间:2018-09-06 17:37:40

标签: graph lisp common-lisp graph-theory directed-acyclic-graphs

通常,要代表Lisp中的基本无向图,我可以创建父节点及其对应的子节点的列表,如this question中所述(为方便起见,在下面进行了说明)。

enter image description here

此图产生边列表:

(1 (2 6 7 8) 3 (4 (9 12)) 5 (10 11)) 

这在树或任何其他无向图的情况下有效。但是,当我们要表示一个有向无环图(其中每个节点可以有多个父级)时,这种表示形式就会失效:

enter image description here

现在,节点8具有多个父节点(2、3),但是当我们尝试表示它时,我们将无法判断节点8是否连接到两个父节点,或者是否存在两个节点8:

(1 (2 6 7 8) (3 8) (4 (9 12)) (5 10 11))

对于具有唯一节点的图,我们当然可以做出这种假设,但是据我所知,DAG可以具有重复的节点...那么我们如何处理呢?此外,我们如何在Lisp中将其表示为列表?

2 个答案:

答案 0 :(得分:5)

表示DAG的正确方法是节点(顶点)的集合:

(defstruct node
  payload
  children)

由于该结构只有两个插槽,因此一个可以使用, 改为Toeplitz Matrix个单元格。

您给出的树的列表表示形式 用没有子元素的节点填充有效载荷 并弄乱了最右边的分支。 正确的表示是

(1 (2 (6) (7) (8)) (3) (4 (9 (12))) (5 (10) (11)))

现在,在子节点之间共享无子节点(8)的DAG (2 ...)(3 ...)中的节点仅应共享单元:

(1 (2 (6) (7) #1=(8)) (3 #1#) (4 (9 (12))) (5 (10) (11)))

请参见cons#n=为读者符号。 当然,您不应使用它们创建 DAG。

以下是创建DAG的方法:

(defun make-node (&key payload children)
  (cons payload children))
(defparameter *my-dag*
  (let ((shared-mode (make-node :payload 8)))
    (make-node
     :payload 1
     :children
     (list (make-node :payload 2
                      :children (list (make-node :payload 6)
                                      (make-node :payload 7)
                                      shared-mode))
           (make-node :payload 3
                      :children (list shared-mode))
           (make-node :payload 4
                      :children (list (make-node :payload 9
                                                 :children (list (make-node :payload 12)))))
           (make-node :payload 5
                      :children (list (make-node :payload 10)
                                      (make-node :payload 11)))))))
(setq *print-circle* t)
*my-dag*
==> (1 (2 (6) (7) #1=(8)) (3 #1#) (4 (9 (12))) (5 (10) (11)))

答案 1 :(得分:2)

只需列出两个节点ID的顶点即可:

((1 2) (1 3) (1 4) (1 5) (2 6) (2 7) (2 8) ... )

或使用向量:

#((1 2) (1 3) (1 4) (1 5) (2 6) (2 7) (2 8) ... )

或使用节点列表及其后继:

((1 2 3 4 5) (2 6 7 8) (3 8) (4 9) ...)