算法 - 消除循环

时间:2014-01-10 21:46:57

标签: algorithm

有向图中的通用接收器是顶点v,其中v的入度为 | V | -1和out-degree是0.

我可以通过以下算法确定有向图G是否具有通用接收器。 注意:G表示为邻接矩阵AdjM,并给出AdjM:

for (i=1 to |V|) 
   if (AdjM[i,1] + AdjM[i,2] + AdjM[i,3] + ... + AdjM[i,|V|] == 0) 
     && (AdjM[1,i] + AdjM[2,i] + AdjM[3,i] + ... + AdjM[|V|,i] == |V|-1) 
    then return i;  // i is a universal sink 

我通过写全部解决了O(| V |)时间内的这个问题 | V | adjM [i,]和AdjM [,i]值在代码中,从而消除了内部循环来进行这些求和。

有没有办法做到这一点 - 在没有明确的情况下在O(| V |)时间内解决它 使用每个AdjM [i,]和AdjM [,i]作为总结中的术语对求和进行编码?

使用逐位操作必须有更好的方法,但我现在看不到它。

这是CLRS,第530页“图表的表示”一节中的Q 22.1-6。

提前致谢。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用一个通用接收器轻松构建图形,并通过仅更改AdjM中的一个值将其更改为没有通用接收器的图形。这意味着您必须检查AdjM中的每个值,以确定是否存在通用接收器。

无论你如何巧妙地操纵索引和指针,你都无法击败O(| V | ^ 2)。

答案 1 :(得分:0)

这可以在O(| V |)中完成,如图here

所示

答案 2 :(得分:-1)

基本上,你不需要总和。你可以检查一下

  • 所有AdjM[i, _]均为0
  • AdjM[_, i]外,所有AdjM[i, i]均为1。

但是,我不知道如何消除循环。带有检查的解决方案通常会更快,因为一旦条件检查失败,您就可以摆脱循环。