为什么等级不等于不相交集合中集合的高度?

时间:2019-01-27 21:00:58

标签: data-structures disjoint-sets

我最近阅读了有关数据结构disjoint-set-union的信息。我对排名启发法感到困惑。我读过“等级不是树集的高度”。

我找不到此权利要求。这是因为,当使用秩启发法进行联合时,我们可以很容易地看到秩是树集的高度,但是当我们使用路径压缩对其进行排序时,秩就不再是高度。但是,我们仍在考虑树的级别进行合并。

假设我正在调用find(a1)和find(a2),如果a1的父级高度位于从根到a1的路径中(与a2相同),它应该更改a1和a2的父级的排名。

当等级不再是树的高度时,此路径压缩如何工作?使用路径压缩时树的等级代表什么。

下面是查找和联合功能的代码。它不是一个“完整程序”。但是可以很容易地做成一个。

int find(vector<int>& parent, int i) {  
    if (parent[i] != i) 
        parent[i] = find(parent, parent[i]); 

    return i; 
} 

void union(vector<int>& parent, vector<int>& rannk, int x, int y) { 
    int xroot = find(parent, x); 
    int yroot = find(parent, y);

    if (rank[xroot] < rank[yroot]) 
       parent[xroot] = yroot; 
    else if (rank[xroot] > rank[yroot]) 
        parent[yroot] = xroot; 
    else{ 
        parent[yroot] = xroot; 
        rank[xroot]++; 
    } 
}

int main() {
    vector<int> parent(10), rank(10, 1);

    for(int i = 0; i < 10; ++i)
       parent[i] = i;

    union(2, 5);
    union(1, 3);
    union(2, 7);
    union(2, 1);
    union(9, 8);
    union(0, 8);
    union(0, 1);
}

为了理解起见,以上只是一些核心功能。

parent [i]表示元素i的父级,0 <= i <= 10 rank [i]表示集合的i(root)的等级,0 <= i <= 10

您可以很容易地看到,在每次find()调用之后,路径从一个节点压缩到其父节点(现在,它直接连接到父节点)。现在等级不是树集的高度。

此代码使用rank []确定合并。 rank [i]在这里代表什么,决定在union()中合并两个集合有什么帮助?

1 个答案:

答案 0 :(得分:0)

集合的等级除等级外不代表其他任何内容。已经使用秩证明了使用路径压缩和逐级并集的不相交集结构的近恒定摊销时间性能,因此我们继续使用逐级并集,以便获得证明的性能。

我敢肯定,使用按大小合并的路径压缩已证明了相同的界限,如果您要这样做,这也很容易。

按路径高度合并不是可行的选择,因为路径压缩使跟踪高度变得昂贵。当您使用路径压缩时,众所周知,等级和高度是相同的。