2015-06-15 6 views
4

Я изо всех сил пытаюсь создать заголовок, описывающий то, что я пытаюсь решить, поэтому, пожалуйста, прокомментируйте, если у вас есть лучший заголовок!R/SQL/Python: Извлечение подключенных компонентов из пар узлов-узлов

Решение может быть в R, Python, или SQL (Aster Teradata SQL, чтобы быть точным, хотя решение любой язык SQL является очень полезным для целей обучения)

Проблема: Учитывая список пар элементов, не имеющих определенного порядка, генерирует вывод, который связывает все пары, которые связаны как минимум с одной ссылкой.

Вот простой пример с использованием Р:

colone = c("a","b","u","e","f","f","j","z") 
coltwo = c("b","c","c","a","g","h","h","y") 
d <- data.frame(colone, coltwo) 
d 
    colone coltwo 
1  a  b 
2  b  c 
3  u  c 
4  e  a 
5  f  g 
6  f  h 
7  j  h 
8  z  y 

Желаемый выход (в любой легко читаемой структуры данных):

(a,b,c,e,u) 
(f,g,h,j) 
(y,z) 

По существу, вход представляющий собой график узлов и ребер , Выбранный список - это список всех объектов в связанном графе.

Любая помощь или мысли будут оценены!

+0

Вопрос немного неясен. Я не понимаю ожидаемый результат. – ZdaR

+0

@ZdaR Я обновил вопрос с большим количеством объяснений по проблеме - я понял, что это по сути вопрос графа. – so13eit

+0

Это называется [tag: connected-components], который является транзитивным замыканием вашего отношения. Это стандартный пример для задачи, которая требует итеративного подхода и не может быть смоделирована в чистом SQL (и, следовательно, является мотивацией для PL/SQL и подобных расширений). –

ответ

3

В R, можно использовать пакет igraph:

library(igraph) 
gg <- graph.edgelist(as.matrix(d), directed=F) 
split(V(gg)$name, clusters(gg)$membership) 
#$`1` 
#[1] "a" "b" "c" "u" "e" 
# 
#$`2` 
#[1] "f" "g" "h" "j" 
# 
#$`3` 
#[1] "z" "y" 

И вы можете посмотреть на график с помощью:

plot(gg) 

Это основано на превосходном ответе по MrFlick here

+1

спасибо большое, я понял немного после того, как я опубликовал, что я задал вопрос членства в графе! Спасибо также за ссылку на то, на что основан ваш ответ, я обязательно отвечу на его ответ. – so13eit

Смежные вопросы