Найти в Дзене
Top Skill

Основные сведения об алгоритмах и их построении

Данная статья является дополнением ранее опубликованного видео, поэтому перед прочтением рекомендуется его просмотреть. Алгоритм - четкая последовательность действий (однозначных предписаний), задающая вычислительный процесс, результат выполнения которого полностью определен исходными данными. Алгоритмы обладают следующими основными свойствами: Алгоритм в силу своих свойств должен быть универсальным, сходящимся к результату за определённое количество шагов. Одной и той же задаче может соответствовать множество алгоритмов. Поэтому возникает вопрос - какой алгоритм выбрать? При выборе алгоритма следует руководствоваться следующими показателями, присущими алгоритмам: В результате проведения анализа задачи и алгоритмического конструирования формулируется алгоритм, обладающей некоторой сложностью, которую всегда стремятся уменьшить. Применение структурного построения, при формулировании алгоритмов, позволяет уменьшить их сложность. Структурное построение базируется на двух основных принцип
Данная статья является дополнением ранее опубликованного видео, поэтому перед прочтением рекомендуется его просмотреть.

Алгоритм - четкая последовательность действий (однозначных предписаний), задающая вычислительный процесс, результат выполнения которого полностью определен исходными данными.

Алгоритмы обладают следующими основными свойствами:

  • дискретность – свойство, отражающее выполнение вычислительного процесса, задаваемого алгоритмом по шагам;
  • детерминированность – свойство, означающее, что на каждом шаге любой полученный результат определяется результатами, полученными на предшествующих шагах;
  • элементарность – свойство, согласно которому действие, которое выполняется на каждом шаге должно быть простым;
  • направленность – свойство, обуславливающее необходимость указания, что является результатом того шага, на котором нельзя выполнить определенную в нем операцию;
  • массовость – свойство, согласно которому алгоритм может быть применен к любой совокупности из допустимого множества исходных данных.

Алгоритм в силу своих свойств должен быть универсальным, сходящимся к результату за определённое количество шагов.

Одной и той же задаче может соответствовать множество алгоритмов. Поэтому возникает вопрос - какой алгоритм выбрать? При выборе алгоритма следует руководствоваться следующими показателями, присущими алгоритмам:

  • временная сложность – показатель, отражающий время выполнения алгоритма или количество шагов его выполнения;
  • емкостная сложность – показатель, по которому производят оценку количества данных, необходимых для выполнения алгоритма;
  • сложность описания – показатель, отражающий длину описания алгоритма, количество инструкций операторов.

В результате проведения анализа задачи и алгоритмического конструирования формулируется алгоритм, обладающей некоторой сложностью, которую всегда стремятся уменьшить.

Применение структурного построения, при формулировании алгоритмов, позволяет уменьшить их сложность.

Структурное построение базируется на двух основных принципах:

  • последовательная декомпозиция сверху вниз, когда исходная задача разбивается на подзадачи, до тех пора пока не будет достигнут приемлемый уровень сложности;
Декомпозиция исходной задачи на множество подзадач
Декомпозиция исходной задачи на множество подзадач
  • использование структурного кодирования, а точнее применение методологии программирования, базирующейся на структурном подходе. Одной из таких методологий является структурное императивное программирование, которая заключается в задании хорошей топологии императивных программ, в том числе отказе от использования глобальных данных и оператора безусловного перехода, разработке модулей со слабой связностью и обеспечении их независимости друг от друга, что обеспечивает их переносимость из одного проекта в другой с целью повторного использования.

Целью структурного императивного программирования является повышение надежности программ, обеспечение возможности дальнейшего сопровождения и модификации, облегчение и ускорение разработки.

В основе методологии структурного императивного программирования лежат исследования и опыт учёных Коррадо Бёма и Джузеппе Якопини, которые сформулировали теорему о структурировании (1966 год): любой исполняемый алгоритм может быть преобразован к структурированному виду, то есть такому виду, когда ход его выполнения определяется только при помощи трёх управляющих алгоритмических конструкций: следование, ветвление и цикл.

Таким образом в основе построения структурированных программ лежат три базовые алгоритмические конструкции следование, ветвление и цикл. Более подробно они будут рассмотрены ниже.

Из теоремы Бёма-Якопини существует несколько следствий.

Следствие 1: всякую программу можно привести к форме, не использующей оператор безусловного перехода.

