首先,我应该承认我对与图有关的一切都很糟糕。我的树被实现为嵌套字典,代表未加权的马尔可夫链。
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。
如果您可以为我的树提出更好的数据结构,我会非常感激。我和词典一起去获得最大的时间表现。先感谢您。
答案 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
是什么,很难建议更合适的结构。但是,我强烈建议您为节点创建一个类,这样可以更轻松地推断您的代码。如果事实证明这实际上导致了性能问题(在分析之后),那么只有优化它(毕竟,过早优化是所有邪恶的根源)。