表示DAG的正确方法是 节点 (顶点):
(defstruct node payload children)
由于结构只有两个插槽,当然可以使用 cons 而是细胞。
cons
您提供的树的列表表示 合并了 有效载荷 没有孩子 节点 并弄乱了最右边的分支。 正确的表示是
(1 (2 (6) (7) (8)) (3) (4 (9 (12))) (5 (10) (11)))
现在,共享无子节点的DAG (8) 孩子之间 节点 (2 ...) 和 (3 ...) 应该只分享细胞:
(8)
(2 ...)
(3 ...)
(1 (2 (6) (7) #1=(8)) (3 #1#) (4 (9 (12))) (5 (10) (11)))
看到 #n= 和 #n# 对于读者记谱法。 当然,你不应该使用它们 创建 DAG的。
#n=
#n#
以下是创建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)))
只需列出两个节点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) ...)