Python—有没有更好/更有效的方法来查找树中的节点?
我有如下定义的节点数据结构,不确定find_matching_node方法是pythonic还是有效的。我不太熟悉发电机,但认为使用它们可能会有更好的解决方案。有什么想法吗Python—有没有更好/更有效的方法来查找树中的节点?,python,tree,find,traversal,Python,Tree,Find,Traversal,我有如下定义的节点数据结构,不确定find_matching_node方法是pythonic还是有效的。我不太熟悉发电机,但认为使用它们可能会有更好的解决方案。有什么想法吗 class HierarchyNode(): def __init__(self, nodeId): self.nodeId = nodeId self.children = {} # opted for dictionary to help reduce lookup time
class HierarchyNode():
def __init__(self, nodeId):
self.nodeId = nodeId
self.children = {} # opted for dictionary to help reduce lookup time
def addOrGetChild(self, childNode):
return self.children.setdefault(childNode.nodeId,childNode)
def find_matching_node(self, node):
'''
look for the node in the immediate children of the current node.
if not found recursively look for it in the children nodes until
gone through all nodes
'''
matching_node = self.children.get(node.nodeId)
if matching_node:
return matching_node
else:
for child in self.children.itervalues():
matching_node = child.find_matching_node(node)
if matching_node:
return matching_node
return None
根据需要在树上执行的其他操作,以及执行此递归的频率,可以将所有子代节点存储在节点上的字典中,这样整个递归函数就可以是单个字典查找。FWIW,最好使用可重用的树数据结构,而不是重新发明轮子。根据运行时和工作负载的不同,我所看到的CPython的最佳性能如下所述:
…但简而言之,我看到的最好的是splay树、AVL树和treap。这种递归不会经常调用,因为树只有两个级别,有更多的叶节点。此外,当您说“将所有子代节点存储在字典中”时,您指的是直接子代还是所有子代。我已经将直系子代存储在字典中,而字典又可以拥有自己的直系子代字典。我需要维护每个子级的层次结构。希望我能解释清楚。如果你不经常深入研究,我的建议就不好了。我的意思是,除了直接子项字典之外,还可以存储深层子项的dict,本质上是递归搜索的缓存。谢谢。如果你不介意的话,如果必须经常进行深入的搜索,你能提供你的建议吗?如果将来有什么变化,这可能会有帮助。