Clarkson提出的最小加权顶点覆盖问题的一个着名的2近似:
Clarkson,Kenneth L."对顶点覆盖的贪婪算法的修改。"信息处理快报16.1(1983):23-25。
可以找到易于阅读的算法伪代码here,参见第32.1.2节。
根据该论文,该算法的运行时复杂度为O(|E|*log|V|)
,其中E是边集,V是顶点集。我不完全确定他们是如何得到这个结果的。
设d(v)为图中的顶点v的度数,w(v)为一些权重函数。 从算法中排除一些技术性,算法如下所示:
while( |E| != 0){ //While there are still edges in the graph
Pick a vertex v \in V for which w(v)/d(v) is minimized;
for( u : (u,v) \in E){
update w(u);
...
}
delete v and all edges incident to it from the graph.
}
外部循环在运行时复杂性中生成术语|E|
。这意味着可以在log n
时间内从最小化某个比率的顶点列表中选择一个顶点。据我所知,从值列表中找出最小值需要n-1
次比较,而不是log n
。最后,内部for循环运行v的每个邻居,因此产生d(v)的复杂性,其由n-1支配。因此,我得出结论,该算法的运行时复杂度为O(|E|*|V|)
。
我在这里缺少什么?
答案 0 :(得分:1)
将顶点保持在由w(v)/ d(v)排序的平衡二叉搜索树中。找到min是O(log | V |)。每次我们删除边缘uv时,我们必须更新你的密钥(通过删除它并用新密钥将其重新插入树中),这需要时间O(log | V |)。这些步骤中的每一步最多都完成| E |次。