题目重点:先找被删路径下的直接读取者,再沿服务产物依赖传播;说明目录前缀、输出顺序与环处理。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 只讲条件化算法,不冒充原测试格式:路径按目录组件规范化,/a 是 /a/b 的祖先却不是 /ab 的祖先;删除目录影响其子孙读取,不波及同父目录的无关兄弟。
- A.write_to 与 B.read_from 完全匹配或满足约定的目录包含关系时建 A→B。删除是否影响写入者、每个 deleted path 分别输出还是合并输出、同层排序都须核实。
解题路线
- 解析服务并规范化路径,拒绝 `..` 等歧义。按目录组件建 Trie,节点关联读取该路径/子孙的服务;避免字符串 startsWith 误伤。
- 对每个 deleted path 定位其 Trie 子树,取直接读取受删位置的服务作种子;同父目录其他子树不能未经规则就纳入。
- 建立 writer path→reader 的有向服务图,从种子 BFS 传播,visited 防环和重复。输出若需因果层次可按 BFS 距离,若需依赖先后则在 DAG 做拓扑排序;有环先缩强连通分量,组件内部无严格先后。
- 多个删除目录有祖先包含时可去冗余;为每个影响服务记录触发它的路径与上游服务,便于解释和复核。
手动走一遍
A 读 /data/raw/a、写 /stage/x;B 读 /stage/x;C 读 /data/raw/b。删 /data/raw/a 时 A 直接受影响,B 经 A→B 传播;同父目录的 C 不受影响。删 /data/raw 时 A 与 C 都直接受影响。
规模与取舍
S 个服务、P 个总路径组件、D 条依赖边:建索引约 O(P+D),单次删除定位加命中输出和图传播约 O(路径长+S_reached+D_reached);Trie 与依赖图空间 O(P+S+D)。输出规则若需排序再加排序成本。
易错点与追问
容易失分的边界
- 把 /ab 错作 /a 的子路径。
- 只找直接读取者,漏掉 write→read 传播。
- 把所有同父目录服务都算影响。
- 图有环还直接声称可拓扑排序。
- 把训练路径规则伪称原题规则。
继续深挖
- 多个 read/write 路径如何建边?
- 多个删除源影响同一服务如何展示原因?
- 有环时恢复顺序怎样确定?
- 频繁路径变更时 Trie 和图如何增量更新?
