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
Обоснование алгоритма