假设我有以下有向无环图(DAG),每个节点的权重为1。
我对基于祖先节点的值计算每个节点的累加和感兴趣。假设如我之前所说,每个节点的权重都是1,则我期望得到以下结果。
更新#3
我放置的示例很简单,旨在易于理解目标,但是,我没有指定它应该适用于具有三种不同拓扑结构的许多节点的图形。最外层是树,中间层是环,最内层是完全网格。
这是我尝试做的:
library(tidygraph, quietly = TRUE)
library(tidyverse)
library(ggraph)
# create adjacencies
grafo_df <- tribble(
~from, ~to,
"C", "A",
"C", "B",
"A", "D",
"B", "D")
# create the graph
grafo <- as_tbl_graph(grafo_df)
# calculate accumulated sum
grafo %>%
arrange(node_topo_order()) %>%
mutate(
revenue = 1,
cum_weight = map_dfs(1, .f = function(node, path, ...) {
sum(.N()$revenue[c(node, path$node)])
})) %>%
as_tibble() %>%
unnest("cum_weight")
#> # A tibble: 4 x 3
#> name revenue cum_weight
#> <chr> <dbl> <dbl>
#> 1 C 1 1
#> 2 A 1 2
#> 3 B 1 2
#> 4 D 1 3
由 reprex package (v2.0.0) 于2021年5月13日创建
正如您所见,D的累加和为3而不是4,因为D的值应该是A和B的累加值之和。我不明白为什么D没有增加4。
我试图理解这里给出的解决方案,但很难理解。
我该如何得到累计总和?
更新#1
目前我不关心算法的复杂度,即使算法以O(V + E)完成也不相关。
这个问题中提到的一个重要问题是重复计数的问题,也就是说,A的部分值之和等于C(1) + A(1) = 2,B的部分值之和等于C(1) + B(1) = 2,因此,D的值不等于A(2) + B(2)的部分和,因为C的值会重复计算。我认为这种情况不适用于以下原因:
让我们想象一下,这4个节点(A、B、C和D)都是互联网节点,每个节点产生1美元的收入,因此4个节点的总累积收入将达到4美元。如果D是其他节点的汇聚节点,在D停止工作的情况下,剩余节点的收入和D的收入将不再可能,因此其价值为4美元。
更新 #2
如果我从C到D添加了一条新路径,那么D的值应该始终为4,因为依赖节点的数量是维护的,也就是说,在累加和中应该考虑依赖节点的数量。例如,在@ThomasIsCoding提出的解决方案中,如果我添加这个新路径,则D的值现在为5,我认为部分原因是他们的算法使用度数作为参数来计算累积和,然而,如果我添加一个额外的节点,则计算是正确的。更新#3
我放置的示例很简单,旨在易于理解目标,但是,我没有指定它应该适用于具有三种不同拓扑结构的许多节点的图形。最外层是树,中间层是环,最内层是完全网格。