"Информатика (базовый уровень)", Гейн А.Г., Гейн А.А.
Алгоритм — точное описание действий, которое помогает исполнителю решить задачу и получить результат из исходных данных. Чтобы инструкция действительно была алгоритмом, её команды должны быть понятны конкретному исполнителю и выполняться однозначно, шаг за шагом. Алгоритм должен завершаться, давать правильный результат и подходить не только для одного примера, но и для целого класса допустимых данных. Эти свойства помогают отличить алгоритм от совета, приблизительного описания или бесконечного процесса.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Алгоритм — конечная последовательность точных команд, преобразующая исходные данные в результат. Иначе говоря, это план решения задачи, в котором каждый шаг задан достаточно ясно. Определение помогает отличить алгоритм от общего описания желаемого действия.
Исполнитель алгоритма — объект, который понимает команды алгоритма и может их выполнить. Исполнителем может быть человек, компьютер или устройство, действующее по заданным правилам. Это понятие нужно, чтобы оценить, кому адресована инструкция и какие действия он способен выполнить.
Система команд исполнителя — набор допустимых команд, из которых можно составлять алгоритмы для этого исполнителя. Например, компьютер выполняет команды, записанные на понятном ему языке, а робот — команды, предусмотренные его управлением. Система команд позволяет проверить, выполним ли каждый шаг на практике.
Алгоритмический язык — форма записи алгоритма, обеспечивающая однозначное понимание его команд. Это может быть язык программирования или условная запись, правила которой известны исполнителю. Такая форма нужна, чтобы смысл команды не зависел от догадок и личного толкования.
Алгоритм разбивают на отдельные, дискретные шаги, потому что исполнитель должен понимать, какое действие выполнить сейчас и что делать после него. Описание вроде «быстро приготовь блюдо» задаёт цель, но не сообщает порядок операций и критерий готовности. Когда действия перечислены по отдельности, их можно выполнять, проверять и при необходимости повторять.
Понятность команды зависит не только от её формулировки, но и от системы команд исполнителя. Человеку можно предложить «откройте окно», а простому роботу такая фраза может быть непонятна, если в его наборе есть лишь команды движения и захвата. Поэтому алгоритм составляют с учётом возможностей исполнителя: иначе часть инструкций останется невыполнимой.
Определённость означает, что на каждом шаге исполнитель не выбирает способ действия самостоятельно. Если написано «возьми немного сахара», разные исполнители могут взять разное количество, и ход решения изменится. Точная команда, например «добавь 10 г сахара», устраняет такой выбор; условие тоже должно иметь ясный результат проверки — истина или ложь.
Конечность требует, чтобы выполнение алгоритма завершилось после ограниченного числа шагов, а результативность — чтобы при завершении был получен ответ задачи. Это разные требования: короткая запись может содержать цикл, который никогда не остановится, а завершившаяся инструкция может выдать не тот результат. Поэтому проверяют и наличие условия остановки, и то, что в конце получено именно требуемое.
Массовость означает, что алгоритм подходит не к одному набору данных, а к целому классу допустимых исходных данных. Например, способ нахождения большего из двух чисел должен работать для разных пар, а не только для 4 и 7. Это свойство делает алгоритм полезным при решении множества однотипных задач; границы допустимых данных при этом нужно оговорить.
| Свойство | Что означает | Как проверить наличие свойства |
|---|---|---|
| Дискретность | Действия разделены на последовательные шаги. | Можно ли указать начало, каждый отдельный шаг и переход к следующему? |
| Определённость | Команды и порядок действий не допускают разных толкований. | Получат ли разные исполнители одинаковые указания для каждого шага? |
| Понятность | Исполнитель знает команды и умеет их выполнить. | Входят ли все команды в систему команд исполнителя? |
| Конечность | Выполнение заканчивается за конечное число шагов. | Есть ли условие остановки и можно ли обосновать, что оно наступит? |
| Результативность | После завершения получается результат решения задачи. | Можно ли указать, какой ответ должен быть получен в конце? |
| Массовость | Алгоритм рассчитан на класс допустимых исходных данных. | Работает ли он для разных входных данных из указанного класса? |
Пользуйтесь таблицей как проверочным списком: недостаточно убедиться только в точности команд или в том, что пример завершился. Для каждого свойства сформулируйте отдельный вопрос и проверьте алгоритм на разных допустимых данных. Если какое-то свойство нельзя подтвердить, описание нужно уточнить или изменить.
Условие. Рассмотрим инструкцию: «Возьми немного крупы, промой её, вари до готовности и добавь приправы по вкусу». Нужно определить, является ли описание алгоритмом и какие его свойства соблюдены. Проверяем не то, можно ли вообще приготовить блюдо, а насколько точно задано выполнение для выбранного исполнителя.
Ответ. Это полезная инструкция с отдельными действиями, но в строгом смысле она недостаточно определённа, чтобы считать её полноценным алгоритмом. Чтобы улучшить её, нужно указать количество крупы и воды, время варки или точный критерий готовности, а также подходящие исходные продукты. Тогда результат можно будет проверять и воспроизводить.
Условие. Выполним алгоритм для чисел 8, 5, 3: присвоить A значение 8, B значение 5; пока B не равно 0, найти остаток R от деления A на B, затем присвоить A значение B, а B значение R. Записываем значения переменных после каждого шага, чтобы увидеть работу условия и цикла. Такой алгоритм использует правило Евклида для поиска наибольшего общего делителя.
Ответ. Алгоритм завершился, и A = 1 — НОД чисел 8 и 5. Трассировка показывает, какая ветвь выполняется: пока B не равно нулю, действия повторяются, а при B = 0 происходит остановка. Запись промежуточных значений помогает обнаружить ошибки в порядке присваиваний.
Условие. Составим алгоритм для нахождения наибольшего общего делителя двух натуральных чисел a и b. Используем алгоритм Евклида: заменяем пару чисел на меньшее и остаток от деления большего на меньшее. Требуется обосновать не только ответ, но и то, что вычисление завершится и будет правильным.
Ответ. Алгоритм Евклида возвращает НОД исходных чисел: на каждом шаге НОД сохраняется, а остаток уменьшается до нуля. Это одновременно объясняет правильность результата и конечность выполнения. Для любого допустимого набора натуральных чисел с b ≠ 0 шаги определены, поэтому алгоритм массовый.
Считать алгоритмом любое словесное описание — значит не заметить, что команды могут быть неточными или допускать разные толкования. Такую ошибку допускают, потому что в быту многие инструкции понятны благодаря опыту человека, но исполнитель алгоритма не должен догадываться. Проверьте каждую команду: сможет ли конкретный исполнитель выполнить её одинаково, не уточняя смысл?
Если не указать исходные данные и результат, становится непонятно, какую задачу решает алгоритм и что считать успешным завершением. Обычно забывают об этом, когда сосредоточены только на последовательности действий. Для самопроверки назовите, что подаётся на вход и что должно появиться на выходе; если ответить нельзя, постановка неполна.
Конечность записи не означает, что алгоритм обязательно выполнится за малое число шагов: короткий цикл может повторяться очень долго. Это путают, потому что длина описания и длительность работы выглядят похожими характеристиками, хотя измеряют разное. Проверьте наличие остановки и оцените число повторений, не делая вывод о скорости только по числу строк.
Проверка на одном примере не доказывает массовость или правильность для всех допустимых данных. Такой вывод часто делают, потому что на знакомом примере легко увидеть ожидаемый ответ. Проверьте граничные и разные по характеру входные значения, а затем объясните, почему алгоритм работает для всего заданного класса, а не только для испытанных случаев.
Чтобы разбирать алгоритмы, нужно знать понятия исполнителя, команды, переменной, условия и цикла: они описывают, кто действует, какие данные хранит и как меняется ход решения. Пошаговое выполнение инструкций и представление данных помогают проследить изменение значений и не пропустить переход между действиями. Эти навыки применяются при программировании, а свойства алгоритма используют при доказательстве правильности программ и оценке их эффективности.
Чем алгоритм отличается от обычной инструкции или совета?
Алгоритм состоит из точных команд, которые исполнитель может выполнить в установленном порядке и без догадок. Совет может быть полезным, но оставлять выбор способа действия человеку и не гарантировать результат.
Может ли алгоритм содержать условие и повторение действий?
Да. Условие задаёт выбор дальнейших действий в зависимости от данных, а цикл — повторение команд. При этом выполнение должно оставаться однозначным и завершаться за конечное число шагов.
Обязательно ли алгоритм должен быть записан на языке программирования?
Нет, алгоритм можно описать словами, схемой или на специальном алгоритмическом языке, если запись понятна исполнителю. Программа — это алгоритм, записанный на языке программирования и предназначенный для выполнения компьютером.
Почему один и тот же алгоритм нельзя выполнить любому исполнителю?
У каждого исполнителя есть своя система команд: одни действия он умеет выполнять, другие — нет. Поэтому команды алгоритма должны входить в систему команд выбранного исполнителя и быть ему понятны.
Как доказать, что алгоритм обязательно завершится и даст правильный результат?
Для завершения показывают, что число шагов конечно, например что на каждом повторении уменьшается неотрицательная величина и она не может уменьшаться бесконечно. Для правильности доказывают, что действия сохраняют нужное свойство и при завершении дают результат, соответствующий условию задачи.
§ 47. Еще раз о понятии «алгоритм»