![](/stc/img/evkova.png)
Алгоритмизация как обязательный этап разработки программы (Разработка программ)
Содержание:
Введение
Все мы ежедневно встречаемся со множеством задач от самых простых и хорошо известных до очень сложных. Для многих задач существуют определенные правила (инструкции, предписания), объясняющие исполнителю. как решать данную задачу. Эти правила человек может изучить заранее или сформулировать сам в процессе решения задачи. Чем точнее и понятнее будут описаны правила решения задач, тем быстрее человек овладеет ими и будет эффективнее их применять. Источниками возникновения алгоритмов служат: наблюдение и эксперимент, научная теория, прошлый опыт и др.
Решение многих задач человек может передавать техническим устройствам - ПК. автоматам, роботам н т.д. Применение технических устройств предъявляет очень строгие требования к точности описания правил и последовательности выполнения действий. Поэтому разрабатываются специальные языки для четкого н строгого описания различных правил.
Алгоритмизация это раздел информатики, изучающий методы и приемы построений алгоритма, а также их свойства, т. е. алгоритмика задачи, построения модели и алгоритмизация.
Актуальность данной работы обусловлена широкой интеграцией процессов программирования во всех сферах человеческой жизни, их возрастающей сложностью.
В работе будут рассмотрены основные этапы программирования. Особо будет уделено внимание процессам построения алгоритмов.
Этапы создания программ
Разработка программ включает в себя следующие этапы:
1. Анализ и уточнение требований, предъявляемых к программе. Иногда этот этап называют постановкой задачи.
2. Проектирование алгоритма и выбор структур данных (или алгоритмизация).
3. Программирование и отладка.
4. Тестирование программы.
5. Документирование, подготовка инструкции для пользователя программы.
Первые два этапа являются определяющими этапами разработки программного обеспечения. Этап анализа и уточнения требований, предъявляемых к программе – необходимый и весьма ответственный этап , который осуществляется совместно пользователем (заказчиком) программы и ее разработчиком. На этом этапе на основе требований заказчика уточняются три основных момента:
• исходные данные программы: формат данных, источник и порядок ввода, объем исходных данных и ограничения на их значения;
• выходные данные программы: содержание, формат и порядок вывода, возможный объем исходных данных, заголовки и предполагаемые ограничения на их значения;
• аварийные ситуации при вводе и обработке данных и действия пользователя, предусматриваемые при их возникновении.
На этапе анализа и уточнения требований создается более полное, уточненное описание задачи, называемое спецификацией задачи. Спецификация задачи – это очень важный документ, который является техническим заданием на разработку программы и частью соглашения (договора) между разработчиком программного обеспечения и заказчиком.
В спецификации задачи выделяют две ее части:
• функциональную спецификацию;
• эксплуатационную спецификацию.
Функциональная спецификация описывает объекты, относящиеся к задаче: разбиение на предполагаемые подзадачи, их входные и выходные данные, связи между ними, реакции на аварийные ситуации.
Эксплуатационная спецификация содержит требования к скорости работы программы и используемым ресурсам памяти, характеристикам и конфигурации ЭВМ, на которой должна работать программа, и специальные требования к надежности и безопасности ее работы.
На втором этапе разработки программного обеспечения проектируется алгоритм решения задачи в соответствии с заданной спецификацией, формируется общая структура программы, определяются компоненты и их входные и выходные параметры.
Основным подходом к проектированию структуры программы является нисходящее проектирование или пошаговое уточнение. Этот подход заключается в том, что программа первоначально рассматривается как «черный ящик», который выполняет некоторую функцию F, преобразующую единственные входные данные в единственные выходные данные. Это общая функция F может быть разделена на ряд более простых подфункций F1, F2,…, Fk. Каждая из этих функций сама по себе представляет такой же «черный ящик».
Процесс разбиения завершается тогда, когда любая из определенных функций может быть описана с помощью простых базовых операций и управляющих структур алгоритмов. В процессе проектирования формируется структура задачи в виде дерева подзадач (подфункций).
Эта иерархическая структура задачи определяет структур компонент создаваемой программы. Компонента программы называется подпрограммой. В случае, если задача является сложной, целесообразно программу разделить на компоненты, одна из которых будет главной и организующей вычислительный процесс, а другие компоненты будут подпрограммами, которые будут выполняться в порядке, соответствующем алгоритму. Программы, выполняющие относительно простые задачи, могут не содержать подпрограмм.
Результатом данного этапа разработки является формализованное описание алгоритма или проект программы.
Третьим этапом разработки программы является программирование и отладка. На этом этапе алгоритм записывается на языке программирования высокого уровня, и производится отладка программы с помощью соответствующей системы программирования (транслятора данного языка). Во время отладки исправляются обнаруженные в тексте программы ошибки. Результатом отладки является текст программы, не содержащей ошибок и выполненной хотя бы один раз на ПЭВМ. Таким образом, создается работоспособная программа.
На этапе тестирования программы выполняется проверка правильности работы программы с использованием заранее подготовленных тестов. Тест – это набор исходных данных и соответствующих им результатов, которые должна выдавать программа при обработке этих исходных данных. Для сложных задач составление тестов является весьма трудоемкой работой, включающей ручные расчеты или использование других программ-аналогов.
При обнаружении неправильных результатов на этапе тестирования происходит возврат на предыдущие этапы разработки программы. Результатом тестирования является окончательная версия программы и документация о результатах выполнения тестов.
Последний этап разработки ПО – подготовка пользовательской документации, состав которой определяется заказчиком. Обычно документация для пользователя включает в себя:
- описание применения, которое содержит сведения о назначении про-граммы, требования к техническим и программным средствам ЭВМ, состав и функции программы, применяемые математические алгоритмы;
- руководство пользователя, в котором описаны входные и выходные данные, способы запуска программы, режимы работы, дан перечень сообщений и описана реакция пользователя на каждое сообщение.
Понятие алгоритма и его свойства.
Для составления программы, предназначенной для решения на ЭВМ какой-либо задачи, требуется составление алгоритма ее решения.
Алгоритм — это точное предписание, которое определяет процесс, ведущий от исходных данных к требуемому конечному результату. Алгоритмами, например, являются правила сложения, умножения, решения алгебраических уравнений, умножения матриц и т.п. Слово алгоритм происходит от algoritmi, являющегося латинской транслитерацией арабского имени хорезмийского математика IX векааль-Хорезми. Благодаря латинскому переводу трактата аль-Хорезми европейцы в XII веке познакомились с позиционной системой счисления, и в средневековой Европе алгоритмом называлась десятичная позиционная система счисления и правила счета в ней.
Применительно к ЭВМ алгоритм определяет вычислительный процесс, начинающийся с обработки некоторой совокупности возможных исходных данных и направленный на получение определенных этими исходными данными результатов. Термин вычислительный процесс распространяется и на обработку других видов информации, например, символьной, графической или звуковой.
Если вычислительный процесс заканчивается получением результатов, то говорят, что соответствующий алгоритм применим к рассматриваемой совокупности исходных данных. В противном случае говорят, что алгоритм неприменим к совокупности исходных данных. Любой применимый алгоритм обладает следующими основными свойствами:
-
- результативностью;
- определенностью;
- массовостью.
Результативность означает возможность получения результата после выполнения конечного количества операций.
Определенность состоит в совпадении получаемых результатов независимо от пользователя и применяемых технических средств.
Массовость заключается в возможности применения алгоритма к целому классу однотипных задач, различающихся конкретными значениями исходных данных.
Для задания алгоритма необходимо описать следующие его элементы:
- набор объектов, составляющих совокупность возможных исходных данных, промежуточных и конечных результатов;
- правило начала;
- правило непосредственной переработки информации (описание последовательности действий);
- правило окончания;
- правило извлечения результатов.
Алгоритм всегда рассчитан на конкретного исполнителя. В нашем случае таким исполнителем является ЭВМ. Для обеспечения возможности реализации на ЭВМ алгоритм должен быть описан на языке, понятном компьютеру, то есть на языке программирования.
Таким образом, можно дать следующее определение программы.
Программа для ЭВМ представляет собой описание алгоритма и данных на некотором языке программирования, предназначенное для последующего автоматического выполнения.
Методика разработки алгоритмов
Разработке алгоритма предшествуют такие этапы, как формализация и моделирование задачи. Формализация предполагает замену словесной формулировки решаемой задачи краткими символьными обозначениями, близкими к обозначениям в языках программирования или к математическим. Моделирование задачи является важнейшим этапом, целью которого является поиск общей концепции решения. Обычно моделирование выполняется путем выдвижения гипотез решения задачи и их проверке любым рациональным способом (прикидочные расчеты, физическое моделирование и т.д.). Результатом каждой проверки является либо принятие гипотезы, либо отказ от нее и разработка новой.
При разработке алгоритма используют следующие основные принципы.
Принцип поэтапной детализации алгоритма (другое название — "проектирование сверху-вниз"). Этот принцип предполагает первоначальную разработку алгоритма в виде укрупненных блоков (разбиение задачи на подзадачи) и их постепенную детализацию.
Принцип "от главного к второстепенному", предполагающий составление алгоритма, начиная с главной конструкции. При этом, часто, приходится "достраивать" алгоритм в обратную сторону, например, от середины к началу.
Принцип структурирования, т.е. использования только типовых алгоритмических структур при построении алгоритма. Нетиповой структурой считается, например, циклическая конструкция, содержащая в теле цикла дополнительные выходы из цикла. В программировании нетиповые структуры появляются в результате злоупотребления командой безусловного перехода (GoTo). При этом программа хуже читается и труднее отлаживается.
Способы описания алгоритмов
К основным способам описания алгоритмов можно отнести следующие:
- словесно-формульный;
- структурный или блок-схемный;
- с помощью граф-схем;
- с помощью сетей Петри.
Перед составлением программ чаще всего используются словесно-формульный и блок-схемный способы. Иногда перед составлением программ на низкоуровневых языках программирования типа языка Ассемблера алгоритм программы записывают, пользуясь конструкциями некоторого высокоуровнего языка программирования. Удобно использовать программное описание алгоритмов функционирования сложных программных систем. Так, для описания принципов функционирования ОС использовался Алголоподобный высокоуровневый язык программирования.
При словесно-формульном способе алгоритм записывается в виде текста с формулами по пунктам, определяющим последовательность действий.
Пусть, например, необходимо найти значение следующего выражения:
у = 2а – (х+6).
Словесно-формульным способом алгоритм решения этой задачи может быть записан в следующем виде:
1. Ввести значения а и х.
2. Сложить х и 6.
3. Умножить a на 2.
4. Вычесть из 2а сумму (х+6).
5. Вывести у как результат вычисления выражения.
При блок-схемном описании алгоритм изображается геометрическими фигурами (блоками), связанными по управлению линиями (направлениями потока) со стрелками. В блоках записывается последовательность действий.
Данный способ по сравнению с другими способами записи алгоритма имеет ряд преимуществ. Он наиболее нагляден: каждая операция вычислительного процесса изображается отдельной геометрической фигурой. Кроме того, графическое изображение алгоритма наглядно показывает разветвления путей решения задачи в зависимости от различных условий, повторение отдельных этапов вычислительного процесса и Другие детали.
Оформление программ должно соответствовать определенным требованиям. В настоящее время действует единая система программной документации (ЕСПД), которая устанавливает правила разработки, оформления программ и программной документации. В ЕСПД определены и правила оформления блок-схем алгоритмов (ГОСТ 10.002-80 ЕСПД, ГОСТ 10.003-80 ЕСПД).
Операции обработки данных и носители информации изображаются на схеме соответствующими блоками. Большая часть блоков по построению условно вписана в прямоугольник со сторонами а и b. Минимальное значение а = 10 мм, увеличение а производится на число, кратное 5 мм. Размер b=1,5a. Для от дельных блоков допускается соотношение между а и b, равное 1:2. В пределах одной схемы рекомендуется изображать блоки одинаковых размеров. Все блоки нумеруются. Виды и назначение основных блоков приведены в табл. 1.
Наименование |
Обозначение |
Функции |
Процесс |
|
Выполнение операции или группы операций, в результате которых изменяется значение, форма представления или расположение данных. |
Ввод-вывод |
|
Преобразование данных в форму, пригодную для обработки (ввод) или отображения результатов обработки (вывод). |
Решение |
|
Выбор направления выполнения алгоритма в зависимости от некоторых переменных условий. |
Предопределенный процесс |
|
Использование ранее созданных и отдельно написанных программ (подпрограмм). |
Документ |
|
Вывод данных на бумажный носитель. |
Магнитный диск |
|
Ввод-вывод данных, носителем которых служит магнитный диск. |
Пуск-останов |
|
Начало, конец, прерывание процесса обработки данных. |
Соединитель |
|
Указание связи между прерванными линиями, соединяющими блоки. |
Межстраничный соединитель |
|
Указание связи между прерванными линиями, соединяющими блоки, расположенные на разных листах. |
Комментарий |
|
Связь между элементом схемы и пояснением. |
Таблица 1. Условные обозначения блоков схем алгоритмов
Линии, соединяющие блоки и указывающие последовательность связей между ними, должны проводится параллельно линиям рамки. Стрелка в конце линии может не ставиться, если линия направлена слева направо или сверху вниз. В блок может входить несколько линий, то есть блок может являться преемником любого числа блоков. Из блока (кроме логического) может выходить только одна линия. Логический блок может иметь в качестве продолжения один из двух блоков, и из него выходят две линии. Если на схеме имеет место слияние линий, то место пересечения выделяется точкой. В случае, когда одна линия подходит к другой и слияние их явно выражено, точку можно не ставить.
Схему алгоритма следует выполнять как единое целое, однако в случае необходимости допускается обрывать линии, соединяющие блоки.
Если при обрыве линии продолжение схемы находится на этом же листе, то на одном и другом конце линии изображается специальный символ соединитель — окружность диаметром0,5 а. Внутри парных окружностей указывается один и тот же идентификатор. В качестве идентификатора, как правило, используется порядковый номер блока, к которому направлена соединительная линия.
Если схема занимает более одного листа, то в случае разрыва линии вместо окружности используется межстраничный соединитель. Внутри каждого, соединителя указывается адрес — откуда и куда направлена соединительная линия. Адрес записывается в две строки: в первой указывается номер листа, во второй — порядковый номер блока.
Блок-схема должна содержать все разветвления, циклы и обращения к подпрограммам, содержащиеся в программе.
Подходы к созданию алгоритмов
Одним из наиболее важных аспектов алгоритма является его скорость. Часто бывает легко придумать алгоритм решающий задачу, но если алгоритм слишком медленный, то он возвращается на доработку. Поскольку точная скорость алгоритма зависит от того где запускается алгоритм, а также деталей реализации, компьютерные специалисты обычно говорят о времени выполнения относительно входных данных. Например, если вход состоит из N целых чисел, то алгоритм может иметь время выполнения пропорциональное N2, что представляется как O(N2). Это означает, что если вы запустите реализацию алгоритма на компьютере с входом размером в N, то это займет C*N2 секунд, где C-некоторая константа, которая не меняется с изменением размера входа.
Тем не менее, время выполнения многих сложных алгоритмов зависит не только от размера входных данных, но и от множества других факторов. Например, алгоритм сортировки множества целых чисел может работать намного быстрее, если это множество уже отсортировано. Принято говорить о наихудшем случае выполнения, и среднем случае выполнения. Наихудшее время выполнения - это максимальное время работы алгоритма при самом "плохом" из всех возможных входов. Средний случай выполнения - это среднее время работы алгоритма на всех возможных входах. Из этих двух типов времени выполнения, легче всего рассуждать о наихудшем случае и поэтому его используют чаще в качестве эталона для заданного алгоритма. Процесс определения наихудшего и среднего случая времени выполнения алгоритма может быть достаточно сложным, т.к. обычно невозможно запустить алгоритм для всех возможных входов.
Сортировка. Сортировка является хорошим примером алгоритма, который часто используется программистами. Самый простой способ отсортировать группу элементов это начать с удаления наименьшего элемента из группы, и поставить его первым. Затем удаляется второй по величине элемент и ставится вторым и т.д. К сожалению, время работы этого алгоритма составляет O(N2), а это означает, что потребуется количество времени пропорциональное количеству элементов в квадрате. Если бы нам пришлось сортировать млрд. элементов, то этот алгоритмы бы потребовал 1018 операций. Если считать что обычные настольные ПК делают примерно 109 операций в секунду, то потребуются годы чтобы закончить сортировку этого млрд. элементов.
К счастью существует ряд более совершенных алгоритмов, например, быстрая сортировка (quicksort), пирамидальная сортировка (heapsort) и сортировка слияния(mergesort). Эти алгоритмы имеют время выполнения O(N * Log(N)). Таким образом, число операций необходимых для сортировки млрд. элементов сокращается до таких разумных пределов, что даже самый дешевый настольный ПК способен провести такую сортировку. Вместо млрд. в квадрате операций (1018) эти алгоритмы требуют только 10 млрд. операций (1010), т.е. в 100 млн. раз быстрее.
Кратчайший путь. Алгоритмы поиска кратчайшего пути из одной точки в другую исследуются уже на протяжении многих лет. Примеров прикладного применения этих алгоритмов предостаточно, однако для простоты изложения будем придерживаться следующей постановки: требуется найти кратчайший путь из точки А в точку Б в городе с несколькими улицами и перекрестками. Существует много разных алгоритмов для решения этой задачи и все они со своими преимуществами и недостатками. Прежде чем мы углубимся в их изучение, давайте рассмотрим время выполнения простого алгоритма перебором. Если алгоритм рассматривает каждый возможный путь от А до Б (который не образует циклов) он вряд ли закончится при нашей жизни, даже если А и Б находятся в маленьком городке. Время выполнения этого алгоритма является экспоненциальным, что обозначается как O(CN) для некоторого C. Даже для малых значений C, CN становится астрономическим числом, когда N принимает умеренно большое значение.
Один из самых быстрых алгоритмов для решения этой задачи имеет время выполнения O(E+V*Log(V)), где E число дорожных сегментов, а V число пересечений. Алгоритм займет около 2 секунд времени, для поиска кратчайшего пути в городе из 10000 пересечений и 20000 дорожных сегментов (обычно бывает около 2 дорожных сегментов на одно пересечение). Этот алгоритм известен как алгоритм Дейкстры, он является довольно таки сложным и требует использования структуры данных очередь с приоритетом (priority queue). Однако в некоторых случаях даже такое время выполнения является слишком медленным (взять например нахождение кратчайшего пути от Нью-Йорка до Сан-Франциско - в США есть миллионы пересечений), в таких случаях программисты пытаются улучшить время выполнения с помощью так называемой эвристики. Эвристика - это приближенное значение чего-то, что имеет отношение к задаче. В задаче поиска кратчайшего пути, например, может оказаться полезным знать, как далеко находится точка от пункта назначения. Зная это можно разработать более быстрый алгоритм (например алгоритм поиска А* в некоторых случаях работает значительно быстрее чем алгоритм Дейкстры). Такой подход не всегда улучшает время выполнения алгоритма в наихудшем случае, но в большинстве реальных приложений алгоритм начинает работать быстрее.
Приближенные алгоритмы. Иногда даже самый продвинутый алгоритм с самой продвинутой эвристикой работает слишком медленно на самом быстром компьютере. В таких случаях приходится снижать точность конечного результата. Вместо того чтобы пытаться получить кратчайший путь, можно ограничиться путем, который например на 10% больше чем кратчайший путь.
На самом деле есть немало важных задач, для которых известные на сегодня алгоритмы выдают оптимальный результат слишком медленно. Наиболее известная группа из этих задач называется NP (non-deterministic polynomial). Если задача называется NP-полной или NP-трудной, то это означает, что никто не знает достаточно хорошего способа для получения оптимального решения. Кроме того, если кто-то разработает эффективный алгоритм для решения одной NP-трудной задачи, то этот алгоритм можно будет применить ко всем NP-трудным задачам.
Хорошим примером NP-трудной задачи является задача коммивояжёра. Продавец хочет посетить N городов, и он знает, сколько времени занимает перемещение из одного города в другой. Вопрос в том насколько быстро он сможет посетить все города? Самый быстрый из известных алгоритмов для решения этой задачи является слишком медленным - и многие считают, что так будет всегда - поэтому программисты ищут достаточно быстрые алгоритмы, дающие хорошее решение, но часто не оптимальное.
Случайные алгоритмы. Еще один подход, применяемый для решения некоторых задач, заключается в том, чтобы сделать алгоритм случайным. Данный подход не улучшает время алгоритма в худшем случае, но довольно часто хорошо работает в среднем случае. Алгоритм быстрой сортировки является хорошим примером использования рандомизации. В худшем случае, алгоритм быстрой сортировки сортирует группу элементов за O(N2), где N количество элементов. Если в этом алгоритме использовать рандомизацию, то шансы на худший случай становятся незначительно малыми, и в среднем случае алгоритм быстрой сортировки работает за время O(N*Log(N)). Другие алгоритмы даже в худшем случае гарантируют время работы O(N*Log(N)), однако они медленнее в среднем случае. Хотя оба алгоритма имеют время работы пропорциональное N*Log(N), алгоритм быстрой сортировки имеет более меньший постоянный коэффициент (constant factor) - т.е. он требует C*N*Log(N), в то время как другие алгоритмы требуют более 2*C*N*Log(N) операций.
Другой алгоритм, использующий случайные числа ищет медиану для группы чисел и его время работы в среднем случае составляет O(N). Это намного быстрее по сравнению с алгоритмом, который сортирует числа и выбирает среднее, и работает за O(N*Log(N)). Существуют детерминированные алгоритмы (не случайные) которые позволяют найти медиану за время O(N), однако случайный алгоритм проще для понимания и часто работает быстрее этих детерминированных алгоритмов.
Основная идея алгоритма поиска медианы это выбрать среди чисел случайное, и посчитать, сколько чисел в группе меньше чем выбранное число. Допустим, есть N чисел, K из них меньше или равно выбранному числу. Если K меньше чем половина N, тогда мы знаем что медиана это (N/2-K)-е число которое больше чем случайно выбранное число, так что мы отбрасываем K чисел меньших или равных случайному числу. Теперь допустим мы хотим найти (N/2-K)-е наименьшее число, вместо медианы. Алгоритм такой же, мы просто случайно выбираем число и повторяем описанные шаги.
Сжатие. Еще один класс алгоритмов предназначен для сжатия данных. Этот алгоритм не имеет ожидаемого результата (как например, алгоритм сортировки), но вместо этого делается оптимизация по некоторым критериям. В случае сжатия данных, алгоритм (например, LZW) пытается сделать так чтобы данные занимали как можно меньше байтов, но в то же время, чтобы можно было распаковывать их до первоначальной формы. В некоторых случаях этот тип алгоритмов использует те же методы что и другие алгоритмы, что приводит к хорошему результату, но неоптимальному. Например, JPG и MP3 сжимают данные таким образом, что конечный результат получается более низкого качества, чем оригинал, однако и размер меньше. MP3 сжатие не сохраняет каждую особенность оригинального аудио файла, но пытается сохранить достаточно деталей, чтобы обеспечить приемлемое качество и в то же время значительно сократить размер файла. Формат JPG следует тому же принципу, но детали существенно отличаются, т.к. целью является сжатие изображения, а не аудио.
Зачем нужно знать всякие алгоритмы. Чтобы использовать алгоритмы должным образом, важно знать все упомянутые типы алгоритмов. Это позволит при разработке важной части программного обеспечения, оценить скорость работы созданного алгоритма. Точность этой оценки зависит от того насколько верно анализируется время исполнения алгоритмов. Кроме этого, знание деталей алгоритмов позволит предсказывать особые случаи, в которых программа не будет работать быстро, или будет давать неприемлемые результаты.
В качестве примера можно рассмотреть, как работают сетевые коммутаторы. Коммутатор имеет N подключенных к нему кабелей, и принимает пакет данных, поступающих по этим кабелям. Коммутатор должен сначала проанализировать пакеты, а затем отправить их обратно по правильному кабелю. Коммутатор также как и компьютер работает в дискретном режиме - пакеты отправляются дискретными интервалами, а не непрерывно. Быстрый коммутатор стремится послать, как можно больше пакетов в течение каждого интервала иначе они накопятся и коммутатор "упадет". Цель алгоритма отправлять максимальное количество пакетов в течение каждого интервала, а также обеспечить порядок, при котором пакеты, пришедшие раньше других отправлялись тоже раньше других. В этом случае оказывается, что для решения этой задачи подходит алгоритм известный как "stable matching", хотя на первый взгляд это может быть не очевидно. Такие связи между задачей и решением можно обнаружить только с помощью уже имеющихся алгоритмических знаний.
Реальные примеры. Примеров решений реальных задач требующих новейших алгоритмов предостаточно. Почти все, что выполняется на компьютере зависит от алгоритмов, которые кто-то очень долго разрабатывал. Даже самых простых программ не существовало бы без алгоритмов, которые работают "за сценой" управляя памятью и загружая данные с жесткого диска.
Существуют десятки примеров применения сложных алгоритмов. Расссмотрим две из них. Первая задача известна как задача о максимальном потоке, а вторая связана с динамическим программированием - методом который часто позволяет решать задачи с казалось бы невозможной молниеносной скоростью.
Алгоритм поиска максимального потока. Задача поиска максимального потока состоит в том, чтобы посредством имеющейся сети наилучшим образом переместить что-то из одного места в другое. Конкретно такая проблема впервые возникла в 1950-х в связи с железнодорожными путями Советского Союза. США хотели знать, как быстро Советский Союз может подвозить материалы к государствам-сателлитам в Восточной Европе через свою сеть железных дорог.
Кроме того США хотели знать какую часть рельсов можно наиболее легко уничтожить чтобы отрезать государства-сателлиты от остальной части Советского Союза. Оказалось, что эти две задачи тесно связаны и что решение задачи поиска максимального потока также решает задачу о минимальном разрезе, что, в конечном счете, позволит выяснить самый дешевый способ отрезать Советский Союз от своих спутников.
Первый эффективный алгоритм для поиска максимального потока был придуман учеными Фордом и Фалкерсоном. Алгоритм впоследствии был назван алгоритмом Форда - Фалкерсона и является одним из наиболее известных алгоритмов в области компьютерной науки. В последние 50 лет алгоритм претерпел ряд улучшений, что сделало его быстрее (правда, некоторые из этих улучшений пугают своей сложностью).
Поскольку задача была четко поставлена, обнаружилось множество различных применений. Алгоритм напрямую связан с Интернетом, где важно транспортировать максимум данных из одной точки в другую. Задача также возникает во множестве бизнес-процессов, и является важной частью исследования операций. Например, если есть N сотрудников и N задач, которые должны быть сделаны, но не каждый сотрудник может справиться с каждой задачей, то поиск максимального потока выдаст решение, как назначить N сотрудников на задачи таким образом, чтобы каждая задача была выполнена при условии что это возможно. Задача Graduation из TopCoder SRM 200 является хорошим примером задачи на поиск максимального потока.
Сравнение последовательностей. Многим кодерам за всю свою карьеру ни разу не приходилось реализовывать алгоритм, использующий динамическое программирование. Тем не менее, динамическое программирование применяется в ряде важных алгоритмов. Один из алгоритмов это нахождение различий между двумя последовательностями, который большинство программистов наверняка использовали, хотя возможно и не разбирались в нем. Этот алгоритм вычисляет минимальное количество вставок, удалений, редактирований необходимых для преобразования последовательность A в последовательность B.
Например, рассмотрим последовательности "AABAA" и "AAAB". Для преобразования первой последовательности во вторую самое простое, что нужно сделать это удалить B в середине и изменить последнюю A на B. Этот алгоритм имеет множество применений, включая некоторые задачи связанные с ДНК и обнаружением плагиата. Однако многие программисты используют его в основном для сравнения версий одного и того же файла с исходным кодом. Если элементы последовательности это строки в файле, тот этот алгоритм позволяет узнать какие строки надо удалить, вставить, изменить чтобы преобразовать одну версию файла в другую.
Без динамического программирования приходится перебирать экспоненциальное число преобразований, чтобы перейти от одной последовательности к другой. Однако динамическое программирование сокращает время выполнения алгоритма до O(N*M), где N и M количество элементов в двух последовательностях.
Заключение
Рассмотрев в данной работе основные этапы программирования, свойства алгоритмов, их типы, правила построения мы с уверенностью можем сказать что алгоритмизация является важнейшим этапом создания программ. От грамотного построения алгоритма поставленной задачи во многом зависит скорость работы программ, а так же правильность получаемых решений.
Все это указывает на необходимость тщательного подхода к разработке алгоритмов, и вместе с тем, это требует более профессиональных навыков от специалиста, чем простое написание кода.
С учетом возрастающей сложности решаемых задач в различных сферах жизнедеятельности человека, решение этих задач не только не возможно без построения алгоритма их решения, но и делает задачу алгоритмизации решения важнейшим этапов в создании программного обеспечения.
Список использованной литературы.
- Основы алгоритмизации и программирования : учебник для студ. учреждений сред. проф. образования / И. Г.Семакин, А. П. Шестаков. — 3-е изд., стер. — М.: Издательский центр «Академия», 2012. — 400 с.
- Основы алгоритмизации: Учебное пособие / Т.А. Бочарова, Н.О. Бегункова. - Хабаровск: Изд-во Тихоокеан. гос.ун-та, 2011. - 64 с.
- Основы алгоритмизации и программирования: учеб. пособие / Т.А. Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос.ун-та, 2011. – 56 с.
- ГОСТ 19.701—90 (ИСО 5807 - 85) "Единая система программной документации".
- Имущество как объект гражданских правоотношений
- Предпринимательская деятельность в индустрии спорта(Физическая культура и спорт в структуре современного рынка)
- Современные методы и приемы работы с персоналом, методики создания эффективных производственных коллективов. На примере реально существующей организации в гостиничном или ресторанном бизнесе.
- Анализ различных видов конфликтов и разработка предложений по их предупреждению в индустрии гостеприимства
- Управление поведением в конфликтных ситуациях (Управление конфликтами в ООО «РОЗАРОЗ»)
- Применение проектных технологий в качестве инструмента развития бизнеса (Основные понятия: проект и жизненный цикл проекта)
- Построение организационных структур (Факторы, определяющие организационную структуру, и требования к ее построению)
- Проектирование базы данных Учета расчетов с поставщиками и подрядчиками (Описание предметной области. Постановка задачи)
- Развитие взглядов на управления человеческими ресурсами
- Человеческий фактор в управлении организацией (Роль человеческого фактора в управлении)
- Договор коммерческой концессии /франчайзинга/
- Управление финансовыми ресурсами предприятия (Структура и виды финансовых ресурсов предприятия)