[英]From a set of pairs, find all subsets s.t. no pair in the subset shares any element with a pair not in the subset
我有一組對。 每對表示為[i,1:2]
。 也就是說,第ith
對是ith
行第一列和第二列的數字。
我需要將這些對分類到不同的組中,st 在第jth
組中的任何對中都沒有元素不在j
任何組中。 例如:
例 1:數據
> col1 <- c(3, 4, 6, 7, 10, 8)
> col2 <- c(6, 7, 3, 4, 3, 1)
>
> dat <- cbind(col1, col2)
> rownames(dat) <- 1:nrow(dat)
>
> dat
col1 col2
1 3 6
2 4 7
3 6 3
4 7 4
5 10 3
6 8 1
對於所有對,無論數字在第 1 列還是第 2 列中都沒有關系,應該將這些對分類到組 st 中,每個組中每對中的每個數字僅存在於一個組中。 所以解決的例子看起來像這樣。
col1 col2 groups
1 3 6 1
2 4 7 2
3 6 3 1
4 7 4 2
5 10 3 1
6 8 1 3
第 1、3 和 5 行組合在一起,因為 1 和 3 包含相同的數字,而 5 共享數字 3,因此必須與它們組合在一起。 2 和 4 共享相同的不同數字,因此它們被分組在一起,而 6 具有唯一的數字,因此它是單獨存在的。
如果我們稍微更改數據,請注意以下事項。
示例 2:新數據
注意當我們添加一行與第 6 行和第 5 行共享一個元素時會發生什么。
col1 col2 groups
1 3 6 1
2 4 7 2
3 6 3 1
4 7 4 2
5 10 3 1
6 8 1 1
7 1 10 1
第 7 行中的10
將其連接到第一組,因為它與第 5 行共享一個元素。 它還與第 6 行(數字1
)共享一個元素,因此第 6 行將在第 1 組中。
問題
有沒有一種簡單的方法來形成組? 向量運算? 排序算法? 如果您嘗試使用循環來執行它,它會很快變得非常糟糕,因為每個后續行都可以更改先前行的成員資格,如示例中所示。
要借鑒舊答案: 確定鏈接在一起的鏈接劇集組,為每個單獨的值分配一個組,您可以嘗試將一個組分配給每個鏈接對:
library(igraph)
g <- graph_from_data_frame(dat)
links <- data.frame(col1=V(g)$name,group=components(g)$membership)
merge(dat,links,by="col1",all.x=TRUE,sort=FALSE)
# col1 col2 group
#1 3 6 1
#2 4 7 2
#3 6 3 1
#4 7 4 2
#5 10 3 1
#6 8 1 3
您的元素可以被視為無向圖中的頂點,您的對可以被視為邊,然后(假設您想找到最小尺寸的組 - 如果不這樣做,那么例如整個對可以被標記為“第 1 組”)您要查找的組是此圖中的連接組件。 它們都可以通過深度優先或廣度優先搜索在線性時間內找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.