我有这两个查找算法对我来说是一样的。任何人都可以帮我解释为什么他们实际上不同?
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
对我来说完全一样。
答案 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的值更改为查找结果的副作用