Эффективно находить все достижимые узлы из каждого узла

#r #igraph

#r #igraph

Вопрос:

У меня есть ненаправленный список ребер, который выглядит примерно следующим образом (за исключением того, что он содержит сотни тысяч узлов и ребер):

 map <- list(1,1,1,2,6,5,2,3,4,7) %>% matrix(nrow = 5, ncol = 2)
  

Я пытался найти способ разделить эту таблицу на группы узлов, которые могут достигать друг друга. В приведенном выше примере я хотел бы видеть набор c(1,2,3,4,5) и набор c(6,7) как отдельные группы.

Я работал с разными идеями и наткнулся на igraph пакет, который позволил бы мне использовать graph_from_edgelist для создания объекта igrap, а затем я могу использовать dfs его на каждом узле, чтобы найти каждый узел, доступный для этого узла. Я даже зашел так далеко, что исключил посещенные узлы, чтобы не повторять вещи, но это все еще очень медленно.

Это лучшее, что у меня есть, но я надеялся на что-то гораздо более быстрое.

 graph <- graph_from_edgelist(map,firected = F)
all_nodes <- c(map[,1],map[,2]) %>% unlist() %>% unique()
visited <- c()
node_groups <- list()

for(i in 1:length(all_nodes)){
    if(!(i %in% visited)) {
        temp <- dfs(graph,i,neimode = "all", unreachable = F)[[3]]
        temp <- temp[!is.na(temp)]
        node_groups[[length(node_groups)   1 ]] <- temp
        visited <- c(visited, temp)
    }
}
  

Я надеюсь, что я просто где-то упускаю из виду очевидную функцию или что есть простой метод оптимизации, который позволит мне продолжать проводить анализ в R. Спасибо за вашу помощь.

Комментарии:

1. Вы смотрели на функцию components ?

2. @G5W Нет, нет, я этого не делал. Это именно то, что я искал. Я чувствую себя довольно огорченным. Спасибо!