2013-06-30 3 views
0

Мы рассмотрели простой алгоритм для поиска связанных компонентов в графе, где иногда иногда бывает большой диаметр (наибольшие компоненты могут достигать 1 м).Алгоритм связанных компонентов в свинье

Мы нашли много очень сложных алгоритмов MR:

Что случилось с очень простой алгоритм:

  • компонент foreach, сгенерируйте flatten (nodes_bag) как node, node_with_the_smallest_id как comp_id;
  • группы узла
  • фильтр узлы с более чем одним comp_id и построить «обновление большого comp_id малого comp_id» стол
  • обновление всех узлы с большим comp_id к соответствующему новому малому comp_id, и пометить их как грязные

и перейти к следующей итерации с этими грязными узлами ... что нам здесь не хватает?

+0

Сколько итераций это могло бы в конечном итоге взять? –

+0

log (most_diameter) итерации – ihadanny

ответ

0

Разве ваш предложенный алгоритм не квадратичен? Алгоритм связанных компонентов Тарьяна является линейным.

+0

Что вы подразумеваете под квадратичным? ИМО Количество итераций будет log (most_diameter), согласитесь? – ihadanny

+0

Извините, я неправильно понял начало вашего алгоритма, где вы говорите «foreach _component_ ...». – Rafe

0

Хорошо. Причина, по которой мы не можем использовать этот очень простой алгоритм, состоит в том, что у него есть ошибка: сборка «update large comp_id to small comp_id» может быть рекурсивной. Например, если есть 3 компоненты от предыдущей итерации:

A->{1,2} 
B->{2,3} 
C->{3,4} 

Группа по и фильтр будет строить нам этот перевод стол:

A->B 
B->C 

И это вызвало бы число итераций, чтобы быть линейным (самый большой диаметр) в некоторых случаях = длинные цепочки, как в этом мини-примере, занимают много времени, чтобы сходиться.

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