скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Распределенные алгоритмы

                                             end

          end

Алгоритм 6.14 Классический алгоритм поиска в глубину.

Сложность сообщений классического распределенного поиска в глубину равна 2|E|, по Теореме 6.6 это наилучшая сложность (за исключением множителя 2), если идентификация соседей не известна изначально. Временная сложность также составляет 2|E|, что по Лемме 6.32, является наилучшей сложностью для алгоритмов обхода в этом случае. Распределенная версия поиска в глубину была впервые представлена Cheung [Che83].

В Подразделе 6.4.2 будут рассмотрены два алгоритма, которые строят дерево поиска в глубину в сети без знания идентификации соседей за O(N) единиц времени. Следовательно, эти алгоритмы не являются алгоритмами обхода. В Подразделе 6.4.3 знание о соседях будет использовано для получения алгоритма с временной сложностью и сложностью сообщений O(N).

6.4.2 Алгоритмы поиска в глубину за линейное время

Причина высокой временной сложности классического алгоритма поиска в глубину состоит в том, что все ребра, как принадлежащие дереву, так и листовые, обходятся последовательно. Сообщение-маркер <tok> проходит по всем листовым ребрам и немедленно возвращается обратно, как показано в доказательстве Теоремы 6.33. Все решения с меньшей временной сложностью основаны на том, что маркер проходит только по ребрам дерева. Очевидно, на это потребуется линейное время, т.к. существует только N-1 ребро дерева.

Решение Авербаха. В алгоритм включается механизм, который предотвращает передачу маркера через листовое ребро. В алгоритме Авербаха [Awerbuch; Awe85b] гарантируется, что каждый процесс в момент, когда он должен передать маркер, знает, какие из его соседей уже были пройдены. Затем процесс выбирает непройденного соседа, или, если такого не существует, посылает маркер своему родителю.

Когда процесс p впервые посещается маркером (для инициатора это происходит в начале алгоритма), p сообщает об этом всем соседям r, кроме его родителя, посылая сообщения <vis>. Передача маркера откладывается, пока p не получит сообщения <ack> от всех соседей. При этом гарантируется, что каждый сосед r процесса p в момент, когда p передает маркер, знает, что p был посещен. Когда позже маркер прибывает в r, r не передаст маркер p, если только p не его родитель; см. Алгоритм 6.15.

Из-за передачи сообщений <vis> в большинстве случаев usedp[fatherp] = true, даже если p еще не послал маркер своему родителю. Поэтому в алгоритме должно быть явно запрограммировано, что только инициатор может принимать решения; а не-инициатор p, для которого usedp[q] = true для всех соседей q, передает маркер своему родителю.

Теорема 6.34  Алгоритм Авербаха (Алгоритм 6.15) вычисляет дерево поиска в глубину за 4N-2 единиц времени и использует 4|E| сообщений.

Доказательство. По существу, маркер передается по тем же самым каналам, как и в Алгоритме 6.14, за исключением того, что пропускается передача по листовым каналам. Т.к. передача по листовым каналам не влияет на конечное значение fatherp для любого процесса p, то в результате всегда получается дерево, которое может получиться и в Алгоритме 6.14.

Маркер последовательно проходит дважды через каждый из N-1 каналов дерева, на что тратится 2N-2 единиц времени. В каждой вершине маркер простаивает перед тем, как быть переданным, не более одного раза из-за обмена сообщениями <vis>/<ack>, что приводит к задержке не более чем на 2 единицы времени в каждой вершине.

Каждое листовое ребро передает два сообщения <vis> и два сообщения <ack>. Каждое ребро в дереве передает два сообщения <tok>, одно <vis> (посылаемое от родителя потомку), и одно <ack> (от потомка родителю). Следовательно, передается 4|E| сообщений.

var  usedp[q]      : boolean     init  false для всех q Î Neighp ;

                                             (* Признак того, отправил ли p сообщение q *)

       fatherp        : process     init udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     forall  r Î Neighp  do  send <vis>  to r ;

                     forall  r Î Neighp  do  receive <ack>  from r ;

                     usedp[q] := true ;  send <tok>  to q ;

          end