Следствие 2: любой алгоритм можно реализовать на языке, реализующем три управляющие конструкции - следование, ветвление, цикл.

Следствие 3: сложность структурированных программ ограничена, даже в случае их неограниченного размера.

Теперь рассмотрим базовые алгоритмические конструкции более подробно.

В базовой конструкции следование инструкции выполняются последовательно в том порядке, как они записаны в алгоритме, то есть одна за другой.

В базовой конструкции ветвление последовательность выполнения инструкций зависит от заданного условия.

Базовая алгоритмическая конструкция "Ветвление" в виде блок-схемы
Базовая алгоритмическая конструкция "Ветвление" в виде блок-схемы

В базовой конструкции цикл инструкции повторяются до тех пор, пока не изменится заданное условие, прекращающее итерационный процесс.

Базовая алгоритмическая конструкция "Цикл (с предусловием)" в виде блок-схемы
Базовая алгоритмическая конструкция "Цикл (с предусловием)" в виде блок-схемы

Описанные с помощью блок-схем базовые алгоритмические конструкции можно представить в виде псевдокода.

Базовая алгоритмическая конструкция следование в виде псевдокода будет выглядеть следующим образом.

Базовая алгоритмическая конструкция следование в виде псевдокода
Базовая алгоритмическая конструкция следование в виде псевдокода

Базовая алгоритмическая конструкция ветвление в виде псевдокода будет выглядеть следующим образом.

Базовая алгоритмическая конструкция ветвление в виде псевдокода
Базовая алгоритмическая конструкция ветвление в виде псевдокода

Приведённый псевдокод выглядит громоздко и, возможно, некоторым покажется, что он трудно читаем. Это действительно так. Дело в том, что блинные строки всегда читать сложнее коротких, поэтому рекомендуется каждую инструкцию начинать с новой строки. Данный псевдокод содержит два блока условий. Ниже показано как по-другому может выглядеть псевдокод и как его следует читать.

Блок1.

Если Условие 1 тогда
Инструкция 1;

В этом блоке в случае истинности Условия 1 будет выполнена Инструкция 1, а когда это условие ложно Инструкция 1 будет пропущена и управление передано второму блоку условий, идущему сразу за первым.

Блок 2.

Если Условие 2 тогда
Инструкция 2;
Иначе Если Условие 3 тогда
Инструкция 3;
...
Иначе
Инструкция N;

Во втором блоке условий в случае истинности Условия 2 будет выполнена Инструкция 2 и управление будет передано инструкции, стоящей после блока условий, а иначе (когда Условие 1 ложно) Инструкция 2 будет пропущена и управление перейдёт к Условию 3. Если Условие 3 истинно будет выполнена Инструкция 3 и управление будет передано инструкции, стоящей после блока условий, а иначе (когда Условие 2 ложно) Инструкция 3 будет пропущена и управление перейдёт к условию, стоящему после Условия 3 и так далее. Если ни одно из условии в блоке не выполнилось управление будет передано Инструкции N, то есть в секцию "иначе".

Базовая алгоритмическая конструкция "Цикл (с предусловием)" в виде псевдокода будет выглядеть следующим образом.

Базовая алгоритмическая конструкция цикл (с предусловием) в виде псевдокода
Базовая алгоритмическая конструкция цикл (с предусловием) в виде псевдокода

Читается этот псевдокод следующим образом: пока Условие N истинно выполнять Инструкцию N. Как только Условие N становится ложным (false) - цикл прерывается и управление передаётся Инструкции N+1. При необходимости, в эту конструкцию можно добавить нц (начало цикла) и кц (конец цикла), что позволит более явно выделить границы тела цикла (набор исполняемых в цикле инструкций).

Базовая алгоритмическая конструкция "Цикл (с постусловием)" в виде псевдокода будет выглядеть следующим образом.

Базовая алгоритмическая конструкция цикл (с постусловием) в виде псевдокода
Базовая алгоритмическая конструкция цикл (с постусловием) в виде псевдокода

Читается этот псевдокод следующим образом: выполнять Инструкцию N пока Условие N истинно. Как только Условие N становится ложным (false) - цикл прерывается и управление передаётся Инструкции N+1.

В ближайшем времени выйдет ещё одна статья, в которой базовые алгоритмические конструкции ветвление и цикл будут рассматриваться в разных формах на конкретных примерах. Не пропустите :)