联合查找算法的实现

时间:2011-11-05 22:46:26

标签: c++

我有一系列Key值对。每个Key有2个值。键的值可能重合。 最初,我从Key1开始,ValueKey1,ValueKey2存储在一个集合中(可能是数组)。

现在,对于每个连续的Keyi,我检查Valuei和Valuei + 1是否在集合中。如果其中任何一个在集合中,则加入集合。

否则,如果一个集合中存在两个KeyValues,则丢弃该密钥。

如何使用C ++实现这个功能,我很少有想法,所以如果可能的话,代码片段或提示会非常有用。

1 个答案:

答案 0 :(得分:0)

您是否正在使用或拥有'C ++中的算法'(Sedgewick,第3版)?

本书遇到的第一个问题是连接问题(第7页),其中有多个使用成对键的union-find(快速联合,快速查找,加权等)算法的实现

这是快速查找版本:(这只是书中的重新输入 - 未经测试)

#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;
        for ( i = 0; i < N; i++ )
            if ( id[i] == t) id[i] = id[q];
        cout << " " << p << " " << q << endl;
    }
}

只是不断吐出未连接的对(你可能会反转以获得你想要的东西)

这本书详细描述了它是如何运作的 - 我猜你现在已经有了它。