簡體   English   中英

從一組對中,找到所有子集 st 子集中沒有對與不在子集中的對共享任何元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM