Искусство программирования на Си (984073), страница 51
Текст из файла (страница 51)
Алгоритм Прима — стадия 6. Несмотря на то что азгоритм Прима похож на алго- Листинг 16.8. Алгоритм Прима. !'и Посещенные Затраты Предтдушая р 'Р итм Дийкст ы, он не с адаст от некотопых ппоблем, тр 1пг Рггв Опд!гессед(в!гост Сгарв ' С,втгпсг Сгарь ** Тгеерег) вершном ребра вершина присуших алгоритму Дийкстры. Операция, выполняс- О Ра нет мая алгоритмом Прима, не будет отличаться от опера- /* Граф С взучается для создавая вового графа, аотормй является мвввмальвмм остовамм деревом, ции алгоритма Дийкстры, если присугствуюз ребра с а структура Сгард '.
обозааченвая указателем ТгееРтг, првввмает новое звачевпе. 1 РР 3 чг отрицательными затратами. Циклы с отрицатсльнылги в случае успеха возвранается звачеаве О, в случае оввбав возвранается звачевве <О 2 Ра ь ч 3 Ра 2 ч, затратами более нс представляют проблемы: в резуль*/ (СМАРН ВАОНАМ, СНАРН ООТОГМЕМ) тате работы алгоритма (имеется в виду дерево) цикла нс 2 5 нет ! создастся, значит, алгоритм нс может входить и бсско- втгосс псарь ' Тгее; б нет 2 нсчный цикл. атгпсг Рггв Магд!пЧ * М; Сходство этих алгоритмов отражается и на их реа- аггпсг ВдЧеБсап Ввсап; лизации.
Все проблемы реализации и работоспособнос- !от Мому!я!Сед, Ч, з, 3, 1омевг! Таблица 16.20. Алгоритм Прима — стадия 7. ти, характерные для алгоритма Дийксгры, присуши и ал- зд (!С (( !Тгеерег) гетега СМАРН ВАОРАММ!! 1'„ Посещенные Затраты Предмдушггя гори!А!у Прима. Реализация алгоризма Прима для вершгггим ребра вершина неориснтированных графов представлена п листинге ) 6.8. Тгее=иахесгарб(1и!ас); Самое длительное время выполнения алгоритма зу ()Тгее) гегпгп СМАРМ ООТОРНВН! РР нет Прима имеет порядок О(ЪР). При работе с разрсжснныда М=ва11ос(в!яеог(вегасе Ргзв Мосх!пЧ)ис->Мпвуегс!сев)," 2 да 6 чи ми графами его можно уменьшить, если использовать 1! (!М) приоритетную очередь вершин.
С использованием дво- ( Организация данных Работа г г)нзфаии ] ° ] ! Часть (! Глава !б ( тельно улучшенные характеристики. Для любого алгорнт- новляется, то можно значительно уменьшить время ЬГ (Евсап.сове<в[Елово.пепе .Ьомееесове) ( 5 . ве М[ввспп.певС!.Ьомееесове! ма, работающего с графами, количество итераций (а еле- выполнения, если просто подлерживать список ребер, довательно, и времени на выполнение) во многом зависит требующих изменения, и добавлять или удалять нх. м[55сап.Оввс].Реев=У! от скорости исследования структур данных графа.
Не существует строгих правил при оптимизации ) Во-первых, необходимо выяснить, — является ли алгоритмов работы с графами. Основной подход — сде) граф насыщенным нлн разреженным. Это во многом пать часто требуемые данные легкодоступными, а единЕдэевсепкпд(авэсап)! зависит от того, для чего он был разработан. Как пра- ственный способ, позволяющий добиться этой цели,— вило, чем больше структура данных (имеется в виду правильное использование структур данных. посевева, в добавить ребро в мвввмавьвое остоввое дерево. использование структурой физической памяти), тем яг больше времени займет выборка и полное выполнение ~~з]0~~щ задачи.
Чем больший объем памяти задействован в процессе, тел! больше времени потребуется на ее обслело- В этой главе были рассмотрены некоторые элементы )очевЕ=СЕАРН МОТСОММЕСТЕО)Ч=-1! гог (з=в;х<с->мпврегсзсев)з+я) ( ванне, в результате чего неизбежно увеличивается время теории графов, технологии представления графов в ка- (Т (М[з).язв(ее!)) сове(ппе! работы алгоритхза. Выбор представления, используюше- честве структуры данных, а также продемонстрироваго наименьший объем памяти, позволяет в значитель- ны алгоритмы, которые можно использовать практичеснои степени уменьшить время выполнения алгоритма.
кн. Библиотека графов, применяемая во всех примерах Во-вторых, нужно определить, можно ли даннухз кола, лостаточно гибка, так что ее можно использовать ( структуру данных применить к алгоритмам, которые ис- во всех приложениях, за исключением тех, в которых Ьомеве М[з].Ьомевесове! Ч=х! пользуются в вашем частном приложении. Если напри- главным критерием является время выполнения В ЭТОЙ ГЛАВЕ ь.зм Хоббс ЧАСТЬ Дополнительные тематические разделы Матричная арифметика ° Что такое матрица ° ! 1ростые операции матричной арифметики ° Реализация матричной структуры в языке С ° Инициализация матриц из массивов ° Извлечение матрицы из файла ° Запись обьектов МАТАХ Т в аьооць или в лруеой файл ° Г1олная реализация суммирования и транспонирования ° Сложные концепции матриц ° Решение линейных алгебраических уравнений ° Дальнейшие направления работы веркнт треугыьная =т> матрица Нк тем т реп оныня = = > мокрица донознитс еныегнеианииегкиераздеаы и†Часть [й основы просты и пюннтны; проблемы даже среднем спюжности можно решить без труда.
Деиствитепьно сложные вопросы могут потребовать присутствия в команде разработчиков специалиста по численному анализу, поскольку в данной главе зги вопросы не обсуждаются. (прн реализации э го выражение должно быль заключе- но в соответствую]цие циклы Еог). Таким же образом выполняется вычитание: ахе ь[ ] [з]ыа[к] [з]-ь[х] [З] 3 О О О 7 8 О О 6 7 11 О 3 8 9 1 3 7 8 3 О 8 7 8 О О 11 9 О О О 10 Ыатриниая агтуккгетика й[ффф Глава 17 ЫШ а не матрицу а)гп))п), где гп и и рассчитываются во вре мя выполнения программы. ПРИМЕЧАНИЕ Новый стандарт АЫ51 1999 г. по языку программирования Оп ации вычисл ния оп еделит лей и инве тиро- Сложение и вычитание должны быть вам знакомы.
РИСУНОК 17.3. Треуеатиная матюкал. С позволяет обьявпять массивы с помощью переменньн, рассчитываемых во время выполнения. Некоторые ранние вания матриц более сложны, однако сушествуют про- компилятюры также предоставляли такую возмюжность В этой главе треутольные матрицы используются не стыс и понятные метолы проведения этих операций и етсЯ транспонирование; бУквально это означает пеРс- при использовании нествндартнюго расширения. Однако становку элементов из рядов в колонки. Символически их реализации на языке С. Кроме того, при вычислении Н "1 ПГЛ1 ПРОВЕДЕНИГ1 миюиеествю компиляторов дю смх пюр зтогю ие юбеспечи атной ма ицы что часю л лается п и сшении сис- опсрацил транспонированил записывастсл с помощью рг кличного рода исследований, поэтому ил описанию вают.
8 целях установки совместимости и с ранним станслсчует уделить некоторое внимание. Верхние треуголь- дартом языка с, и с существующими компиляторами тем линейных алгебраических уравнении) основной про- всрхнсго индекса Т(Апз и читается как транспонировал. ныс матрицы талжс рассматриваются в разделе "Опре языки С, которые все еще не позволяют использовать блсмой является распространение (накопление) огплтбок. аал татрици А. Для квадратных матриц в результате рассчитываемые во время выпюпнения переменные, бибдслнтели и норма Евклида" данса в этой главс. (Вопросы ра.'ро.'ранен я и у ранения о.
1б л будут ТРьнспониРовапиа матРи ' пРосто "псРсбР"ывастсл" пиютека матриц реализует матричную арифметику вне рассмотрены в этой главе да1сс.) через главную диагональ. В общем же случае транспо- зависимости ют этой осюбеннюсти. бш]ее ело лнь„часть аботь[ ма ичлюи арифме нированнья мьтрипь Мх]л] Реализация матричной структуры в тики на языке программирования С вЂ” это реазизация ]7. [). языке С Арифметика указателей и индексы деталей проекта.
Илясется в виду инициа1изация псреВп кникает очевидный вопрос: "Что может быть проще?" МВССИВа 2 5 8 Прямоугольный массив действительно прост (как было которые используются для предо~веления матрицы, 4 5 6 1 = ~ ~ . ' ', ' Одним из первых вопросов, о которых следует поду- дгта нитеяыыетематическиеразла~ы 6ПЧасть И! Матричная артрметика Глава 17 ЙМЙ Фунюзия гп пепП сначала размещает массив типа!)овЫе соответствующего размера. Если прн этом происходит ошибка, немедленно возвращается [л[(»ЕЕ. Затем размещается и инициализируется сама структура МАТИ(Х Т. Если при размещении происходит ошибка, то ранее Г[п[голув;[ РИСУНОК 175. Сиво ктура мао~рггчнггго лгала с Динамическим размен!гнием массива.
Друтими словами, можно написать код, который будет иметь один из двух видов. Первый: сы, чтобы дать возможность использовать условные математические обозначения даже в самом рабочем коле К сожалению, когда-нибудь этот дополни~ельный шаг также приведет к затруднениям. Библиотека матрип реализует условные обозначения языка С. в котором Гаоо ао!] ~ а!О а(,~ ллс)нх = О; Гаг [ 1 = 0; 1 < Гама; 1++» ( (аг ( ) 0; ) < са1я; 1++» ( аггаур* а[ляг)ех) = 0.0; первым элементом является [0][0]. В этой главе исполь- По терминологии, принятой в С, основной матрич- размещенный массив типа доцЫе освобо:кдается, после ллеех+1! зуются и условные обозначения языка С при рассмот- нып тип можно определить как чего возвращается )Ч()Е)..
В противном случае мы по) ренин рабочего кода, и условные математические обо- лучим размещенную структуру МАТВ)Х Т с инициа) еурвавг мсслсс ( значения, когда речь идет о математике или уравнениях. ллв ганя! лизированными переменными готта и соЬ и значениями Вычисление переменной )пс)ех, если начать со зна- для переменных массива типа с)оцЫе. Функция ш (гее чения О и постепенно увеличивать его на ), позволяет ПРИМЕЧАНИЕ еанв)е *ма1! освобождает разлеещенную ранее структуру МАТВ)Х Т избежать проблемы выполнения сложной арифметики а связи с тем чга иа практике инагда индекс массива » ндтвтх тг и связанный с нею леассив переменных типа х)овЫе. путем использования преимуществ построчного хране- начинается с ! вместе О, получается очень самнигель- Кроме то! о, код ошибки устанавливается равным постоный кад С.
Эта может яызыяагь недоумение у опытных Когда массив динамически размещен, то указатель ния массива. При этом первый элемент следующей стро- па га), основываясь на размере матрицы, булат указы- Янной А1Л'ОСЕАН, определенной в Доейпев. С-праграммистае, которые ожидают, чга первый злеменг ки хранится в памяти сразу велел за пошгедним элсмен- массива будет иметь индекс О.
Если па нанай-та причи- вать на динамически размещенный массив переменных Г)РИ[у[ех[АН)(Е том текущей строки. Такой поахал практически полезен ие зта абсолютно неабхадима, нужно снабдить «ад са- тина с)овЫе (размещенных в то жс зрел!я, что и сама в том случае, когда расчетны отдельного элемента олнои агяетсгяующими комментариями, поясняющими зга раз- Ниже приведен соответствующий способ абьяяпения укаструктура, с учетол! значений переменных гонга и соЬ). матрицы зависят только от отдельного элемента другой личие. Например, рассмотрите вазможность адресации с помощью функциональной нотации гмк, чтобы индекс Учитывая все вьппесказанное, давайте начнем настоматрицы.
(Это справедливо при сложении и вычитании Ь. /» ВОЬЬ внвмвнвт был заключен з круглых скобках, а не з кяадрзтиых. Как ящлю реализацию набора подпрограмм обработки мат 6Ш- ' Дгтагнитк ы~ыгтгиптичегхгичт~да1и Матричная арт)хмгтггх гг ! Часть О! Глава 17 Обработка ошибок саве ЕСНЕЕНАтСдз Обшспринято, что названия переменных должны гесвгл 'гов-са1ввв в1авассп"! саве 1ИОЕХООЕОРЕАИСЕЕ Основным вопросом при проведении различного рода В сущности, невозможно запретить программисту выпал- быть осмысленными Например, для описания строк гееагв "1вдех оае аг галде"; нять прямой доступ к внутренним элементам структур индекс мгту более предпочтителен, чем !. При условных сложных расчетов в С (и во многих других языках просаве ЬЕИИ1ЯИАГСВг данных.