改進路徑壓縮

如果我們在 union-find 資料結構上做了很多 merge 操作,parent 指標所代表的路徑可能會很長。如理論部分所述,路徑壓縮是一種緩解此問題的簡單方法。

我們可能會嘗試在每次第 k 次合併操作或類似操作之後對整個資料結構進行路徑壓縮,但是這樣的操作可能具有相當大的執行時間。

因此,路徑壓縮主要僅用於結構的一小部分,特別是我們走過的路徑以找到一組的代表。這可以通過在每個遞迴子查詢之後儲存 find 操作的結果來完成:

size_t find(size_t i) const {
    if (parent[i] == i)          // If we already have a representative
        return i;                // return it
    parent[i] = find(parent[i]); // path-compress on the way to the representative
    return parent[i];            // and return it
}