跳转到内容

算法性能

compat-finder 目前内置两种算法:binary-splitleave-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 · 版权说明