Next:3.6
Кодирование алгоритма (программирование)
Up:3
Общие рекомендации по выполнению заданий
Previous:3.4
Обоснование алгоритма
Для алгоритма
мы определили функцию временной сложности ВРЕМЯ
(n), дающую верхнюю границу для максимального времени его работы,
т.е. максимального числа основных операций (сложения, сравнения и т.д.),
которые должен выполнить алгоритм
при решении задачи на входных данных размером
.
Аналогично можно определить функцию емкостной сложности ПАМЯТЬ
(n), дающую границу для максимального числа одновременно существующих
скалярных значений при выполнении
на входных данных размером
.
Т а б л и ц а 1
Т а б л и ц а 2
Хорошим критерием качества алгоритма является скорость роста его сложности
в зависимости от увеличения размера входа. Рассмотрим пример, показывающий
влияние порядка роста сложности алгоритма на увеличение максимально допустимого
размера входных данных, которого можно достичь увеличением скорости ЭВМ,
а также эффект применения более эффективного алгоритма (см. табл. 1 и 2).
Из табл. 1 видно, что
может обработать за 1 с входные данные размером 1000, в то время как
-- входные данные не длиннее 9. Табл. 2 показывает, что для алгоритма
десятикратное увеличение скорости ЭВМ позволяет увеличить размер входных
данных, к которым его можно применять, только на три, тогда как для алгоритма
размер входных данных можно по крайней мере утроить.
Следует, однако, иметь в виду, что порядок роста сложности алгоритма
является определяющим только при обработке данных большого размера. Для
задач с малым размером входных данных (а именно на таких данных и проверяется
правильность студенческих алгоритмов) следует учитывать мультипликативные
константы при сравнении алгоритмов. Например, предположим, что временные
сложности алгоритмов
и
равны соответственно
,
,
.
Тогда
будет наилучшим для данных размером
-- для данных размером
-- при
,
а
-- только при
.
В качестве примера приведем анализ временной сложности двух алгоритмов генерации перестановок из п. 4.11.
Общую эффективность алгоритма генерации перестановок в лексикографическом
порядке определяют две операции -- число транспозиций и число сравнений
пар элементов в перестановке. Обозначим через
и
соответственно число транспозиций и число сравнений, выполняемых алгоритмом
для порождения первых
из
перестановок. Поскольку для порождения каждой из
подпоследовательностей перестановок с одним и тем же значением
требуется
транспозиций, а для каждого из
переходов от одной подпоследовательности к другой требуется
транспозиций, получаем следующее рекуррентное соотношение:
для решения этого рекуррентного соотношения сделаем замену переменных.
Взяв ,
получим новое рекуррентное соотношение:
Решение этого соотношения легко получить:
Поэтому
Аналогично можно показать, что
и получить
.
Что же касается алгоритма порождения перестановок в порядке минимального
изменения, то он выполняет
транспозиций и
сравнений (более точно, алгоритм делает 1!+2!+3!+...+ n! сравнений). Таким
образом, алгоритм порождения перестановок в порядке минимального изменения
является более эффективным.
В общем случае следует иметь в виду, что повышение скорости работы алгоритма может потребовать увеличения необходимой ему памяти. Например, рекурсивный алгоритм порождения перестановок в порядке минимального изменения совсем не производит сравнений, но имеет емкостную сложность , в то время как емкостная сложность нерекурсивного алгоритма равна . Этот же пример показывает справедливость обратного утверждения: за счет увеличения временной сложности алгоритма можно понизить его емкостную сложность.
Как правило, более эффективный алгоритм приводит к программе большего размера и требует больших усилий как на его разработку, так и на его обоснование.
Next:3.6
Кодирование алгоритма (программирование)
Up:3
Общие рекомендации по выполнению заданий
Previous:3.4
Обоснование алгоритма