КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Функции, убывающие по ходу выполнения алгоритма
Часто выполнение алгоритма является последовательностью однотипных шагов (итераций). Если все шаги равнозатратны по времени, то общее их число с точностью до постоянного множителя эквивалентно временным затратам рассматриваемого алгоритма для данного входа, и важной задачей является определение или хотя бы оценивание числа этих шагов. Пример 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 Е(a 0, a 1)^А(a 0)+А(a 1)-2. (9.4) Но если a 0 очень велико в сравнении с aг, то А(a 0) + А(a х) - 2 > aг. Тем не менее, теперь для CЕ{a0,aг) уже легко выводится хорошая оценка. Пусть число делений с остатком больше 1. Имеем CЕ(a0, aг) = CЕ{aъ a2) + 1 s= Х{aг) + А(a 2) - 1 s= 2А(a х) - 1. Оценка C Е(a 0, a 1)^2А(a 1)-1, (9.5) очевидно, верна и в случае единственного деления: CЕ(a0, aг) = 1 при том, что \{aг) ^ 1. Если взять aг за размер входа {a0,aг), то для сложности по числу делений будем иметь TЕ{aг) = шах CЕ(a0, a) s= 2А(a х) - 1 = 2Llog? a j + 2 - 1 «S 2 logo aг + 1. Доказанное нами можно переформулировать так: Если рассматривать aг как размер входа a0, aг алгоритма Евклида, то для сложности T Е(a х) по числу делений выполнено неравенство T E(a 1)^21og2 a 1 + l. (9.6) Эта же оценка имеет место и при рассмотрении двух параметров a0, aг размера входа. Для достаточно больших aг верхняя оценка (9.6) существенно лучше, чем TЕ{aг) s= aг. (Несколько более точная, чем (9.6), оценка дается в задаче 52.) Рассматривая далее оценки сложности по числу делений алгоритма Евклида, мы будем использовать значение aг в качестве размера входа (значение a0 может быть очень большим в сравнении с aъ но первое же деление с остатком приведет к aг,a2, где a2 <aг). Известно, что алгоритм Евклида допускает разнообразные обобщения и расширения. Прежде всего, вместе с нод(a 0, aг) можно находить целые s, t такие, что sa 0 + ta 1 = HOfl(a 0j a 1). (9.7) § 9. Функции, убывающие по ходу выполнения алгоритма 77 Чтобы это показать, обратимся к (9.1). Пусть уже известны a0,aъ......, ai, 1 ^ i ^ n - 1, и пусть для них найдены множители s 0, t0; s ls t x;......; 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 -- qisia o + C ti -- qitia ^ a ^. Можем положить si+1=si-1-qisi, ti+1 = ti-1-qiti, i = l,...,n-l; (9.8) при этом s 0 = l, t 0 = 0; s 1 = 0, t 1 = 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 +i a o + tn +i a i = 0. (9.10) Например, для a0 = 39, a г = 15 имеем s 5 = -5, t 5 = 13. Легко доказать, что | s i|^| s 2|^| s 3|, | t i|^| t 2| < | t 3L (9.11) 78 Глава 3. Оценивание числа шагов (итераций) алгоритма и при п>2 | s 3| < | s 4| <... < | sn +1|, | t 3| < | t 4| <... < | tn +1|. (9.12) Несколько труднее, но также возможно доказать, что \st | и \tt | взаимно просты при i = 1, 2,..., п + 1 (см. задачу 57). Из (9.10) и взаимной простоты sn +1 и tn +1 следует l sn +1l= нод(а0,а1), lf"+1l= нод(а0,а1). Вместе с (9.11), (9.12) это дает нам I s JsSd1, \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, то в ходе бинарного поиска будут рассматриваться сегменты длины
n,2 i2^,...,1 § 9. Функции, убывающие по ходу выполнения алгоритма 79 соответственно (битовая длина каждого следующего элемента последовательности на единицу меньше битовой длины предыдущего), и в целом потребуется в точности A(n) = Llog2 n \ + 1 сравнений. Используя утверждение, содержащееся в задаче 2, мы можем сформулировать установленное свойство бинарного поиска так: Сложность TBS (n) бинарного поиска места элемента в массиве длины n по числу сравнений равна Llog2 n \ + 1, или, что то же самое, [log2(n + l) l. Выражение |"log2(n + l) l для указанной сложности иногда бывает удобнее, чем Llog2 n \ + 1, потому что оно имеет смысл и в вырожденном случае n = 0. Бинарный поиск находит широчайшее применение при поиске информации в разнообразных таблицах. Укажем здесь еще одно его применение, касающееся вычислительной геометрии: он позволяет быстро определять, принадлежит ли произвольная точка Q выпуклому n -угольнику, заданному вершинами PЪP2,...Pn. Можно легко построить какую-нибудь внутреннюю точку O данного n -угольника. В силу его выпуклости точка Q — внутренняя, если и только если Q и O лежат в одной полуплоскости относительно любой из прямых PгP2,...,Pn_1Pn,PnP1. Это соображение приводит к имеющему временную сложность 6(n) алгоритму. Но допустим, что проведены n добавочных лучей (рис. 12), исходящих из точки O и проходящих через
Рис. 12. Точка Q лежит между двумя лучами, проведенными из внутренней точки O многоугольника через его вершины. вершины (считаем, что O = Q, иначе мы сразу бы заключили, что Q принадлежит многоугольнику). Можно установить, какому из углов ∠ P 1 OP 2,..., ∠ Pn 1 OPn, ∠ PnOP 1 принадлежит точка Q: если углы прону- 80 Глава 3. Оценивание числа шагов (итераций) алгоритма мерованы в указанном порядке, то бинарным поиском определяется номер m угла, 1 ^ m ^ n; при этом если Q лежит на одном из проведенных лучей, то из двух значений m берется любое. Узнав m, мы проверяем согласованность расположения точек O и Q по отношению к прямой, являющейся продолжением той стороны многоугольника, концы которой лежат на сторонах m -го угла. Теперь заметим, что в самом проведении лучей OPъOP2,...,OPn нет необходимости: сравнение Z.PxOQ с LPxOPi требует ограниченного числа операций и в том случае, когда нам лишь известны координаты точек O,Q,P1,Pi. Основывающийся на бинарном поиске алгоритм распознавания принадлежности точки выпуклому n-угольнику имеет сложность O (log n) по общему числу операций и пространственную сложность O (1). Полезным для решения ряда задач является то обстоятельство, что если точка не принадлежит данному выпуклому n -угольнику, то с помощью этого алгоритма мы дополнительно определяем одну из сторон n -угольника, которая из этой точки видна целиком (рис. 13). Q Рис. 13. Для точки Q, не принадлежащей данному выпуклому n -угольнику, находим сторону n -угольника, которая из Q видна целиком. Пример 9.3. Установим число этапов слияния при сортировке, предложенной Дж. фон Нейманом (которая является одним из вариантов сортировки слияниями). При сортировке фон Неймана шаг за шагом происходят переброски элементов исходного массива в дополнительный массив и наоборот, и каждая переброска сопровождается слиянием соседних сегментов массива (рис. 14). В данном случае в качестве вспомогательного размера массива удобно рассмотреть k — число сегментов (первоначально k = n, затем, шаг за шагом, k довольно быстро убывает). При анализе бинарного поиска места элемента мы фактически использовали, что если 2 m ~1 ^ k < 2m, § 9. Функции, убывающие по ходу выполнения алгоритма 81 а) б) в)
Дата добавления: 2014-01-11; Просмотров: 361; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |