算法将路径从一个顶点返回到树形图中的所有其他顶点

时间:2015-10-29 10:12:29

标签: matlab tree traversal depth-first-search

如果我有一棵树是图G上的最小生成树,并且我想计算从一个顶点到树上所有其他顶点的路径,那么最好的方法是什么?

我认为最好使用堆栈数据结构来存储路径,并递归使用DFS - 将每个新顶点添加到堆栈中,一旦没有更多未访问的节点,将该堆栈存储为路径,继续..或者,在伪代码中:

P = {}
stack = []
visited = []
dfs(root_node, stack, visited, P)

def dfs(curr_node, stack visited, P):
    push curr_node to stack
    for all n connected to curr_node
        if n not in visited
            dfs(n, stack visited, P)
    add current stack to P
    pop curr_node from stack
    mark curr_node as visited         
这会有用吗?是否有更好的方式让人们建议我这样做?

另外,如果我想在matlab中实现这个,我是否应该考虑哪些因素?我知道matlab中没有堆栈数据结构,但我想我可以使用这样的矢量:

% push
stack = [stack, val];
% or
stack(end+1) = val;

% pop
stack(end) = [];

可以使用吗?什么版本的推送会更好?

1 个答案:

答案 0 :(得分:1)

如果您在潜入相邻图节点之前标记了访问的节点,那么您的算法将会起作用。否则,您的DFS将永久地在根节点和邻接列表中的第一个节点之间跳转。当然,如果您的图表是定向的,那就不会发生。

pushpop通过增长和缩小向量在MATLAB中很好地适用于小堆栈。但是如果你有很多节点,你最好用经典的方式实现它。即预分配数组,声明堆栈指针,并操纵:

N = size(adjacency_matrix, 1); the number of nodes

% create
stack = zeros(N,1);
sptr  = 0;

% push
sptr = sptr + 1;
stack(sptr) = val;

% pop
if sptr > 0
        sptr = sptr - 1;
end;

否则,在推送新元素(应该是O(1))时,你最终会得到碎片化内存和二次执行时间。