比较Python中的两个树/图

时间:2015-02-12 19:17:30

标签: python dictionary graph tree

首先,我应该承认我对与图有关的一切都很糟糕。我的树被实现为嵌套字典,代表未加权的马尔可夫链。

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。

如果您可以为我的树提出更好的数据结构,我会非常感激。我和词典一起去获得最大的时间表现。先感谢您。

1 个答案:

答案 0 :(得分:3)

为什么不能使用递归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是什么,很难建议更合适的结构。但是,我强烈建议您为节点创建一个类,这样可以更轻松地推断您的代码。如果事实证明这实际上导致了性能问题(在分析之后),那么只有优化它(毕竟,过早优化是所有邪恶的根源)。