Параллельные алгоритмы вычисления компонент связности и минимальных остовных деревьев: различия между версиями

Перейти к навигации Перейти к поиску
Строка 30: Строка 30:
Предположим, что B является <math>\lambda</math>-лесом и все его ребра входят в <math>T^*_G \;</math>. Тогда B может быть дополнено для получения <math>2 \lambda</math>-леса при помощи жадного подхода:
Предположим, что B является <math>\lambda</math>-лесом и все его ребра входят в <math>T^*_G \;</math>. Тогда B может быть дополнено для получения <math>2 \lambda</math>-леса при помощи жадного подхода:


Пусть F' – произвольное подмножество F, включающее все деревья <math>T \in F \;</math> с числом вершин меньше <math>2 \lambda</math>. Для любого дерева из F' выберем его минимальное внешнее ребро (т.е. ребро с минимальным весом, соединяющее его с вершиной вне дерева). Обозначим множество таких ребер за B'. Можно показать, что B' состоит только из ребер, принадлежащих к <math>T^*_G \;</math>, а <math>B \cup B' \;</math> является <math>2 \lambda</math>-лесом. Это обстоятельство позволяет найти <math>T^*_G \;</math> за blog nc шагов следующим образом.
Пусть F' – произвольное подмножество F, включающее все деревья <math>T \in F \;</math> с числом вершин меньше <math>2 \lambda</math>. Для любого дерева из F' выберем его минимальное внешнее ребро (т.е. ребро с минимальным весом, соединяющее его с вершиной вне дерева). Обозначим множество таких ребер за B'. Можно показать, что B' состоит только из ребер, принадлежащих к <math>T^*_G \;</math>, а <math>B \cup B' \;</math> является <math>2 \lambda</math>-лесом. Это обстоятельство позволяет найти <math>T^*_G \;</math> за <math>\lfloor log \; n \rfloor</math> шагов следующим образом.




1. В<-ф
1. В<-ф
2. For i = 1 to blog nc do /* Шаг i */
2. For i = 1 to <math>\lfloor log \; n \rfloor</math> do /* Шаг i */
(а) Пусть F – множество деревьев, порожденных B на G. Пусть F0 – произвольное подмножество F, включающее все деревья T 2 F с числом вершин меньше 2i.
(а) Пусть F – множество деревьев, порожденных B на G. Пусть F0 – произвольное подмножество F, включающее все деревья T 2 F с числом вершин меньше 2i.
(б) B i f  e j e  является минимальным внешним ребром Г € F'}; В <г- В U В,
(б) B i f  e j e  является минимальным внешним ребром Г € F'}; В <г- В U В,
Строка 40: Строка 40:




Различные стратегии выбора F0 на шагу 1а могут привести к получению различных Bi. Тем не менее, B[1; i] всегда является подмножеством TQ и порождает 2i-лес. В частности, В [ 1; blog nc ] порождает ровно одно дерево, которым и является TQ. Используя стандартные техники распараллеливания алгоритмов, каждый шаг можно реализовать за время O(log n) на машине EREW PRAM с линейным числом процессоров (см, например, [ ]). Таким образом, минимальное остовное дерево TQ может быть найдено за время O(log n). Большинство параллельных алгоритмов поиска MST используют подобный подход. Параллельные алгоритмы являются «последовательными» в том смысле, что вычисление Bi начинается только после нахождения Bi-1.
Различные стратегии выбора F0 на шагу 1а могут привести к получению различных Bi. Тем не менее, B[1; i] всегда является подмножеством TQ и порождает 2i-лес. В частности, В [ 1; \lfloor log \; n \rfloor ] порождает ровно одно дерево, которым и является TQ. Используя стандартные техники распараллеливания алгоритмов, каждый шаг можно реализовать за время O(log n) на машине EREW PRAM с линейным числом процессоров (см, например, [ ]). Таким образом, минимальное остовное дерево TQ может быть найдено за время O(log n). Большинство параллельных алгоритмов поиска MST используют подобный подход. Параллельные алгоритмы являются «последовательными» в том смысле, что вычисление Bi начинается только после нахождения Bi-1.




Алгоритм для EREW с временем исполнения O(log n), предложенный в [ ], основан на некоторых структурных свойствах, связанных с минимальными остовными деревьями, и способен вычислять элементы Bi более независимым образом. У этого алгоритма имеются blog nc одновременных потоков (поток представляет собой группу процессоров). Для 1 < i < blog nc , поток (i) пытается вычислить Bi, начиная работу задолго до того, как поток (i-1) вычислит Bi-1, и получая результаты работы потоков от 1 до i-1 (т.е. Bi,--- ; 5;-i) по мере продвижения. Говоря более точно, алгоритм выполняется за blog nc меташагов, где каждый меташаг выполняется за время O(1). Поток (i) выдает в результате Bi по окончании i-го меташага. Вычисление потока (i) разбито на blog ic фаз. Вначале рассмотрим простой случай, когда i представляет собой степень двойки. Фаза 1 потока (i) начинается на (i/2 + 1)-м меташагу, т.е. когда B1 ; ■ ■ ; B i/2 уже доступны. Фаза 1 занимает не более i/4 меташагов и заканчивается на (i/2 + i/4)-м меташагу. Фаза 2 начинается на (i/2 + i/4 + 1)-м меташагу, т.е. когда уже доступны Bi/2+1; • • ; B i /2+i/4, и занимает i/8 меташагов. Каждая последующая фаза использует вдвое меньше меташагов, чем предшествующая ей. Последняя фаза (log i) начинается и заканчивается на i-м меташагу; заметим, что B доступно после (i-1)-го меташага.
Алгоритм для EREW с временем исполнения O(log n), предложенный в [ ], основан на некоторых структурных свойствах, связанных с минимальными остовными деревьями, и способен вычислять элементы Bi более независимым образом. У этого алгоритма имеются <math>\lfloor log \; n \rfloor</math> одновременных потоков (поток представляет собой группу процессоров). Для <math>1 < i < \lfloor log \; n \rfloor</math>, поток (i) пытается вычислить Bi, начиная работу задолго до того, как поток (i-1) вычислит Bi-1, и получая результаты работы потоков от 1 до i-1 (т.е. Bi,--- ; 5;-i) по мере продвижения. Говоря более точно, алгоритм выполняется за <math>\lfloor log \; n \rfloor</math> меташагов, где каждый меташаг выполняется за время O(1). Поток (i) выдает в результате Bi по окончании i-го меташага. Вычисление потока (i) разбито на <math>\lfloor log \; n \rfloor</math> фаз. Вначале рассмотрим простой случай, когда i представляет собой степень двойки. Фаза 1 потока (i) начинается на (i/2 + 1)-м меташагу, т.е. когда B1 ; ■ ■ ; B i/2 уже доступны. Фаза 1 занимает не более i/4 меташагов и заканчивается на (i/2 + i/4)-м меташагу. Фаза 2 начинается на (i/2 + i/4 + 1)-м меташагу, т.е. когда уже доступны Bi/2+1; • • ; B i /2+i/4, и занимает i/8 меташагов. Каждая последующая фаза использует вдвое меньше меташагов, чем предшествующая ей. Последняя фаза (log i) начинается и заканчивается на i-м меташагу; заметим, что B доступно после (i-1)-го меташага.


== Применение ==
== Применение ==
4501

правка

Навигация