Показатели эффективности алгоритмов
Вы уже знаете, что решить задачу можно различными способами. И в разных случаях может понадобиться неодинаковое количество ресурсов — например, времени. При выборе алгоритма это стоит принимать во внимание. Можно вспомнить пример о том, как добираться на работу. Что же учитывать при написании программ?
В идеале хотелось бы знать, сколько времени потребуется, чтобы алгоритм закончил работу и выдал нужный результат. Но проблема в том, что затраченное время зависит от множества аспектов: от языка программирования, от компилятора, операционной системы, процессора, от того, расположены ли данные в оперативной памяти или на диске, и от других факторов.
Хорошо бы иметь метрику, которая бы не зависела от того, кто, где и когда запускает программу. И чтобы эта метрика позволяла сравнивать разные алгоритмы между собой.
В качестве такой метрики используют вычислительную сложность. Она отражает скорость работы программы.
Измеряют вычислительную сложность в количестве выполняемых компьютером элементарных операций.
Под элементарной операцией понимают любую арифметическую операцию или операцию сравнения. Например, чтобы сложить два числа, нужна одна элементарная операция сложения.
На различные арифметические операции компьютер тратит неодинаковое количество ресурсов. Скажем, деление намного дороже сложения. Но при анализе сложности алгоритмов этим обычно пренебрегают. Скорость роста функции, описывающей зависимость количества элементарных операций от объёма входных данных, намного больше влияет на время работы алгоритма по мере увеличения объёма входных данных.
Оценить вычислительную сложность — значит найти зависимость между объёмом входных данных и числом элементарных операций, выполняемых алгоритмом.
Допустим, вы нашли мешок с монетами и хотите посчитать общую сумму денег в мешке. Сколько операций для этого нужно? Если число монет n, то n - 1 операция сложения.
Другой важный ресурс, помимо времени — память. Её объем на практике всегда ограничен. Нужно следить за тем, сколько её расходуется при работе программы. Для измерения этого ресурса используют пространственную сложность.
Оценить пространственную сложность — значит выяснить, как объём памяти, выделенный компьютером для работы алгоритма, меняется в зависимости от объёма входных данных.
Допустим, вы хотите найти в мешке монету максимального достоинства. Нужна ли для решения этой задачи дополнительная память? И будет ли объём затраченной памяти меняться, если монет в мешке станет больше?
Для решения задачи нужно помнить значение текущего максимума, чтобы сравнивать с ним ценность монеты на каждом следующем шаге. Будем хранить значение текущего максимума в переменной current_maximum. Под эту переменную нужно выделить память. Больше в этом алгоритме никакие данные сохранять не надо.