热门问题
时间线
聊天
视角
霍森-科佩爾曼算法
来自维基百科,自由的百科全书
Remove ads
霍森–科佩爾曼算法基於聯合-查找算法,用於標記占據-非占據網格團簇。[1] 此算法最早由霍森和科佩爾曼在1976年的文章《Percolation and Cluster Distribution. I. Cluster Multiple Labeling Technique and Critical Concentration Algorithm》中提出。[2]
逾滲理論
逾滲理論研究格點上團簇的行為和統計性質。設在一個正方格子中每個元胞占據概率為p、非占據概率為1–p。每一組相鄰(共邊)的占據元胞各自形成一個團簇。團簇的數目、尺寸分布是逾滲理論中的重要問題。
|
|
一個5x5格子。(a)中占據概率為 p = 6/25 = 0.24。(b)中占據概率為 p = 16/25 = 0.64。
|
霍森–科佩爾曼算法查找、 標記團簇
霍森-科佩爾曼算法的主要步驟是:掃描格點、查找占據元胞並將其用其所屬團簇的序號標記。掃描格點時逐行掃描,一行結束後從下一行開頭繼續掃描。掃描每一個元胞時,若元胞被占據,則根據其相鄰的已標記所屬團簇的元胞將其標記,具體的操作要使用聯合-查找算法。如果元胞沒有任何相鄰的、被標記的占據元胞,那麼就用一個新的記號標記之。[3]
聯合-查找算法
聯合-查找算法是一種計算等價類的方法。 定義函數 union(x,y) 將元素 x 和 y 劃為等價類。 因為等價關係有傳遞性,所有與x等價的元素與y也等價。因此,對於每個元素x,都存在一組元素與x等價。這些元素構成了x的等價類。在此基礎上,定義函數find(x)以返回 x 所屬的等價類的代表元。
偽代碼
掃描網格時,每掃到一個占據元胞,就要查看其相鄰的所有元胞。若某相鄰元胞被占據且已被掃過,那麼就執行union操作,將被掃描的元胞以及相鄰的元胞劃入同一個等價類;如果被掃描元胞與兩個不同標記的元胞相鄰,則將兩個團簇合併為一個。之後,執行find操作,找到等價類的代表元並以之標記等價類中的所有元胞。如果當前元胞沒有被掃過的占據的相鄰元胞,那麼用未使用的標籤標記之。
Raster Scan and Labeling on the Grid
largest_label = 0;
for x in 0 to n_columns {
for y in 0 to n_rows {
if occupied[x,y] then
left = occupied[x-1,y];
above = occupied[x,y-1];
if (left == 0) and (above == 0) then /* Neither a label above nor to the left. */
largest_label = largest_label + 1; /* Make a new, as-yet-unused cluster label. */
label[x,y] = largest_label;
else if (left != 0) and (above == 0) then /* One neighbor, to the left. */
label[x,y] = find(left);
else if (left == 0) and (above != 0) then /* One neighbor, above. */
label[x,y] = find(above);
else /* Neighbors BOTH to the left and above. */
union(left,above); /* Link the left and above clusters. */
label[x,y] = find(left);
}
}
Union
void union(int x, int y) {
labels[find(x)] = find(y);
}
Find
int find(int x) {
int y = x;
while (labels[y] != y)
y = labels[y];
while (labels[x] != x) {
int z = labels[x];
labels[x] = y;
x = z;
}
return y;
}
Remove ads
應用
參見
參考文獻
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads