【问题标题】:How to delete a node from a graph in scheme?如何从方案中的图中删除节点?
【发布时间】:2014-11-20 07:54:37
【问题描述】:

我定义了一个具有以下结构的图 '(()()...) 外部列表是图本身,它包含节点和边。 第一个内部列表是所有节点的列表。 以下列表是边缘。边由成对的节点组成。 所以这是一个有 3 个节点和 2 条边的示例图: ((n1 n2 n3) (n1 n2) (n1 n3))

我已经能够像这样删除一条边:

(define (delete-edge edge)
    (if (member edge (edges))
        (build-graph (nodes) (remove edge (edges)))
        "ERROR no edge to remove"))

这是构建图

(define (build-graph nodes edges)
    (set! graph (append (list nodes) edges)))

但我无法删除节点。如果我删除一个节点,我还必须删除与之相关的所有边。到目前为止我所拥有的是:

(define (delete-node node)
    (cond ((member (car (car graph)) (cdr graph))
           ("not implemented yet"))
        ("No Node to delete")))

在我检查了第一个节点是否包含在边列表中之后,我不确定下一步是什么。我知道它是否被包含,我需要检查并删除包含它的列表。然后我需要转到节点列表中的下一个节点并检查...但我不确定如何执行此操作。

任何帮助将不胜感激!

【问题讨论】:

    标签: graph scheme racket


    【解决方案1】:

    在 Scheme 中,您应该更喜欢函数式编程风格的解决方案。换句话说:改变全局变量(在这种情况下为graph)不是一个好主意,最好接收图形作为参数并返回一个新的修改后的图形结果。例如,这可以解决您的问题:

    (define (delete-node node graph)
      (cons (remove node (car graph))                  ; remove node from list of nodes
            (filter (lambda (e) (not (member node e))) ; delete edges that contain the node
                    (cdr graph))))
    

    上面使用列表辅助函数来实现解决方案,这是编写程序的惯用方式。请注意,如果我们尝试删除不存在的节点,则将返回相同的输入图,未经修改。像这样使用它:

    (define graph '((n1 n2 n3) (n1 n2) (n1 n3)))
    
    (delete-node 'n2 graph)
    => '((n1 n3) (n1 n3))
    (delete-node 'n5 graph)
    => '((n1 n2 n3) (n1 n2) (n1 n3))
    

    如果您确实需要修改 graph 全局变量,请事后进行:

    (set! graph (delete-node 'n2 graph))
    

    【讨论】:

    • 抱歉,delete-node 是在使用 dispatch 的函数中设计的函数。我正在创建一个图形对象并实现图形中包含的方法 - 否则我会同意你的看法
    • 但是感谢您的帮助!这正是我一直在寻找的。我一直在为如何解决这个问题而发疯
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2019-04-12
    相关资源
    最近更新 更多