算法性能
compat-finder 目前内置两种算法:binary-split 和 leave-one-out。
这里的“性能”主要指排查过程中需要多少测试轮次。
太长不看
leave-one-out在绝大多数情况下的询问次数都是n;只有当最终结果覆盖全部目标时,会变成n + 1。binary-split的询问次数会随着最终结果的数量和分布位置变化,通常介于max(1, ceil(log2(n)))到2n - 1之间。
| 观察维度 | 条件 | 更占优的算法 |
|---|---|---|
| 平均询问次数 | 最终不兼容目标约占总目标数 22.84% 到 100% | leave-one-out |
| 平均询问次数 | 最终不兼容目标占比低于 22.83% | binary-split |
分界点大约在 13.77% 左右;再往下,在大多数情况下,binary-split 的最坏情况也优于 leave-one-out。
结论:binary-split 仍然作为默认算法,因为真实排查里,更常见的是“有问题的占少数”。
怎么选
- 你怀疑最终只会找到少数几个不兼容目标:优先用
binary-split - 你怀疑会找到很多不兼容目标:可以考虑
leave-one-out - 你不确定:先用默认的
binary-split - 你想看 CLI 或 API 里怎么切换算法:继续阅读 命令行工具 和 API 参考
整体趋势
下图汇总了所有非空结果集的整体表现。
当最终只会找到 1 个目标时
单目标场景是 binary-split 最明显占优的情况之一。
结果很少时
当最终不兼容目标只占总目标数的 12.5% 时,binary-split 的优势很明显。
最坏情况的分界附近
当最终不兼容目标占比接近 13.77% 时,两种算法在最坏情况上的差距开始变得接近。
平均轮次的分界附近
当最终不兼容目标占比接近 22.83% 时,两种算法在平均轮次上的优劣开始反转。
当不兼容目标很多时
当最终结果接近“全部目标都有问题”时,leave-one-out 的轮次更稳定,也往往更少。