Быстрая идентификация компонентов в неориентированных графах в R - PullRequest
1 голос
/ 03 апреля 2012

Учитывая узел x в неориентированном графе, который, как известно, является частью связного компонента, я стремлюсь найти все узлы, принадлежащие компоненту x.

Моя текущая реализация идентифицирует все компоненты в неориентированном графе и поэтому не подходит для больших графов. В настоящее время для этого я использую connectedComp из библиотеки ggm, но лучше запускать BFS из RBGL, начиная с узла x и заканчивая, когда его компонент будет полностью исследован. Любые предложения о том, как это сделать? Также приветствуется любая информация о реализациях алгоритма параллельного графа, которая может быть вызвана из R.

library("ggm")
x <- 2

> graph
   1 2 3 4 5 6 7 8 9 10
1  0 0 0 0 0 0 0 0 0  0
2  0 0 1 0 0 1 0 0 0  0
3  0 1 0 0 0 1 1 1 0  0
4  0 0 0 0 0 0 0 0 0  0
5  0 0 0 0 0 0 0 0 0  0
6  0 1 1 0 0 0 0 0 0  0
7  0 0 1 0 0 0 0 0 0  0
8  0 0 1 0 0 0 0 0 0  0
9  0 0 0 0 0 0 0 0 0  0
10 0 0 0 0 0 0 0 0 0  0

graph_object <- as(graph, "graphNEL")

# All connected components of graph using connectedComp function:
comp_list <- connectedComp(graph_object)
> comp_list
$`1`
[1] "1"

$`2`
[1] "2" "3" "6" "7" "8"

$`3`
[1] "4"

$`4`
[1] "5"

$`5`
[1] "9"

$`6`
[1] "10"

# Extract adjacency matrix of component containing x:

comp_x <- seq_along(comp_list)[sapply(comp_list, FUN=function(list) x %in% list)]
> comp_x
[1] 2

comp_x_list <- comp_list[[comp_x]]
> comp_x_list
[1] "2" "3" "6" "7" "8"

comp_x <- graph[comp_x_list, comp_x_list]
> comp_x
  2 3 6 7 8
2 0 1 1 0 0
3 1 0 1 1 1
6 1 1 0 0 0
7 0 1 0 0 0
8 0 1 0 0 0

1 Ответ

1 голос
/ 04 апреля 2012

По моему мнению, граф предварительной обработки с Union-find даст вам лучшие результаты.
Было бы быстрее, если бы вы сохраняли график в виде списка ребер вместо матрицы смежности.

Если вам нужно параллельное решение, вы должны прочитать о BFS в Hadoop

...