Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
abramov_s_a_lekcii_o_slozhnosti_algoritmov.doc
Скачиваний:
136
Добавлен:
11.05.2015
Размер:
2.74 Mб
Скачать

Глава 3

Оценивание числа шагов (итераций) алгоритма

§ 9. Функции, убывающие по ходу выполнения алгоритма

Часто выполнение алгоритма является последовательностью однотип­ных шагов (итераций). Если все шаги равнозатратны по времени, то общее их число с точностью до постоянного множителя эквивалентно временным затратам рассматриваемого алгоритма для данного вхо­да, и важной задачей является определение или хотя бы оценивание числа этих шагов.

Пример 9.1. Пусть а0, а1 —натуральные числа, а0^а1. Поиск наи­большего общего делителя (нод) чисел а0, а1 по алгоритму Евклида требует выполнения серии однотипных шагов, каждый из которых— деление с остатком:

a0 = q1a1 +а2, а1 = q2a2 3,

(9.1) ап-3 = Чп-2ап-2 + ап-1

a„-2 = q n-1 a„-1 + a n ,

ап-1 = Чпап.

В этом случае ап = нод(а0, а1), так как

нод(а0, а1) = нод(а1, а2) =... = нод(ап, 0) = ап.

Последовательность получаемых остатков убывает (остаток меньше делителя), при этом все остатки — неотрицательные целые. Не су­ществует убывающей бесконечной последовательности, элементами которой являются неотрицательные целые числа, поэтому выполне­ние алгоритма Евклида (будем обозначать его буквой E) завершается для любых натуральных а0, а1, и число делений с остатком не пре-

§ 9. Функции, убывающие по ходу выполнения алгоритма 75

восходит аг. Обозначив через СЕ{а0,аг) исследуемое число делений с остатком, получаем

СЕ(.а0,а1)^а1 (9.2)

(для упрощения записи мы пишем СЕ(,а0,аг) вместо С^{а0, аг)). Это говорит о том, что если аг рассматривается как размер входа или ес­ли а0, аг рассматриваются как два параметра размера входа, то слож­ность алгоритма Евклида по числу делений не превосходит аг. Как мы увидим, эта оценка является весьма грубой, но, привлекая сход­ные рассуждения, можно получать и более тонкие оценки.

Формализуем те соображения, которые привели нас к этой первой оценке. Каждый шаг алгоритма имеет дело с парой неотрицатель­ных целых {а{_ъ at) и при условии at ф 0 перерабатывает эту пару в {ahai+1), где ai+1 равно остатку от деления а(_г на at. На множе­стве пар неотрицательных целых чисел к, I мы определяем функцию L(fc,Z), принимающую неотрицательные целые значения. Эта функ­ция такова, что когда при выполнении алгоритма Евклида мы пере­ходим от пары {а{_ъ at) к паре (аь ai+1), значения функции убыва­ют: L{ai_1,ai)>L{ai,ai+1). Так как функция целочисленна, то ее зна­чение убывает с каждым шагом по крайней мере на единицу. От­сюда следует, что общее число шагов не превзойдет значения функ­ции L на исходной паре чисел. Мы рассмотрели функцию L{k,l) = l, и это привело нас к выводу, что число шагов не превзойдет значения Ца0,а1)=а1.

Для обоснования того, что число делений в алгоритме Евклида растет медленнее, чем аъ было бы достаточно найти соответствую­щую функцию I(fc,Z), значения которой при больших к,1 оказывают­ся существенно меньшими, чем Z. Эта функция по-прежнему должна быть определена для любых неотрицательных целых k,l, М Z, прини­мать неотрицательные целые значения и убывать при замене пары М парой I, г, где г — остаток от деления к на Z. Хотя бы одна па­ра целых неотрицательных k,l, к^1, должна обращать L(M) в нуль, иначе вместо L{k,l) можно взять функцию L'(M) = ДМ) - 1 и т.д.

Предложение 9.1. Пусть к,1&П+, к>1, и пусть г —остаток от деления к на I. Тогда

(i) A(fc) > А(г), где, как обычно, А(-) битовая длина данного числа;

(ii) функция

L(M) = A(fc) + A(Z)-2 (9.3)

такова, что L(k, l) > L(l, r).

76 Глава 3. Оценивание числа шагов (итераций) алгоритма

Доказательство. (i) Имеем k = ql + r, q^l, откуда k ^ l + r > 2r. Следовательно, A(k)>A(r).

(ii) Из A(k) > А(r) следует A(k) + A(l) - 2 > A(l) + А(r) - 2. П

Очевидно, что функция (9.3) неотрицательна. Таким образом, справедлива оценка

CЕ(a0,a1)^А(a0)+А(a1)-2. (9.4)

Но если a0 очень велико в сравнении с aг, то А(a0) + А(aх) - 2 > aг. Тем не менее, теперь для CЕ{a0,aг) уже легко выводится хорошая оценка. Пусть число делений с остатком больше 1. Имеем

CЕ(a0, aг) = CЕ{aъ a2) + 1 s= Х{aг) + А(a2) - 1 s= 2А(aх) - 1.

Оценка

CЕ(a0,a1)^2А(a1)-1, (9.5)

очевидно, верна и в случае единственного деления: CЕ(a0, aг) = 1 при том, что \{aг) ^ 1.

Если взять aг за размер входа {a0,aг), то для сложности по числу делений будем иметь

TЕ{aг) = шах CЕ(a0, a) s= 2А(aх) - 1 = 2Llog? aj + 2 - 1 «S 2 logo aг + 1.

Доказанное нами можно переформулировать так:

Если рассматривать aг как размер входа a0, aг алгоритма Евкли­да, то для сложности TЕ(aх) по числу делений выполнено неравенство

TE(a1)^21og2a1 + l. (9.6)

Эта же оценка имеет место и при рассмотрении двух параметров a0, aг размера входа.

Для достаточно больших aг верхняя оценка (9.6) существенно луч­ше, чем TЕ{aг) s= aг. (Несколько более точная, чем (9.6), оценка дается в задаче 52.)

Рассматривая далее оценки сложности по числу делений алгорит­ма Евклида, мы будем использовать значение aг в качестве размера входа (значение a0 может быть очень большим в сравнении с aъ но первое же деление с остатком приведет к aг,a2, где a2 <aг).

Известно, что алгоритм Евклида допускает разнообразные обоб­щения и расширения. Прежде всего, вместе с нод(a0, aг) можно на­ходить целые s, t такие, что

sa0 + ta1 = HOfl(a0ja1). (9.7)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]