快找并集运算——它和集合论中的并集一样吗
quick find union operation - is it same as union in set theory?
我无法将快速查找算法中的并集运算与集合论中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)...
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 堆栈和队列是否像C++中的数组一样传递?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 我们可以将集合的值存储在变量中吗?就像我们可以将数组的值存储在变量中一样
- 我如何在C++像在 Python 中一样实现 f 字符串?
- 自制的上衣:看起来一样,但不完全相同
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 像 CPP 中的控制台一样的应用程序
- 为什么C++中没有常量引用,就像常量指针一样?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 有没有像给定的一样的 std::optional_function
- Java 是否像C++模板一样具有泛型推论?
- 记忆栅栏和记忆屏障是一样的吗
- 对象作为参数传递,就好像我们正在传递构造函数值一样
- 像自定义类一样构造的指针(内置类型)如何工作?
- 快找并集运算——它和集合论中的并集一样吗