Для каждого процесса при получении <tok> от q0:

          begin   if  fatherp = udef  then 

                          begin  fatherp := q0 ;

                                      forall  r Î Neighp\ {fatherp}  do  send <vis>  to r ;

                                      forall  r Î Neighp\ {fatherp}  do  receive <ack>  from r ;

                          end ;

                     if  p - инициатор  and  "q Î Neighp : usedp[q]

                        then  decide

                        else  if  $q Î Neighp : (q ¹ fatherp  &  Øusedp[q])

                                    then  begin  if  fatherp ¹ q0  &  Øusedp[q0]

                                                           then q := q0

                                                           else  выбор  q Î Neighp \ {fatherp} 

                                                                                            с Øusedp[q] ;

                                                       usedp[q] := true ;  send <tok>  to q

                                             end

                                    else  begin  usedp[fatherp] := true ;

                                                      send <tok>  to fatherp

                                             end

          end

Для каждого процесса при получении <vis> от q0:

          begin   usedp[q0] := true ;  send <ack>  to q0  end

Алгоритм 6.15 Алгоритм поиска в глубину Авербаха.

Передачу сообщения <vis> соседу, которому процесс передает маркер, можно опустить. Это усовершенствование (не выполняемое в Алгоритме 6.15) сберегает по два сообщения для каждого ребра дерева и, следовательно, уменьшает сложность сообщений на 2N-2 сообщения.

Решение Сайдона.  Алгоритм Сайдона [Cidon; Cid88] улучшает временную сложность алгоритма Авербаха, не посылая сообщения <ack>. В модификации Сайдона маркер передается немедленно, т.е. без задержки на 2 единицы времени, внесенной в алгоритм Авербаха ожиданием подтверждения. Этот же алгоритм был предложен Лакшмананом и др. [Lakshmanan; LMT87]. В алгоритме Сайдона может возникнуть следующая ситуация. Процесс p получил маркер и послал сообщение <vis> своему соседу r. Маркер позже попадает в r, но в момент, когда r получает маркер, сообщение <vis> процесса p еще не достигло r. В этом случае r может передать маркер p, фактически посылая его через листовое ребро. (Заметим, что сообщения <ack> в алгоритме Авербаха предотвращают возникновение такой ситуации.)

Чтобы обойти эту ситуацию процесс p запоминает (в переменной mrsp), какому соседу он переслал маркер в последний раз. Когда маркер проходит только по ребрам дерева, p получает его в следующий раз от того же соседа mrsp. В ситуации, описанной выше, p получает сообщение <tok> от другого соседа, а именно, от r; в этом случае маркер игнорируется, но p помечает ребро rp, как пройденное, как если бы от r было получено сообщение <vis>. Процесс r получает сообщение <vis> от p после пересылки маркера p, т.е. r получает сообщение <vis> от соседа mrsr. В этом случае r действует так, как если бы он еще не послал маркер p; r выбирает следующего соседа и передает маркер; см. Алгоритм 6.16/6.17.

Теорема 6.35  Алгоритм Сайдона (Алгоритм 6.16/6.17) вычисляет DFS-дерево за 2N-2 единиц времени, используя 4|E| сообщений.

Доказательство.  Маршрут маркера подобен маршруту в Алгоритме 6.14. Прохождение по листовым ребрам либо пропускается (как в Алгоритме 6.15), либо в ответ на маркер через листовое ребро посылается сообщение <vis>. В последнем случае, процесс, получая сообщение <vis>, продолжает передавать маркер, как если бы маркер был возвращен через листовое ребро немедленно.

Время между двумя успешными передачами маркера по дереву ограничено одной единицей времени. Если маркер послали по ребру дерева процессу p в момент времени t, то в момент t все сообщения <vis> ранее посещенных соседей q процесса p были посланы, и, следовательно, эти сообщения прибудут не позднее момента времени t+1. Итак, хотя p мог несколько раз послать маркер по листовым ребрам до t+1, не позднее t+1  p восстановился после всех этих ошибок и передал маркер по ребру, принадлежащему  дереву. Т.к. должны быть пройдены 2N-2 ребра дерева, алгоритм завершается за 2N-2 единиц времени.

Через каждый канал передается не более двух сообщений <vis> и двух <tok>, откуда граница сложности сообщений равна 4|E|.

