
Сравнение скорости роста
Итак, мы предполагаем, что программы можно оценить с помощью функций времени выполнения, пренебрегая при этом константами пропорциональности. С этой точки зрения программа с временем выполнения O(n2), например, лучше программы с временем выполнения O(n3). Константы пропорциональности зависят не только от используемых компилятора и компьютера, но и от самой программы. Пусть при определенных условиях одна программа выполняется за 100n2 единиц времени, а вторая – за 5n3. Может ли вторая программа быть предпочтительней, чем первая?
Ответ на этот вопрос зависит от размера входных данных программ. При n<20 программа с временем выполнения 5n3 завершится быстрее. Однако при возрастании n программа с временем выполнения 5n3 становится все менее предпочтительной.
Другая причина, заставляющая отдавать предпочтение программам с наименьшей степенью роста выполнения, заключается в том, что чем меньше степень роста, тем больше размер задачи, которую можно решить на компьютере. Другими словами, если увеличивается скорость вычисления компьютера, то растет также и размер задач, решаемых на компьютере.
Пример.
Предположим, что имеются 4 программы,
временная сложность которых
и
что можно использовать 1000 секунд
(примерно 17 минут) машинного времени
для решения задачи. Какой максимальный
размер задачи, решаемой за это время?
За 1000 секунд каждая из 4-х программ может
решить задачи примерно одинакового
размера (см. таблицу).
Предположим далее, что получен новый компьютер, работающий в 10 раз быстрее. Теперь за ту же цену можно использовать 104 секунд машинного времени. Максимальный размер задачи, которую может решить каждая из программ, приведен в таблице. Видно, что увеличение скорости компьютера на 1000% приводит к увеличению только на 30% размера задачи, решаемой с помощью программы с временем выполнения O(2n). Вообще говоря, вне зависимости от быстродействия компьютера, такая программа может решать только очень небольшие задачи.
Также ясно видно преимущество программ с временем выполнения O(n): 10-кратное увеличение размера решаемой задачи при 10-кратном увеличении производительности компьютера.
Таким образом, т.к. машинное время все время дешевеет, а компьютеры становится все более быстродействующими, мы надеемся, что сможем решать все большие по объему и более сложные задачи. Но это будет действительно так только при выборе эффективных алгоритмов с низкой степенью роста функции времени выполнения.
Время выполнения T(n) |
Максимальный размер задачи для 103 секунд |
Максимальный размер задачи для 104 секунд |
Увеличение максимального размера задачи |
100n |
10 |
100 |
10 |
5n2 |
14 |
45 |
3.2 |
n3/2 |
12 |
27 |
2.3 |
2n |
10 |
13 |
1.3 |
Немного о недостатках
Еще раз заметим, что степень роста времени выполнения – не единственный критерий оценки алгоритмов и программ. Приведем некоторые соображения на этот счет:
1. Если создаваемая программа будет использована только несколько раз, тогда стоимость написания и отладки программы будет доминировать в общей стоимости программы, т.е. фактическое время алгоритма не окажет существенного влияния на общую стоимость.
2. Если программа будет работать только с «малыми» входными данными, то степень роста времени выполнения будет иметь меньшее значение, чем константа, присутствующая в формуле времени выполнения.
3. Эффективные, но сложные алгоритмы могут быть нежелательны, если готовые программы будут поддерживать лица, не имеющие достаточной квалификации для того, чтобы в них разобраться.
4. Известно несколько примеров, когда эффективные алгоритмы требуют таких больших объемов машинной памяти, что этот фактор сводит на нет их преимущество.
5. В численных алгоритмах точность и устойчивость не менее важны, чем их временная эффективность.