Искусство программирования на Си (984073), страница 50
Текст из файла (страница 50)
Операции в динамической лете возврашаться к уже посещенной вершине, а алгопаги«и обычно выполняются за время порядка О([ой [ч) ритм Беллмана-Форда нс имеет такого предположения Рй 1и(Е(а1(ав(кй)< и снн.кают время выполнения алгоритмз Дийкстры ло Существует две примечательныс проблемы. Первая 1п1ейези1$а(ьйеаи1св, 5->вивувкетсев) г поря,<ка О(У [ой У). Однако резлизаш<я поиска в лво- заключается в том, чтоланный алгоритм занимаетбольичнол динамической памяти может занять много вре- шс времени, чем алгоритм Дийкстры.
В алгоритме Диййвви1са[5пиксв).тпеа1=0< /' йаг 1 '/ менн. и любыс выгоды, полученные от сс использова- кстры кажлая вершина обрабатывается только один раз. йвви1$в[воигсе!.Ргео(оио=-1; /* предидуивго узла ввт */ Органимцнн донн«о $ ° Часть И Райнта г гра«/«ннн 1 4 Глава 1б ствие в долларах. В этом контексте ребро с отрицатель- го определенного маршрута. Почти во всех других жиз- чество промежуточных вершин. Можно представить обшни способ хранения. Рис. 16.38 и табл. 16.13 дсмонными затратами будет там, где железнодорожная ком- пенных ситуациях, представляемых с помощью графов„ этот путь, составляя список последовательных вершин, стрируют результаты, презставленныс в наиболее доспания платит своим пассажирам за использование это- ребра с отрицательными затратами не возникают. Дис- ко)орый выглядит следующим образом: чн („, 1„)ь..
1„. тупном для понимания виде. тинг 16.5 демонстрирует алгоритм Беллмана-форда. чг Г)[ц,ч[ — это кразчайшии путь между двумя верши- Первая колонка таблицы — это список всех возможнами с[п,ч[ — это затраты прямого ребра от н к ч, рав- ных путей, которые могут существовать в рассматриваныс «атратам некоторого ребра, если ц и ч — смежныс смом графе. Слслуюшая колонка — это начальные знагпе Ве11вап(вггпсе сгарь * с, зп1 Бопгсе, вггпсг в))кекса тайье и таьуе) вершины, или равные бесконечности, когда н и ч нс чения затрат на этих путях, а кажлая последуюшая ( являются смежными.
колонка — затраты после обработки каждого значения В алюритме Диикстры для поиска кратчайшего пути К. Затразы, выделенные жирным шрифтом, — мини1пс вггпсг Рбпепе Я; Г)[п «[ между двумя вершинами рекурсивно применяется мальные затраты, рассчитанные для определенною знавсгпст О1)хвега Коы * Кевп1тв; пра)«нло: чения К, т.е. тскушие затраты пути ) — «] больше, чем всгпсс Вбдевсап Е) / ° содерввт ввйорыадав о ребре */ Г)[п,ч[=пип(0[п,«[, Г)[п,с[+с[(„,ч[) пути 1 -«К РК вЂ” «). РС 1п111а1]ве(ь0)) Другими словами, минимальные затраты от ц к ч— 1=1пзткевп1гв(ькевп11в, с->дпачегегсев]1 это )атраты на кратчайший найденный путь либо зат- "о кз /' сообдвть о любой оавбке */ 11 (з] геспгп 11 / раты на промежуточные вершины плюс ребра, соединя- 4 з Кевп11в(восгсе].Тоьа1 О) /* дат 1 */ юшис промежуточные вершины на пути к ч.
ПередвиКевп11в(вопгсе).ргет1опв -1) /* предыдущей вервввы вет */ гаясь по вершинам, используемым в качестве Ч Бопгсе; проис)ау)очных, можно подсчитать кратчайший путь ко всем вершинам. Это то, что делает атгоритм Дийкстры Органи<аиинданних 6Ш- ' 1! Часть !! Работа г гра4а и и Глава !б ЫЙИ рый использует промежуточную всршину, короче, чсм Алгоритм Флойда дает корректные результаты и лля Листинг 16.6.
Алгоритм Флойда. текущий. В нашем примере определяется, что путь графов с ребрами. имеющими отрицательные затраты. глг Р)оуб(вггпсе Сгарь ° С,еегпсг Р1оуб Рабус ° Рабус) г< --э н< коРо <е, чем полУченный пРи испольювании ча Если встРсчаютсЯ циклы с отРицательными затРатами, /* Алгорвтм Епойда нСПолЬЗУется в целЯх поДсчета хратчайаего марврута длЯ всех пар веРваа. в качестве промежуточной вершины Другими слова- алгоритм нс будет работать бесконе <но, но полученные В СЛУЧаЕ УСПЕХа ВОЗВРадевтел О, Впа ЗнаЧЕаВЕ <Ог Еепа ПРОВЗОапе ОВВВКа (СВАРН ОСТОРИАВ, ми, путь и, -э ни-э и<длиннсс, <ем кратчайший путь результаты нсбудучдостоверными. Эж<состояние мож- СНАРН ВАПРАНАИ). Срв передаче графа, содервадего цнхл с отрвцательввмв затратами, получаются флктнвнве результата, а не результат оввбхв в сегмеатацвв, в аачальвнх цакпах в т.п.
и, -э х и определенный ранес. но опрслелить, изучив пути от каждой вершины назад Во время следующей итерации, когда Кт(, выпол- к ней самой. Если обнаружится отрицательный цикл, ( няется та же сал<ая операция. Однако на этот раз полу- то затраты пути назал к вершине после окончания ра- злг г,),1<; чаетсЯ, что пУти чн -э г< -+ н< и ч, — г и, — и и< коРоче, чел< боты алгойитма бУдУт иметь отРицательное значение. определенные ранее пути иа — ! и, и хй — э и,соответствен- Обычно расстояние от любой вершины обратно к ней как мвавмум О(1,11 в марврута через хавдуп промевуточеув веравну К, т.е. вспользуется правило но. После того как использованы все значения )<, окон- самой равно 0 чатсльными значениями являются ллины кратчайших Итак, для выполнения алгоритл<а Флойла требуется путей.
В листинге 16.6 реализован алгоритл< Флойда. 1Р итерадии, как и при выполнении алгоритма Дийкстнггис1 Р1оуд Вевп11 *' В; Можно также опрсдслить факп<ческии путь, а не ры для каждой вершины. Различие состоит во времени зсгисе ВбчеВсап ВЯсап; только его длину мсзкзу любой парой вершин. Это не- которос требустся для выполнения каждой итерации 11 (<С (( <табуе )( !Сг>впвчегтгсеа) гегпгп СВАРа ВАПРАВАИ; намного сложнее, чем алгоритм Дийксзры. Требуемая Реализация алгоритма Флойда имеет очень плотнып информация — это значение й, являющееся кратчай- внутренний цикл.
Хорошо оптимизирующий компиля- /* Создать двумервма масона результатов '/ шим путем. Отсюда можно разделить каждый путь на тор сделает из него исключительно быстро еыполнясд= нведеап11в(С- 'сев); 11 (<д) геепгп СВАРВ ОСРОРИВИ; два, причем первый заканчивасгся и второй начинает- мый кол.
Реализации алгоритма Дийкстры обычно имс. Организация данных ЩЩ ЧастЫ! райан ~а г графами бер в графе. Способ, по которому реализуется очередь, занимает очень много времени. Олин подход решения этой проблемы состоит'в использовании двоичной динамической памяти — отчасти сложной, но эффективной структуры данных. Время, за которое приоритетные очереди обычно выполняют одну операцию постановки в очередь с использованием двоичной динамической памяти в качестве базовой структуры данных, имеет порядок О()оя )Ч), т.е. полное время на построение приоритетнои очереди ребер имеет порядок О(Е !оя Е). Π— 'З О О г Глава 16 зованисм двоичной пирамиды (см.
главу 11) будет ра- 2 Часть реализации этого алгоритма, занимающая са- !гз ггз боз ать с менее зачетно возросшей скоростью. мое большое количество времени на вычисления, — это Теоретически существует технология, основанная на 3 6 с~~особ, которым выбираются ребра. Графы обычно хравдгоритме Флойда, которую лучше всего использовать нятся таким образом, что трудно создать список ребер для болыпил разреженных графов.
Этот алгоритм проа 2 4 лля всего графа. Оба представленных способа страдают всряет каждую возможную промежуточную вершину от этой проблемы, однако они имеют преимушества с лля кажлои пары вершин в графе. Для разреженных з других точек зрения. графов количество определенных путей между парами Хорошим решением бьшо бы созлание приоритетной сравнимо с количеством возможных пар.
очерели ребер. Операция вывода из очереди автомати- Во время выполнения алгоритма Флойда на бумаге чески дает ребро с наименьшими затратами, которое нс становится ясно, что необхолимо работать только с из- было изучено. После этого действия 3 — 5 выполняются всстными вершинами. Просто если ребро Х вЂ” з ч„неиз! самое большее за Е итераций, где Š— количество рсвестно (имеет бесконечныс затраты), то любои путь от ч, -з г, — з и будет бесконечен без возможности какихлибо улучшений. Эти же рассуждения можно приме- 6 6 Оз) Оз нить ко второй части пути чз — з чг Идею известных путей можно использовать для уменьшения количества необходимых итераций. Слож- г но, он будет работать медленнее, чем при нормальной Глава !б Орган»гани» даыш» — Ра саги а с граФы ии Масть И РЕ0 1п111а11пе(0)! ппваббед++! Тгее=иакеогарь[ь)ег)! ) 11 (!Тгее) гегегп 6ДЬРН ООТОРНен! ) /* Вага 1 и 2: располопенпе ребер в графе по затратам, а такве дублвровавве вернее графа С в 'Тгеерег=угее! Тгее (только потому, что быстрее работает один цпкл, выполвявдва две задачи, чем два цнкла, РЕО Ргее(0); выповаявцве одну задачу */ гегпгп О! ) Рог (1=0!1»6->Нпвуег11сее!1»+) ( )иаддчеггех(Тгее)! Алгоритм Прима Таблица 16.16.
Алгоритм Прима — стадия 2. гу (1<0) г„ Посещенные Загмраагы Прес)ыг))тшая ( А.лориты Прима (Рпп!) создает минимальное остоннос аергаимы ребра вершина / Оввбка. Очвстпть в возвратнться / дерево путем добавления слинстнснного ребра (а также РЕ0 Ргее(0); РгеебгарЬ[Тгее); не[алин) в дсрсно после определенного количсстна итс- да нет гегпгп рлпнй. Вершины н графе разделяются на дна наборе: "и ) один, янляющиися частью дсрсва, а другой — нет. Во иы Тгее->Чегггсеп[1]->ТаЧ=С->Чегг1сез[1]->Тау! нрсчя кахсдой итерации ребро с минимальными затратами связынаст любую вершину, янляюшуюся частьн! 4 нет 7 нет ебченсапнсагг(6,),аезсап)! 5 нет и, решения, с любой вершиной, которая сшс нс добанлсыЬ11е ([ЕСЧеясапвех1(ькдсап)) Работа с гродгиии Глава 1б Таблица 16.19.