"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.
Алгоритм — это точная последовательность действий, которая приводит к решению задачи. Одну задачу нередко можно решить разными способами, но одинаково правильные ответы не означают, что способы одинаково хороши. Эффективность показывает, сколько времени и памяти требует алгоритм. Чтобы выбрать подходящий вариант, сравнивают алгоритмы на одинаковых входных данных и учитывают, как растут затраты при увеличении их объёма. Быстрый способ не всегда лучший: он может потребовать слишком много памяти.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Алгоритм — точная последовательность действий для решения задачи. Например, сложить два числа можно разными способами: выполнять сложение в столбик или многократно прибавлять единицу. Понятие алгоритма нужно, чтобы описать решение так, чтобы его можно было выполнить и проверить.
Эффективность алгоритма — оценка того, насколько разумно он расходует ресурсы компьютера при решении задачи. Два алгоритма могут давать один и тот же правильный ответ, но требовать разного количества действий или памяти. Эта оценка помогает выбрать способ, который подходит для конкретных условий.
Время выполнения — время или число элементарных действий, необходимых алгоритму для получения результата. Элементарным действием условно считают простую операцию, например сравнение двух чисел. Подсчёт действий позволяет сравнить алгоритмы независимо от того, насколько быстро работает конкретный компьютер.
Объём используемой памяти — количество памяти, которое требуется алгоритму во время работы. Она нужна для хранения входных данных, промежуточных результатов и вспомогательных сведений. Учёт памяти помогает понять, сможет ли программа работать с доступными ресурсами.
Одну задачу можно решить разными последовательностями действий, потому что к ответу часто ведут несколько путей. Например, числа можно сложить обычным способом или прибавлять единицы, пока не будет получено нужное значение. Оба подхода могут быть правильными, но правильность сообщает только о результате, а не о цене его получения. Поэтому, выбирая алгоритм, отдельно оценивают его затраты.
Чтобы сравнение было честным, алгоритмы запускают на одинаковых входных данных. Иначе один способ может получить больший список или числа другого размера, и сравнение покажет не только разницу в алгоритмах. Можно подсчитать основные действия, измерить время и выяснить, сколько памяти потребовалось. Вместе эти показатели дают более полное представление о работе.
Результат на одном примере не всегда помогает предсказать поведение алгоритма. На маленьком наборе оба способа могут завершиться почти сразу, даже если один выполняет намного больше действий. При увеличении объёма данных эта разница становится заметнее, поэтому смотрят, как меняются затраты. Это позволяет оценить, справится ли способ с будущими задачами, а не только с пробным примером.
Перебор решает задачу тем, что проверяет все возможные варианты и выбирает подходящий. Это удобно, когда вариантов мало: ничего не нужно угадывать или исключать заранее. Но если при добавлении данных число вариантов быстро растёт, компьютеру приходится выполнять всё больше проверок. Тогда правильный перебор может оказаться слишком долгим.
Единственного лучшего алгоритма для любых случаев нет, потому что задачи отличаются ограничениями. Для большого набора данных важным может быть время, а для устройства с небольшой памятью — экономное хранение. Иногда ускорение достигается за счёт дополнительных сведений, которые нужно держать в памяти. Выбор зависит от доступных ресурсов и того, сколько ждать ответа допустимо.
| Что оцениваем | На какой вопрос отвечает | Как сравнивать алгоритмы |
|---|---|---|
| Правильность | Получает ли алгоритм верный результат? | Проверить результат на одинаковых входных данных и убедиться, что он соответствует условию задачи. |
| Число действий или время выполнения | Сколько действий выполняется или сколько времени занимает решение? | Подсчитать основные действия либо измерить время на одинаковых данных. |
| Используемую память | Сколько места требуется алгоритму во время работы? | Сравнить память, нужную для данных и промежуточных результатов. |
| Зависимость затрат от объёма входных данных | Как меняются затраты, когда данных становится больше? | Проверить алгоритмы на наборах разного размера и сравнить рост затрат. |
Сначала проверьте, что алгоритм решает задачу правильно: быстрый, но неверный ответ не годится. Затем сопоставьте время и память на одних и тех же данных. Если входные данные могут увеличиваться, оцените и то, как меняются затраты с их ростом.
Условие: сравним два способа сложить положительные числа 8 и 5. Первый складывает их в столбик, второй начинает с 8 и пять раз прибавляет единицу. Для наглядности посчитаем основные действия, а не время на конкретном компьютере.
Ответ: для небольших чисел оба способа дают правильный результат, но повторное прибавление единицы требует тем больше действий, чем больше второе число. Сложение в столбик обычно эффективнее. Мы сравнивали способы на одинаковых числах и учитывали число действий.
Условие: нужно найти число 42 в упорядоченном списке из 16 чисел. При последовательной проверке элементы просматривают один за другим. Если список отсортирован, можно проверять середину и отбрасывать часть данных.
Ответ: упорядоченность позволяет исключать половину вариантов после каждой проверки. Деление пополам может потребовать меньше сравнений, чем просмотр подряд, но применить его можно лишь тогда, когда порядок элементов известен. На неупорядоченном списке вывод о целой отброшенной половине был бы неверным.
Условие: нужно выяснить, есть ли в списке одинаковые значения. Можно сравнить каждый элемент с каждым следующим или просматривать список и сохранять уже встреченные значения. Сравним эти способы по действиям и памяти.
Ответ: выбор зависит от условий. Для короткого списка может хватить попарной проверки, а для больших данных полезно потратить память на запоминание значений. Оценивать нужно одновременно время и память, а не только число сравнений.
Считать короткую запись алгоритма более эффективной — ошибка: размер текста программы не показывает число действий при выполнении. Её допускают, потому что короткий код выглядит проще. Проверьте себя, подсчитав повторы и основные операции, которые запускает программа.
Нельзя сравнивать алгоритмы на разных входных данных: разницу может вызвать размер или состав данных, а не сам способ решения. Иногда забывают зафиксировать одинаковые условия проверки. Запустите оба алгоритма на одном и том же наборе и только потом сопоставляйте результаты.
Не оценивайте алгоритм только на одном маленьком примере: при малом объёме данных разные способы могут выглядеть одинаково быстрыми. Так происходит потому, что небольшое число действий легко выполнить почти сразу. Проверьте несколько размеров входа и проследите, как растут затраты.
Считать самый быстрый алгоритм всегда лучшим тоже неверно: он может требовать слишком много памяти или не подходить условиям задачи. Быстродействие — лишь один показатель. Перед выбором проверьте, укладывается ли алгоритм в ограничения по времени, памяти и объёму данных.
Чтобы оценивать алгоритмы, нужно уметь читать алгоритмы и программы, понимать повторение действий и определять входные данные. Это помогает увидеть, какие операции выполняются и сколько раз повторяется команда. Такие навыки связывают описание решения с его затратами.
Оценка эффективности пригодится при выборе способа обработки больших наборов данных и написании программ. Чем больше данных получает программа, тем важнее заранее понять, сколько времени и памяти потребует её работа. Поэтому оценка алгоритма помогает спланировать решение до его использования.
Может ли короткая программа оказаться неэффективной?
Да. Короткая запись программы не показывает, сколько действий выполнит компьютер. Даже несколько строк могут запускать очень много повторений.
Почему нельзя сравнить алгоритмы только на одном примере?
Один пример может быть слишком маленьким или необычным, поэтому разница останется незаметной. Нужно также оценить, как меняются затраты, когда входных данных становится больше.
Всегда ли алгоритм, который работает быстрее, лучше?
Нет: быстрый алгоритм может расходовать слишком много памяти. Кроме того, он должен подходить к условиям задачи и давать правильный результат.
Зачем учитывать память, если алгоритм выдаёт правильный ответ?
Для работы алгоритму может понадобиться дополнительное место для данных. Если памяти не хватит, программа не сможет обработать задачу, даже когда её действия правильны.
Почему перебор всех вариантов иногда занимает слишком много времени?
При переборе проверяются варианты один за другим. Если число вариантов быстро растёт вместе с объёмом данных, проверка даже небольшой задачи может потребовать огромного числа действий.
§ 9–10. Поговорим об эффективности