You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树总分支数计算问题:自定义方法结果与实际不符的技术求助

问题分析与解决方法

首先,咱们先明确问题核心:你要计算的是树中所有父节点到子节点的分支(边)总数,但你的代码遗漏了最顶层「根节点到第1层节点」的分支,这就是结果差3的原因。

先拆解你的代码问题

你的代码计算了:

nrow(unique(M[,1:2])) + nrow(unique(M[,1:3])) + nrow(unique(M[,1:4]))

这对应的是第1→2层、第2→3层、第3→4层的分支数,但漏掉了最关键的「根→第1层」的分支(这部分有3条,正好是18和21的差值)。

正确的计算逻辑

树的总分支数是每一层父节点到子节点的边数之和:

  1. 根节点 → 第1层:等于第1层的唯一节点数(因为根节点连接每个不同的第1层节点都算一条分支)
  2. 第1层 → 第2层:等于前两列的唯一组合数(每个唯一的(层1,层2)对应一条分支)
  3. 第2层 → 第3层:等于前三列的唯一组合数
  4. 第3层 → 第4层:等于全部四列的唯一组合数

实现代码

分步写法(清晰易懂)

# 根到第1层的分支数:第1列的唯一值数量
root_to_l1 <- nrow(unique(M[, 1, drop = FALSE]))
# 第1→2层分支数
l1_to_l2 <- nrow(unique(M[, 1:2]))
# 第2→3层分支数
l2_to_l3 <- nrow(unique(M[, 1:3]))
# 第3→4层分支数
l3_to_l4 <- nrow(unique(M[, 1:4]))

# 总分支数
total_branches <- root_to_l1 + l1_to_l2 + l2_to_l3 + l3_to_l4
total_branches  # 输出结果为21,符合预期

简化写法(一行搞定)

sum(sapply(1:4, function(k) nrow(unique(M[, 1:k, drop = FALSE]))))

验证结果

咱们手动算一遍:

  • 根→第1层:3条(第1列唯一值是1、2、3)
  • 第1→2层:4条(前两列唯一组合是(1,1)、(2,2)、(3,2)、(2,1))
  • 第2→3层:6条(前三列唯一组合共6种)
  • 第3→4层:8条(四列全组合都是唯一的)
    总和:3+4+6+8=21,完美匹配预期。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:10