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

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

Что же такое алгоритм? Я уже неоднократно использовал этот термин для обозначения некоего понятия, не давая ему точное определение. Готов вновь принять упрек в математической неаккуратности, но и сейчас не стану этого делать. Для этого нам пришлось бы забраться в весьма нетривиальную область математики. Нас же, собственно, интересует роль этого понятия в программировании.

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

Впрочем, нелишне привести и пару "некомпьютерных" примеров, иллюстрирующих обсуждаемые понятия.

  • Набор правил, в соответствии с которыми мы действуем, когда переходим через улицу на (не)регулируемом перекрестке. Отметим, кстати, что в этой ситуации допускается определенная степень произвола в осуществлении действий исполнителя, что приводит иногда к весьма драматическим последствиям .

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

В отличие от приведенных ситуаций, где алгоритм действий может быть описан (или реализован) не слишком строго, в отношении компьютерных программ это недопустимо.

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

  • Весьма странным выглядел бы и автоматизированный зачет, когда итоговая оценка выставляется до того, как получены ответы на вопросы. (Впрочем, когда в роли экзаменатора выступает человек, такое встречается :-)

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

  • Выполнение умножения двух натуральных чисел 8 * 9 можно осуществить, по крайней мере, двумя известными способами : либо "заглянуть" в таблицу умножения, либо осуществить сложение 9 восьмерок (или 8 девяток). Какой из вариантов "быстрее"? Не забудем еще и о том, что в двоичной арифметике результат будет получен, на самом деле, еще иначе.

Как, обычно, проектируется алгоритм решения конкретной задачи?

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

Насколько "глубоко" следует забираться в этом процессе, зависит исключительно от конкретной проблемы. Обычно проектировщик старается довести разбиения до таких подзадач, решение которых либо реализуется стандартным образом (например, применяется готовый вспомогательный алгоритм), либо дальше легко программируется "в лоб".

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

При переходе же к собственно программированию, подзадачи обычно оформляются как подпрограммы.

Назад

фондовые индексы онлайн