使用kruskal算法创建更糟糕的案例场景

时间:2014-04-24 19:58:37

标签: c++ algorithm testing big-o kruskals-algorithm

我在C ++中实现了Kruskal的算法(使用不相交的数据集结构)。我正在尝试找到可能的方法来为算法的总运行时间创建更糟糕的案例场景测试用例。然而,我很困惑,在尝试创建测试用例时,什么可以使算法导致最坏的情况,并且想知道这里是否有人可能知道可能会使Kruskal的算法崩溃的场景。

截至目前,我认为可能在理论上测试Kruskal算法范围的主要测试是所有权重相同的测试用例。一个例子如下:

4 4 
(4, 4) 4 //(4,4) vertex and weight = 4
(4, 4) 4 
(4, 4) 4 
(4, 4) 4 

我最终遇到的是,无论我做什么,如果我尝试减慢算法速度,我最终没有最小生成树,最终无法实际测试算法的界限。

2 个答案:

答案 0 :(得分:4)

为了强调Kruskal的算法,你需要一个尽可能多的冗余边的图,以及至少一个必须考虑最后的边(因为Kruskal的算法按重量对边进行排序)。这是一个例子。

enter image description here

重量为1的边缘是必要的,将首先拍摄。重量为2的边缘是多余的,会导致Kruskal的算法在到达重量为3的边缘之前浪费时间。

请注意,Kruskal算法的运行时间主要取决于按重量对边缘进行排序的时间。添加中等重量的额外冗余边缘将增加排序时间和搜索时间。

答案 1 :(得分:0)

Kruskal的算法包括两个阶段 - 对边进行排序而不是执行联合查找。如果使用不相交的集合林实现第二阶段并通过等级启发式应用路径压缩和并集,则排序将比第二阶段慢得多。因此,要为Kruskal创建最糟糕的情况,您应该为您正在使用的排序算法生成最坏情况。如果你使用内置排序,它有一个优化,实际上使它对已经排序的数组更快地工作。