这两种查找算法有什么区别?

时间:2012-09-09 02:26:14

标签: algorithm

我有这两个查找算法对我来说是一样的。任何人都可以帮我解释为什么他们实际上不同?

Find ( x ) :
    if x.parent = x then 
        return x
    else 
        return Find ( x.parent )

VS

Find ( x ) :
    if x.parent = x then 
        return x
    else 
        x.parent <- Find(x.parent)
        return x.parent 

我将第一个解释为

 int i = 0;    
 return i++;

而第二个为

int i = 0;
int tmp = i++;
return tmp

对我来说完全一样。

2 个答案:

答案 0 :(得分:4)

这看起来像Disjoint-set data structure

现在问题:

为了清楚起见,第一个版本是FindA,第二个版本是FindB

假设你有结构:

 0
 |
 1
 |
 2
 |
...
 n

第一次调用FindA(n)将在O(n)中返回0,第二次调用将在O(n)中返回0,依此类推。

如果你打电话给FindB(n),它会在O(n)中返回0,但也会修改结构:

    0
 / /|\
1 2...n 

现在对FindB(n)的第二次调用将在O(1)中返回0。超过FindB(k)将在O(1)中返回0。

答案 1 :(得分:2)

第二个会将x.parent的值更改为查找结果的副作用