改進路徑壓縮
如果我們在 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
}