问题:在有向循环图中给定边对象时找到前n个最近边(2000)。
数据结构:链接类和Node类。链接类有一个from和to节点,它指向各自的节点对象。节点对象具有链接对象的传入和传出列表。
错误:我遇到了 RuntimeError:超出最大递归深度。你能不能帮我找到解决方法。让我知道逻辑是否有问题或代码需要优化。我相信我遵循BFS策略,即从可以遍历的对象相关节点中进行排队,看看它是否已被访问并尝试递归。
def start_search(self,link_object,neighbour_links):
buffer_links=[]
link_object.visited_flag=1
neighbour_links.append(link_object)
from_node=link_object.from_node
to_node=link_object.to_node
[buffer_links.append(link_object) for link_object in from_node.incoming_links]
[buffer_links.append(link_object) for link_object in from_node.outgoing_links]
[buffer_links.append(link_object) for link_object in to_node.outgoing_links]
[buffer_links.append(link_object) for link_object in to_node.incoming_links]
while len(buffer_links)>0 and len(neighbour_links)<1000:
link_object=buffer_links.pop()
if link_object.visited_flag==0:
self.start_search(link_object,neighbour_links)
return neighbour_links
答案 0 :(得分:1)
您可以避免在节点上使用前进波前算法(广度优先搜索)来使用递归。这是算法的概述,它是一个很小的改编,使其适用于边缘:
top_dist
跟踪拓扑距离。dist = 0
wavefront
。top_dist[node] = dist
中的每个节点设置wavefront
。wavefront
以外的top_dist
附近的每个节点,添加该节点以设置next_wavefront
。dist
wavefront = next_wavefront
如果某些节点未被访问,则该图表具有多个弱组件。
如果步骤3中的初始节点是初始边缘的端点,则可以使用边缘节点上的top_dist
贴图来获取边缘的距离。我认为距离边缘的有用定义是min(top_dist(e1), top_dist(e2)) + 1
。现在你与每条边有距离,你可以抓住最近的2000。
该算法为O(| N | + | E |) - 边缘和节点数之和的线性。
答案 1 :(得分:0)
使用表示为映射到其后继者的节点字典的DAG,您可以在发现它们时循环遍历节点:
>>> def bfs(dag, start, maximum):
'Breadth-first search up to a given maximum number of nearest nodes'
nearest = [start]
seen = {start}
for pred in nearest:
for succ in dag.get(pred, ()):
if succ not in seen:
seen.add(succ)
nearest.append(succ)
if len(nearest) == maximum:
return nearest
return nearest
>>> dag = {'start': ['a', 'b', 'c'],
'b': ['m', 'n'],
'c': ['n', 'z'],
'n': ['z'],
}
>>> bfs(dag, 'start', 5)
['start', 'a', 'c', 'b', 'z']