比较 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,这应该会使对您的代码的推理变得更加容易。如果事实证明这实际上导致了性能问题(在分析之后),那么只有优化它(毕竟,过早的优化是万恶之源)。
首先,我必须承认,我对所有与图形相关的事情都很不擅长。我的树被实现为代表未加权马尔可夫链的嵌套字典。
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,这应该会使对您的代码的推理变得更加容易。如果事实证明这实际上导致了性能问题(在分析之后),那么只有优化它(毕竟,过早的优化是万恶之源)。