跳转到内容

算法性能 ​

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 最明显占优的情况之一。

最终结果只包含 1 个目标时的轮次对比

结果很少时 ​

当最终不兼容目标只占总目标数的 12.5% 时,binary-split 的优势很明显。

最终结果占总目标数 12.5% 时的轮次对比

最坏情况的分界附近 ​

当最终不兼容目标占比接近 13.77% 时,两种算法在最坏情况上的差距开始变得接近。

最终结果占总目标数约 13.77% 时的轮次对比

平均轮次的分界附近 ​

当最终不兼容目标占比接近 22.83% 时,两种算法在平均轮次上的优劣开始反转。

最终结果占总目标数约 22.83% 时的轮次对比

当不兼容目标很多时 ​

当最终结果接近“全部目标都有问题”时,leave-one-out 的轮次更稳定,也往往更少。

最终结果覆盖全部目标时的轮次对比

代码 MIT · 文稿 CC BY-SA 4.0 + SATA · 版权说明