软件依赖树
2026 华为OD机试真题 7月12日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
在软件构建中,模块之间存在复杂的依赖关系。请基于给定的依赖规则和项目的直接依赖列表,按照依赖解析规则展开完整的依赖树,按 BFS 顺序输出所有依赖组件及其版本号。
2026 华为OD机试真题 7月12日华为OD上机新系统考试真题 100 分题型
数据格式
- 直接依赖
directDeps:项目所直接依赖的组件列表。每条格式为name:version[:exclusions],多个组件用英文逗号分隔,多个排除项用逗号分隔。例如["A:1.0","B:2.0:C,D"]。 - 依赖规则
depRules:每个组件的子依赖列表。每条格式为name:depname:depversion[:exclusions],表示name依赖depname(版本depversion),若附带排除项则name的依赖传递中排除这些名字。
解析规则
- 从直接依赖出发,依次展开每个组件的子依赖,形成依赖树。
- 使用 BFS(广度优先)遍历组件,同一层中按声明顺序处理父组件,父优先。
- 同一组件只保留首次出现的位置,后续重复依赖需要去重。
- 排除项沿路径向下传递:被排除的组件及其整个子树都不会被加入。
- 子规则的
exclusions与路径上的父级exclusions做集合并集后继续下传。
输出
按 BFS 顺序输出所有依赖组件(去重后),每个组件输出为 name:version。
输入描述
- 参数1:
directDeps(字符串数组):项目直接依赖列表。 - 参数2:
depRules(字符串数组):依赖规则列表。
输出描述
按解析后 BFS 顺序输出每个依赖项,格式为 name:version,用逗号分隔,整体用方括号包围,例:["A:1.0","B:1.0","C:1.0"]。
示例1
输入
["A:1.0"]
["A:B:1.0","A:C:1.0"]
输出
["A:1.0","B:1.0","C:1.0"]
说明
- 项目直接依赖 A:1.0。
- A 声明依赖 B:1.0 和 C:1.0。
- BFS 顺序:A → B → C。
示例2
输入
["A:1.0:EXCL"]
["A:B:1.0","B:C:1.0"]
输出
["A:1.0"]
说明
- 项目直接依赖 A:1.0,并排除 EXCL。
- A 规则依赖 B,但在 A 路径上没有任何名为 EXCL 的子依赖,因此该排除集合不影响 B。
- 但当 A 处理完直接依赖即终止,不引入 B,因此输出仅
A:1.0。
解题思路
核心思想
依赖树展开本质是广度优先搜索(BFS):从直接依赖出发,逐层展开所有子依赖,同时维护已访问集合用于去重,使用排除集合沿路径传递来剪枝。
算法步骤
- 解析规则:将
depRules解析为name → [(depname, depversion, excl_set), ...]的映射,保持声明顺序。 - 初始化队列:将每条直接依赖
(name, version, excl)加入队列。 - BFS 遍历:
- 取出队首
(name, version, excl),若已访问则跳过。 - 加入答案
name:version,标记已访问。 - 遍历该组件的子依赖规则:若
depname被当前excl排除则跳过;否则将(depname, depversion, excl | child_excl)加入队列。
- 取出队首
- 返回结果列表。
复杂度分析
- 时间复杂度:O(N + M),N 为依赖组件数,M 为规则数。每个组件最多入队一次。
- 空间复杂度:O(N + M),用于规则表、队列、答案和已访
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/696
文章版权归作者所有,未经允许请勿转载。
THE END