返回什么(pset [i] == i)? I:(PSET [I] = findSet(PSET [I]));意思?

时间:2015-04-20 22:54:39

标签: c++ graph kruskals-algorithm

我正在实施Kruskal算法,我找到了这段代码:

   int findSet(int i)
   {
    return (pset[i]==i)? i:(pset[i]=findSet(pset[i]));
   }

我不知道究竟是什么意思,请帮忙吗? :)

3 个答案:

答案 0 :(得分:2)

?:conditional operator in C++。它等同于if-then-else语句。所以这段代码相当于:

int findSet(int i)
{
    if (pset[i]==i)
    { 
        return i;
    }
    else
    {
        pset[i]=findSet(pset[i]));
        return pset[i];
    }
}

在Kruskal的算法中,这会找到其表示其参数的集合(即其祖先树的根)

答案 1 :(得分:1)

我认为三元运算符(?:)让您感到困惑,让我们用if-else替换它

int findSet(int i)
{
  if (pset[i]==i)
    return i;
  else 
  {
    pset[i]=findSet(pset[i]);
    return pset[i];
  }      
}

希望你现在更清楚。

答案 2 :(得分:0)

看起来像find union算法实现(查找方法)。

例如 pset是具有父项索引的数组,例如: pset [] = {0,2,3,0}

所以我们知道索引1(pset 1)的父级是2,2的父级是3的父级3是0而0是根(因为parent[0] == 0,更通用{{1 })。 算法find(i)始终返回根值,因此在此示例中始终为0。 在这个算法中,当我们找到根时,parent[i] == i为真,我返回,否则我们通过执行遍历结构:

(pset[i]==i) ? i

分配是为了加快下一个查询find(i); 阅读一些关于不相交集数据结构的文章。