一种智力非常高的模组错误排查方法
Mulatram One

介绍了一种基于拓扑排序+二分的快速排查错误的启发式算法(仅在只有一个自身坏的包时保证正确性)。

前言

社区里一直有一个神秘的错误排查方法,就是“二分”。这个策略非常有效当崩溃报告难以分析出原因时。
但是考虑到复杂的依赖关系,手动“二分”只能建立在模组相对独立的条件下。
最近看见Lucy就想起来这茬了。

创新点,,,

MC模组的依赖关系可以看作一个DAG(要是有环就神了)。我们的需求是,找到错误的模组(只有一个错误的模组)。
然后我们很明显发现,如果单纯按字典序或者什么序二分,容易造成有的模组找不到依赖。
聪明的朋友已经想到了,,,
我们可以使用拓扑排序(拓扑排序是指对于一个有向无环图G,给出一个每个节点的排列P,使得G中每条边U->V,都有U在排列中比V出现早的算法,常用Kahn或DFS)
然后再拓扑序里相当于二分答案最早的错误模组出现的位置。

缺点

很明显,它只在一个错误模组的情况下保证正确。
而且大部分模组本身不是坏的,和其他模组呆在一起就坏了。这种情况下只能找到拓扑序里先出现那个。
当然,如果找出所有错误模组和哪几个模组不兼容的关系,不难发现时间复杂度必然是非多项式的。
也就是说这无疑是缓慢的。

优点

假设依赖关系DAG的边数是EE,顶点数(模组数)是VV
拓扑排序的时间复杂度是O(E+V)\mathcal{O}(E+V)
二分的时间复杂度是O(logV)\mathcal{O}(\log V)
所以这个算法的时间复杂度是O(E+V+logV)\mathcal{O}(E+V+\log V)
需要用户回应的次数的复杂度是O(logV)\mathcal{O}(\log V)
这无疑是迅速的,,,
应该是正确性和速度平衡的一个算法

 评论
评论插件加载失败
正在加载评论插件