Для измерения времени выполнения алгоритма можно воспользоваться общепринятыми единицами измерения времени – секундой, миллисекундой и т.д. Однако у такого подхода существуют явные недостатки, поскольку результаты измерений будут зависеть от:
Поскольку перед нами стоит задача измерения эффективности алгоритма, а не реализующей его программы, мы должны воспользоваться такой системой измерений, которая бы не зависела от приведенных выше посторонних факторов.
Один из возможных способов решения этой проблемы состоит в подсчете того, сколько раз выполняется каждая операция алгоритма. Однако подобный подход слишком сложен и чаще всего не нужен. Достаточно рассмотреть список наиболее важных операций, выполняемых в алгоритме, называемых основными, или базовыми операциями, определить, какие из них вносят наибольший вклад в общее время выполнения алгоритма, и вычислить, сколько раз эти операции выполняются.
Обычно в него включают наиболее длительные по времени операции, выполняемые во внутреннем цикле алгоритма. Например, в алгоритме сортировки основной является операция сравнения ключей. В алгоритме перемножения матриц используются две основные операции: умножение и сложение.
Таким образом, временную эффективность алгоритма можно оценить по количеству основных операций, которые должен выполнить алгоритм при обработке входных данных размера n.
Предположим, что tор – время выполнения
основной операции алгоритма на конкретном компьютере, а C(n) –
количество раз, которые эта операция должна быть выполнена при работе алгоритма. Тогда
время выполнения программной реализации этого алгоритма на данном
компьютере T(n) можно приблизительно определить по следующей формуле:
T(n)≈top⋅C(n).
В значении счетчика C(n) не учитывается количество выполняемых алгоритмом операций, не относящихся к основным. Кроме того, обычно значение этого счетчика также можно определить только приблизительно. Более того, значение константы top также можно определить лишь приблизительно и оценить ее точность весьма непросто. Тем не менее, эта формула дает приемлемую оценку времени выполнения алгоритма для не бесконечно больших и не бесконечно малых значений n.
Пусть, C(n)=n⋅(n-1)2. Насколько дольше будет выполняться
программа, если удвоить размер входных данных? Ответ будет такой: приблизительно
в четыре раза медленнее. В самом деле, для достаточно больших n справедлива
следующая формула:
C(n)=12n(n-1)=12n2-12n≈12n2.
Поэтому
T(2n)T(n)≈top⋅C(2n)top⋅C(n)≈12(2n)212n2=4
Обратите внимание, что для ответа на вопрос не нужно знать реальное значение top, поскольку в приведенной выше дроби оно сокращается. Обратите также внимание, что постоянный множитель 12 в формуле для C(n) тоже сокращается. По этим причинам в процессе анализа эффективности при достаточно больших размерах входных данных не учитывают постоянные множители, а сосредотачиваются на оценке порядка роста количества основных операций с точностью до постоянного множителя.