比较 Python 中的两个 trees/graphs

Compare two trees/graphs in Python

首先,我必须承认,我对所有与图形相关的事情都很不擅长。我的树被实现为代表未加权马尔可夫链的嵌套字典。

class Tree(object):
    def __init__(self, depth=6, seq=None):
        self.graph = dict()
        self.depth = depth
        if seq is not None:
            self.build(seq)

    def build(self, seq):
        for i in xrange(len(seq)):
            sseq = seq[i:i+self.depth]
            for j in xrange(len(sseq)):
                if j == 0:
                    if sseq[j] not in self.graph:
                        self.graph[sseq[j]] = dict()
                    nest_pointer = self.graph[sseq[j]]
                else:
                    if sseq[j] not in nest_pointer:
                        nest_pointer[sseq[j]] = dict()
                    nest_pointer = nest_pointer[sseq[j]]

我需要的是能够比较两棵树,同时知道差异发生的深度,因为我要使用分层相似性评分系统,所以简单的递归 DFS 无法解决问题.

P.S.

如果你能为我的树提出一个更好的数据结构,我将不胜感激。我用字典来获得最大的时间性能。先感谢您。

为什么不能使用递归 DFS?只需将当前高度作为参数传入即可。我不太确定你是如何比较节点或子树的,但这样的事情可能会起作用,它只记录两个节点比较不相等的所有时间(一些用户定义的比较nodes_different

(伪代码):

def compare_trees_r(node1, node2, depth, result):
    if nodes_different(node1, node2):
        result.append(depth)
    for (pairs of children c1 and c2):
        compare_trees_r(c1, c2, depth + 1, result)

def compare_trees(t1, t2):
    result = []
    compare_trees_r(t1.graph, t2.graph, 0, result)
    return result

就您的实际数据结构而言,如果不知道 seq 是什么,很难提出更合适的结构。但是,我强烈建议您为您的节点创建一个 class,这应该会使对您的代码的推理变得更加容易。如果事实证明这实际上导致了性能问题(在分析之后),那么只有优化它(毕竟,过早的优化是万恶之源)。