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

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

Чтобы это показать, обратимся к (9.1). Пусть уже известны a0,aъ ... ..., ai , 1 ^ i ^ n - 1, и пусть для них найдены множители s0, t0; sls tx; ... ...;si, ti такие, что

s0a0 + t0aг=a0, s1a0 + t1a1=a1, ..., si-1a0 + ti-1a1=ai-1, sia0 + tia1=ai.

После выполнения очередного деления с остатком ai-г = qiai + ai+1 имеем ai+1 = ai-x - qiai и

(si --qisiao + Cti --qitia^a^.

Можем положить

si+1=si-1-qisi, ti+1 = ti-1-qiti, i = l,...,n-l; (9.8)

при этом

s0 = l, t0 = 0; s1 = 0, t1 = l. (9.9)

Решение поставленной задачи дают числа

s = sn, t = tn.

В процессе применения этого алгоритма к числам a0 = 39, aг = 15 возникают остатки 9, 6, 3, 0 и соответствующие ненулевым остаткам пары множителей суть 1, -2; -1, 3; 2, -5. Имеем 2 · 39 + (-5) ·15 = 3 = = нод(39,15).

Этот алгоритм мы назовем расширенным алгоритмом Евклида и будем его обозначать буквами ЕЕ, от его английского названия extended Euclidean—расширенный евклидов. Каждый шаг расширен­ного алгоритма Евклида содержит три мультипликативных опера­ции— одно деление с остатком и два умножения.

Если рассматривать aг как размер входа a0, aг расширенного алго­ритма Евклида, то для мультипликативной сложности TЕЕ{aг) этого алгоритма имеем Tш{aг) s= 6 log2 aг + 3.

Расширенный алгоритм Евклида дает возможность решать в це­лых числах линейные уравнения с целыми коэффициентами (см. за­дачу 56), он также играет существенную роль в модулярной арифме­тике (см. § 22).

Если дополнить расширенный алгоритм Евклида еще одним ша­гом, то получатся sn+1, tn+1 такие, что

sn+iao + tn+iai = 0. (9.10)

Например, для a0 = 39, aг = 15 имеем s5 = -5, t5 = 13. Легко доказать, что

| si|^|s2|^|s3|, |ti|^|t2|<|t3L (9.11)

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

и при п>2

|s3|<|s4|<...<|sn+1|, |t3|<|t4|<...<|tn+1|. (9.12)

Несколько труднее, но также возможно доказать, что \st | и \tt | взаим­но просты при i = 1, 2,..., п + 1 (см. задачу 57). Из (9.10) и взаимной простоты sn+1 и tn+1 следует

lsn+1l= нод(а0,а1), lf"+1l= нод(а0,а1).

Вместе с (9.11), (9.12) это дает нам

IsJsSd1, \tn\<a0. (9.13)

Эти неравенства пригодятся нам в дальнейшем.

Пример 9.2. Бинарный поиск места (т. е. значения р, 1 ^ р ^ ^ п + 1,—как объяснено в приложении A) элемента у в упорядочен­ном массиве из п элементов х1 < х2 < ... < хп:

р :=1; q :=п + 1; while p<q do

r:= I ^-^ I ; if xr<y then p:=r + 1 else q:=r fi od

Обозначим этот алгоритм буквами BS от его английского названия binary search—бинарный поиск. Будем считать число элементов сег­мента массива длиной этого сегмента (при рассмотрении задач сор­тировки и поиска мы называем сегментом массива любую упорядо­ченную часть xs < xs+1 < ... < xt_1 < xt данного массива). Легко видеть,

что от сегмента длины к мы переходим к сегменту длины 2 или

2 — 1. Это говорит о том, что с каждым шагом алгоритма функция L(fc) = A(fc), где положительное к является длиной сегмента, рассмат­риваемого на данном шаге, убывает по крайней мере на единицу, пока не приходим к сегменту, содержащему один элемент, после че­го еще одно сравнение полностью решает задачу. Отсюда сложность бинарного поиска не превосходит A(n) = Llog2 п\ + 1. Мы видим так­же, что если у меньше минимального элемента рассматриваемого сегмента длины к > 1, то длина сегмента на следующем шаге будет

равна \-2\. Поэтому если изначально у <х1, то в ходе бинарного по­иска будут рассматриваться сегменты длины

п

l-l 2

2 , 2

n,2 i2^,...,1

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