【问题标题】:Compare two trees/graphs in Python在 Python 中比较两个树/图
【发布时间】:2015-02-12 19:17:30
【问题描述】:

首先,我应该承认我在所有与图表相关的事情上都非常糟糕。我的树被实现为代表未加权马尔可夫链的嵌套字典。

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 无法解决问题。

附言

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

【问题讨论】:

  • 关于你,有很多关于 SO 的建议可以帮助您为您的树实现不同的(我犹豫说更好,因为我没有对其进行基准测试)数据结构。请参阅thisthisthis

标签: python dictionary graph tree


【解决方案1】:

为什么不能使用递归 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 是什么,就很难提出更合适的结构。但是,我强烈建议您为节点创建一个类,这将使您的代码推理更加容易。如果事实证明这实际上导致了性能问题(在分析之后),那么只有对其进行优化(毕竟,过早的优化是万恶之源)。

【讨论】:

  • 嗯,这似乎很明显,但我还没有考虑将深度参数添加到标准 DFS 算法中。我现在觉得有点傻。无论如何,这解决了问题。非常感谢。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2011-08-29
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多