解释这段代码?

时间:2016-02-27 21:37:02

标签: c algorithm quick-union

我正在研究Quick-Union算法,但无法完全理解这段代码:

 #include <stdio.h>
 #define N 10000
 main()
 {
    int i,p,t,id[N];
    for (i = 0; i < N ; i++) id[i]= i;
    while (scanf ("%d %d\n" , &p, &q) == 2)
    {
     for(i = p; i != id[i]; i = id[i]) ; 
     for (j = q; j != id[j]; j = id[j]) ;
     if (i == j) continue;
     id [i] = j ;
    }
}

我的主要问题是for循环。如果满足conditioninit,则增量语句会做什么?

注意:这不是教科书,而是我的代码!

3 个答案:

答案 0 :(得分:1)

这是union-find数据结构的内联实现。 union-find数据结构将不相交的集合表示为树。它将每个节点的父节点存储在id数组中。最初,每个节点都是它自己的父节点(形成一个单独的树)。这就是以下几行:

for (i = 0; i < N ; i++) id[i]= i;

使用

for(i = p; i != id[i]; i = id[i]) ; 

您遍历p所在的树,直至其根。部分i = id[i]将当前节点更改为当前节点的父节点。

q也是如此。最后,如果两棵树不是同一棵树,它们就会被合并。

id [i] = j ;

答案 1 :(得分:-1)

首先根据标准

使用带有int的main函数的返回类型

for(i = 0; i&lt; N; i ++)id [i] = i; 此循环将所有值从0写入数组id[i]

    while (scanf ("%d %d\n" , &p, &q) == 2)
    {
     for(i = p; i != id[i]; i = id[i]) ; 

//在这个循环中,如果条件为真,它将从用户那里获取输入并检查是否在数组id中具有相同的索引,你将为i赋予索引中的值。

//如果没有满足条件,它将转到下一个循环

     for (j = q; j != id[j]; j = id[j]) ;

//与上面的循环相同,输入不同。          if(i == j)继续;          id [i] = j;         }

答案 2 :(得分:-1)

这是一个解释,因为我理解代码:

#include <stdio.h>

#define N (10000)

int main( void )
{
    int i;
    int p;
    int t;
    int id[N];

    // initialize array id[]
    for (i = 0; i < N ; i++)
    {
        id[i]= i;
    }

    /*
     * IMO:
     * bad idea to be asking for two integers without prompting the user
     * bad idea to use the two values without checking that they are in the range 0...(N-1)
     * this code performs nothing useful
     * the array id[] becomes more 'modified' the more numbers are entered
     * */

    // read two integers, if successful then
    while (scanf ("%d %d\n" , &p, &q) == 2)
    {
        // looping, searching array id[] to see if properly initialized/updated
        for(i = p; i != id[i]; i = id[i]) ;

        // looping, searching array id[] to see if properly initialized/updated
        for (j = q; j != id[j]; j = id[j]) ;

        // when same value extracted from array id[] for both inputs then
        // return to top of loop
        if (i == j) continue;

        // when not the same value, update array id[] with other value
        id [i] = j ;
    }
}