题目重点:test(S) 仅在全好时为 True,集合大小至少 2 且并行集合不可重叠;证明无先验时无法总能找全坏节点。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 测试确定性、没有 false positive/negative,任何大小 2 到 N 的集合都可测;单节点测试不允许。
- 不预设坏节点数上限。训练版先证明一般情形不可完全辨识,再讨论额外已知好节点的可解版本。
- 并行限制只约束同一时刻的集合;顺序轮次可以复用节点。
解题路线
- 观察所有允许测试都为 False 时,‘全部坏’与‘恰好一个好’产生完全相同的观测;自适应选下一组也无法区分。因此原目标在无额外先验下不可能对所有隐藏状态保证找全。
- 若某次 test(S)=True,则 S 内至少有两个已知好节点。拿其中好锚点 g 与每个未定节点 x 依次测 {g,x}:True 则 x 好,False 则 x 坏,最多 N−|S| 次额外测试。
- 若已知至少两个好节点但不知道位置,可枚举节点对直到找到 True;最坏可能测试 O(N²) 对(例如只有两个好且恰好最后测到)。找到后按锚点分类其余节点。
- 若额外给一个已知好节点,直接与每个其余节点配对即可 O(N) 测试;若只是保证至少两个好但要求节省测试,可设计自适应分组,但先给上述正确上界。
- 并行时不让好锚点进入两组同一轮;要并行分类可使用多个互不重叠的已知好锚点或将含锚点的测试串行化。节点复用冲突必须体现在调度器中。
手动走一遍
N=3,状态 [坏,坏,坏] 与 [好,坏,坏]:任何合法 2/3 节点测试都含坏,全部 False,算法无法确定 1 号是否好。若测试 {2,3} 得 True,则 2、3 都好;测 {2,1} 得 False,1 必坏。两测试可顺序执行,共享 2 不违反‘不得同时’。
规模与取舍
无额外先验时一般问题无解。已知一个好锚点时 O(N) 次测试、O(N) 状态存储;保证至少两个好但未知位置时朴素枚举好 pair 最坏 O(N²) 次,加分类 O(N)。单锚点分类不能并行发多次,因为测试集合共享该节点。
易错点与追问
容易失分的边界
- 一次 False 就断定组内每个节点都坏;实际只保证至少一个坏。
- 把‘找一个好节点’当成免费原语,忽略 |S|≥2 下最坏状态无 True。
- 同时用同一好锚点测试多个节点,违反并行不重叠。
- 声称所有隐藏状态都能找全,却不给坏节点数量先验。
继续深挖
- 若预知最多 K 个坏节点,怎样减少测试?
- 若 test 有误报/漏报怎样重复验证?
- 单轮可用多少测试资源,如何排不相交组?
- 若恰好一个好节点,是否有任何测试策略能定位它?为什么?
