快找并集运算——它和集合论中的并集一样吗

quick find union operation - is it same as union in set theory?

本文关键字:一样 集合论 运算      更新时间:2023-10-16

我无法将快速查找算法中的并集运算与集合论中A U B的一般意义联系起来。

Book(C++中的算法Robert Sedgewick)告诉联合运算是"扫描每个输入对的整个阵列。(代码中的第9行和第10行)。

基本上,我们将节点q处的值复制到与节点p具有相同值的所有其他节点。为什么我们将此操作命名为UNION?

代码是直接从书中复制的。

#include <iostream>
const int N = 10000;
int main() {
int i, p, q, id[N];
for( i = 0; i < N; i++ ) id[i] = i;
while( cin >> p >> q ) {
    int t = id[p];
    if ( t = id[q] ) continue;              //quick find operation
    for ( i = 0; i < N; i++ )               //---> union why?
        if ( id[i] == t) id[i] = id[q];
    cout << " " << p << " " << q << endl;
}
}

快速查找中的并集步骤意味着合并具有相同id的组件。从一般意义上讲,这有点像两个集合的并集。您可以考虑两个集合,onw的id1作为其所有组件的id,另一个作为id2。要获得更好的解释,请查看快速查找部分中的演示文稿:

http://www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf

查看支持的操作集。如果没有办法要求"列出所有元素",而只是插入,请查找&联合,那么使用这些操作就无法判断元素是否存在重复。它使支持的操作更加高效,并且仍然像一个集合一样(就用户所知)。

是的,这是一个联合操作。如果索引引用相同的值,则它们是同一集合的成员。代码的初始化行

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

将每个索引的值设置为其自身,使每个索引成为自己的一个成员集。

(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)...

如果添加边(1,2),并集操作将使这两个索引都引用2,使它们成为同一集合的成员。如果加上边(3,4),这两个索引将通过使它们都引用值4而统一。

此时,阵列将处于以下状态:

index: 0 1 2 3 4 5 6 7 8 9 ...
value: 0 2 2 4 4 5 6 7 8 9 ...

表示集合:

(0) (1, 2) (3, 4) (5) (6) (7) (8) (9)...

现在,如果我们再加一条边(2,3),会发生什么?任何值为2的指数都将被设置为指数3的值,将这两个集合统一在一起。数组值为:

index: 0 1 2 3 4 5 6 7 8 9 ...
value: 0 4 4 4 4 5 6 7 8 9 ...

表示集合:

(0) (1, 2, 3, 4) (5) (6) (7) (8) (9)...