var  usedp[q]      : boolean     init  false для всех q Î Neighp ;

       fatherp        : process     init  udef ;

       mrsp            : process     init  udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     forall  r Î Neighp  do  send <vis>  to r ;

                     usedp[q] := true ;  mrsp := q ;  send <tok>  to q ;

          end

Для каждого процесса при получении <vis> от q0:

          begin   usedp[q0] := true ; 

                     if  q0 = mrsp  then  (* интерпретировать, как <tok> *)

                          передать сообщение <tok> как при получении <tok>

          end

Алгоритм 6.16 Алгоритм поиска в глубину Сайдона (Часть 1).

Для каждого процесса при получении <tok> от q0:

          begin   if mrsp ¹ udef  and  mrsp ¹ q0

                        (* это листовое ребро, интерпретируем как сообщение <vis>*)

                        then usedp[q0] := true

                        else (* действовать, как в предыдущем алгоритме *)

                            begin  if  fatherp = udef  then 

                                           begin  fatherp := q0 ;

                                                     forall  r Î Neighp\ {fatherp} 

                                                           do  send <vis>  to r ;

                                           end ;

                                        if  p - инициатор  and  "q Î Neighp : usedp[q]

                                             then  decide

                                             else  if  $q Î Neighp : (q ¹ fatherp  &  Øusedp[q])

                                                         then  begin  if  fatherp ¹ q0  &  Øusedp[q0]

                                                                                then q := q0

                                                                                else  выбор  q Î Neighp\ {fatherp} 

                                                                                                   с Øusedp[q] ;

                                                                              usedp[q] := true ;  mrsp := q ;

                                                                              send <tok>  to q

                                                                    end

                                                         else  begin  usedp[fatherp] := true ;

                                                                            send <tok>  to fatherp

                                                                  end

                            end

          end

Алгоритм 6.17 Алгоритм поиска в глубину Сайдона (Часть 2).

Во многих случаях этот алгоритм будет пересылать меньше сообщений, чем алгоритм Авербаха. Оценка количества сообщений в алгоритме Сайдона предполагает наихудший случай, а именно, когда маркер пересылается через каждое листовое ребро в обоих направлениях. Можно ожидать, что сообщения <vis> помогут избежать многих нежелательных пересылок, тогда через каждый канал будет передано только два или три сообщения.

Сайдон замечает, что хотя алгоритм может передать маркер в уже посещенную вершину, он обладает лучшей временной сложностью (и сложностью сообщений), чем Алгоритм 6.15, который предотвращает такие нежелательные передачи. Это означает, что на восстановление после ненужных действий может быть затрачено меньше времени и сообщений, чем на их предотвращение. Сайдон оставляет открытым вопрос о том, существует ли DFS-алгоритм, который достигает сложности сообщений классического алгоритма, т.е. 2|E|, и который затрачивает O(N) единиц времени.

6.4.3  Поиск в глубину со знанием соседей

Если процессам известны идентификаторы их соседей, проход листовых ребер можно предотвратить, включив в маркер список посещенных процессов. Процесс p, получая маркер с включенным в него списком L, не передает маркер процессам из L. Переменная usedp[q] не нужна, т.к. если p ранее передал маркер q, то q Î L; см. Алгоритм 6.18.

Теорема 6.36  DFS-алгоритм со знанием соседей является алгоритмом обхода и вычисляет дерево поиска в глубину, используя 2N-2 сообщений за 2N-2 единиц времени.

У этого алгоритма высокая битовая сложность; если w - количество бит, необходимых для представления одного идентификатора, список L может занять до Nw бит; см. Упражнение 6.14.

var  fatherp        : process     init udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     send <tlist, {p}>  to q

          end

Для каждого процесса при получении <tlist, L> от q0:

          begin   if  fatherp = udef  then  fatherp := q0 ;

                     if  $q Î Neighp \ L

                          then  begin  выбор  q Î Neighp \ L ;

                                             send < tlist, LÈ{p} >  to q

                                    end

                          else  if  p - инициатор

                                      then  decide

                                      else  send < tlist, LÈ{p} > to fatherp

          end

Алгоритм 6.18 Алгоритм поиска в глубину со знанием соседей.

 6.5  Остальные вопросы

6.5.1  Обзор волновых алгоритмов

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.