【发布时间】:2022-12-11 17:27:07
【问题描述】:
我正在尝试理解 bfs 和 dfs 的输出。我有一些正在执行注册的 3d 点云,我想从中导出一系列沿边缘的成对注册。这些成对注册依赖于从种子子样本开始的先前注册。
因此,我试图从种子边(或顶点)获取边的有序列表,以便可以通过树正确传播成对比较。
我一直在尝试使用 bfs 和 dfs 但无法理解输出来构建我的有序边列表。
图书馆(igraph)
edges <- data.frame(
from = c(2,14,8,17,11,16,14,12,14,13,14,16,13,19,15,23,21,21,22,23,20,22),
to = c(1,1,2,2,3,3,4,5,5,6,7,8,9,10,11,13,16,18,18,18,19,20),
dist = c(1.7479352,4.1400081,0.9064689,0.5735992,0.7550112,1.3880579,1.6968155,
1.0064647,2.7119138,2.4033570,3.7260517,1.1921137,2.0857017,0.2903520,
1.4191598,0.6111305,1.5752026,1.3102844,0.5070067,0.6522495,0.3172266,
0.6373009
))
g <- graph.data.frame(edges, directed = F)
plot(g)
https://i.stack.imgur.com/I5xd0.png
然后我选择种子作为它们之间距离最大的一对并运行bfs或dfs
seedPair <- edges[which.max(edges[,3]),1:2]
> seedPair
row col
2 14 1
为简单起见,我直接输入顶点 14 作为根
path <- bfs(g, root = 14, father = T, rank = T)
> path
$root
[1] 14
$mode
[1] "out"
$order
+ 23/23 vertices, named, from 192f5fa:
[1] 20 19 22 10 18 23 21 13 16 6 9 8 3 2 11 17 1 15 14 4 5 7 12
$rank
2 14 8 17 11 16 12 13 19 15 23 21 22 20 1 3 4 5 6 7 9 10 18
14 19 12 16 15 9 23 8 2 18 6 7 3 1 17 13 20 21 10 22 11 4 5
$father
+ 23/23 vertices, named, from 192f5fa:
[1] 2 14 8 17 11 16 12 13 19 15 23 21 22 20 1 3 4 5 6 7 9 10 18
path <- dfs(g, root = 14, order = T, order.out = T, father = T)
> path
$root
[1] 13
$mode
[1] "out"
$order
+ 23/23 vertices, named, from 192f5fa:
[1] 20 19 10 22 18 23 13 6 9 21 16 8 2 17 1 14 4 5 12 7 3 11 15
$order.out
+ 23/23 vertices, named, from 192f5fa:
[1] 10 19 6 9 13 23 17 4 12 5 7 14 1 2 8 15 11 3 16 21 18 22 20
$father
+ 23/23 vertices, named, from 192f5fa:
[1] 2 14 8 17 11 16 12 13 19 15 23 21 22 20 1 3 4 5 6 7 9 10 18
$dist
NULL
$neimode
[1] "out"
看看 mst,如果我从顶点 14 开始,这些输出对我来说都没有意义。dfs 对我来说更直观,更容易遵循边序列,但我也不明白为什么它返回root 为 13,但实际上从节点 20 开始。
我将非常感谢任何有助于理解这些输出的帮助,或从种子位置获取有序边缘序列的替代方法。谢谢!
【问题讨论】:
-
- 关于根。当我从顶点 1 开始运行 bfs 时,我得到了 $root = 0。这可能是一个错误,例如原始 c 库中的编号从零开始运行,而不是 R 中的 1。