КАТЕГОРИИ: Архитектура-(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) |
Длина числа как возможный размер входа
V Л Рис. 3. Ориентированный граф. Построение какого-то одного выходящего из данной вершины v вояжа может быть выполнено произвольным блужданием по непрой-денным ребрам графа, завершающимся в вершине, из которой не выходит непройденных ребер. Систематизация блужданий может со- 28 Глава 1. Сложности алгоритмов как функции числовых аргументов стоять в том, что, попав в некоторую вершину, мы выбираем для продолжения пути ребро, ведущее в вершину с наименьшим доступным номером. Определяемый этим алгоритмом вояж может захватить и все ребра— например, когда граф имеет вид кольца (на рис. 4 изображен такой граф, для которого | E | = | V | = 5). Входом алгоритма является граф G и вершина v. Если мы рассматри- сти любого алгоритма построения вояжа обязательно имеет место нижняя оценка П(| E |)—ввиду, например, того, что для любого фиксированного | E | существует граф, имеющий вид кольца. Возникает вопрос, можно ли обосновать верхнюю оценку O (| E |)? Если да, то в итоге это дало бы оценку в(| E\).
Для представления графов, не имеющих кратных ребер, часто используются матрицы смежности. Матрица смежности— квадратная матрица порядка | V |, состоящая из нулей и единиц (фактически, булева матрица), в которой элемент с индексами i,j равен единице, если и только если из i -й вершины выходит ребро в j -ю вершину. Такой способ представления действительно удобен во многих задачах. Но когда речь идет о блужданиях по графу, при которых однажды пройденное ребро изымается из дальнейшего рассмотрения, более удобным оказывается представление графа в виде массива a1,a2,...,a\V\ списков смежных вершин. В списке ai, i = 1, 2,..., | V |, в порядке возрастания содержатся номера вершин, в которые входят ребра, выходящие из вершины с номером i. Для графа, приведенного на рис. 3, имеем
a 1 = (2,4), a 2 = (2,3), a 3 = (1,4), a 4 = (), a 5 = (6), a 6 = (5), a 7 = (); для графа в виде кольца — a 1 = (2), a 2 = (3),..., aV_1 = (V\), aV = (1) (в этом графе | V | = | E |). Представление в виде массива списков смежных вершин возможно и для графов, имеющих кратные ребра; в этом случае номера вершин в каждом списке располагаются в порядке неубывания. § 3. Асимптотические оценки (два примера) Начав вояж из вершины с номером v, мы смотрим, не пуст ли список av: если он пуст, то вояж закончен. Если же список av не пуст, переносим первый его элемент (пусть это будет, например, i) в список вершин, через которые шаг за шагом проходит вояж; затем рассматриваем список ai, если он пуст, то вояж закончен, иначе повторяем все то же самое, что проделывали в предыдущей вершине, и т.д.: l:= cons (v, nil); i:= v; while not null (ai) do i:= car (ai); l:= cons (i, l); ai:= cdr (ai) od Мы здесь использовали операции над списками, применяемые в языке Лисп: car — первый элемент списка, cdr — список после удаления первого его элемента, cons —вставка элемента в начало списка, null —предикат проверки пустоты списка, nil —обозначение пустого списка. Затраты, связанные с удлинением пути на один шаг и с проверкой, не завершен ли вояж, ограничены сверху константой (эти затраты суть четыре операции над списками), длина всего пути не превосходит | E |, и затраты во всех случаях не превосходят произведения некоторой константы на | E |. Список l содержит в обратном порядке все вершины, через которые последовательно проходит вояж. Если желателен прямой порядок, то надо перевернуть l: l ′:= nil; while not null (l) do l ′:= cons (car (l), l ′); l:= cdr (l) od Построение списка l ′ потребует некоторых дополнительных операций над списками, число этих операций не превзойдет произведения некоторой константы c на длину списка l, но эта длина не превосходит | E |, следовательно, число операций на этом этапе не превзойдет
с\Е\. Естественно считать пространственные затраты на хранение списка с числовыми элементами пропорциональными длине списка. В случае, например, графа в виде кольца каждый из списков l и l ′ имеет длину | E |+1. Обозначим буквами VL описанный алгоритм построения вояжа, предполагая, что исходный ориентированный граф задается массивом списков смежных вершин. Из сказанного следует, что для временных затрат алгоритма VL мы имеем C^(G,v)^c\E\, (3.2) 30 Глава 1. Сложности алгоритмов как функции числовых аргументов где c —некоторая константа. Это неравенство выполнено для любого имеющего | E | ребер графа. Поэтому если значение | E | принято за размер входа (напомним, что сам вход—это граф и выделенная в нем вершина), то из (3.2) будет следовать T ^(.\ E \) ^c\E\, откуда T VL(| E |) = O (| E |). (3.3) Вместе с указанной ранее оценкой П (\ E \) оценка (3.3) дает T VL(| E |)=e(| E |). Нетрудно вывести аналогичную оценку и для пространственной сложности. Если массивы списков смежных вершин используются в качестве представления ориентированных графов, то построение начинающегося с заданной вершины v вояжа в графе G = (V, E) возможно с помощью алгоритма, который при выборе числа \ E \ ребер в качестве размера входа имеет сложность 6(| E |) по числу операций над списками. Эта же оценка имеет место для пространственной сложности, если считать, что пространственные затраты на хранение списка с числовыми элементами пропорциональны длине этого списка. Если бы граф представлялся матрицей смежности, то мы для используемого алгоритма не смогли бы получить оценку сложности 6(| E |), так как при блуждании по графу вход в каждую вершину сопровождается проверкой, есть ли непройденное до сих пор ребро, выходящее из этой вершины. Например, для графа в виде кольца при \ E | = | V | = n мы имеем матрицу смежности порядка n: [О 1 0... (Л 0 0 1... 0 0 0 0... 1 1 0 0... О Начиная вояж из первой вершины, мы потратим 2 + 3 +... + n + 1 = = П(n 2) сравнений элементов матрицы с единицей при поиске первых подходящих вершин. Разумеется, базовые операции над списками и операции сравнения элементов матрицы смежности с единицей различаются по затратности (сравнение с единицей—это очень дешевая операция). Но какими бы ни были положительные c ' и c ", отражающие затраты на операцию сравнения с 1 и, соответственно, на операцию над списком, неравенство c '\ E \ 2 > c "\ E | будет иметь место для всех достаточно
§ 4. Длина числа как возможный размер входа больших |Е|. Константы, скрытые в оценках П(\Е\2) и 0(|Е|), найденных для сложностей алгоритма при использовании двух разных способов представления графа, различаются между собой. Но тем не менее мы можем сравнивать рост первой и второй сложностей на основе этих оценок. Этот пример показателен и в том отношении, что «дешевых» операций может быть слишком много (их число может слишком быстро расти при увеличении размера входа) и их игнорирование может дать неправильное представление о реальной временной сложности алгоритма.
Если рассматривать два параметра | V |, |Е| размера входа, то сложностью алгоритма VL будет функция 7^(1П \Е\) двух переменных. Для того чтобы устанавливать для нее асимптотические оценки, эта функция должна быть определена для всех (или, по крайней мере, всех достаточно больших) натуральных значений | V |, \L\. Это значит, что для всех таких | V |, |Е| должен существовать граф, имеющий | V | вершин и\Е\ ребер. Проблема будет снята, если, например, допустить к рассмотрению и такие ориентированные графы, которые имеют кратные ребра. Оценка 7^(1 V |, \Е\) = 0(|Е|) будет, очевидно, выполняться. Можно обосновать и оценку T^ (\V\,\E\) = П (\Е\): достаточно рассмотреть имеющий |Е| ребер граф в виде цветка (рис. 5), добавив к нему | V | — 1 изолированных вершин (подобных вершине 7 на рис. 3) и взяв в качестве v вершину в центре «цветка». В итоге ^(|Щ£|) = в(|Е|). Часто, хотя и не всегда, для алгоритмов целочисленной арифметики, входом которых является целое неотрицательное число п, размером входа выбирают не само п, а его битовую длину, или, иными словами, количество А(п) цифр в его двоичной записи:
А(п) = 1, Llog2 п\ + 1, если n = 0, если n> 0. Выражение Llog2 п\ + 1 во второй строчке этого определения можно заменить на [log2(n + 1)1 — см. задачу 2. 32 Глава 1. Сложности алгоритмов как функции числовых аргументов Пример 4.1. Вернемся к алгоритму пробных делений (пример 1.2). Наряду с его уже рассмотренной сложностью T TD(n) введем еще одну сложность (также по числу делений) T T*D(m), m = A(n). Легко обнаружить, что эта новая функция ведет себя не так, как функция T TD(n), для которой характерны резкие скачки. Для начальных значений т имеем
(в строке т указывается битовая длина входа; в строке п указывается диапазон, в котором располагаются значения п, битовая длина т которых равна числу в предыдущей строке; в строке п указывается одно из тех чисел этого диапазона, на которых достигается максимум числа делений; в последней строке указано значение сложности TjD(rri)). В поведении 73^(т) не видно резких скачков. Переход от размера ||п|| = п к размеру ||п||* = т = А(п) влечет более основательное преобразование функции Т{п), чем простая замена переменной. Теперь одним и тем же размером m обладают несколько входов п, затраты для которых, вообще говоря, различны, и, в соответствии с определением сложности, мы должны брать максимум этих затрат. Данным размером m обладают все целые п такие, что 2 m -1^ n< 2 m. (4.1) Согласно постулату Бертрана, при m > 1 в таком диапазоне обязательно встретится простое число. Постулат Бертрана. г При любом целом N > 1 имеется простое число, принадлежащее интервалу (JV, 2JV). С помощью постулата Бертрана мы можем доказать, что T*D(m) = = 6(2 m/ 2). В самом деле, обозначим через рт наибольшее простое число битовой длины т. Количество делений, требующееся алгоритму для работы с рт, будет равно LVP^J - 1- В силу (4.1) имеем L2&"-U / 2j - 1 ss LVP^J - 1. Таким образом, T*D(m) > L2(m -1) / 2j - 1 > j= 2m ' 2 - 2 = (J= - ^r)2 m/ 2, V2 1 Сформулирован Ж.Бертраном в 1845 г. и доказан П.Л.Чебышевым в 1852 г. Обсуждение доказательства выходит за рамки этого курса, доказательство Чебышева см. в [38] (статья «О простых числах»). Доказательства, использующее лишь элементарные средства, можно найти в [35] (приложение «Доказательство постулата Бертрана (теоремы Чебышева)») и в [11, § 5]. § 4. Длина числа как возможный размер входа и при т ^ 4 имеем В то же время, в силу (4.1) очевидно, что для всех т r;w < 2 m ' 2- i < 2 ffl' 2. Отсюда следует требуемое. Исследуем общий вопрос о возможности перехода от оценок Т*(т) к оценкам ТА{п) и наоборот для какого-либо алгоритма А, считая, что эти две сложности соответствуют одному и тому же способу учета затрат, но разным размерам входа —1| • || и || • ||*, принимающим значения в N+, причем если ||х|| = п для некоторого входа х, то ||х||* = m = A(n) = Llog2 п\ + 1. В таком случае, очевидно, выполнено TUm)= max ТЛп). (4.2) Л 2 '» -1 sC n< 2 '» Ясно, что ТА(п) несет более полную информацию о рассматриваемом алгоритме А, чем Т*(т): значения T*(m), т = 1, 2,..., образуют подпоследовательность последовательности ТА{п), п = 1, 2,... Поэтому естественно, что переход от оценок для ТА{т) к оценкам для ТА{п) приводит к более грубому результату, чем тот, который может быть получен при изначальном рассмотрении размера ||х|| = п. Особенно это касается нижних оценок (пример 4.1 прямо указывает на это). Лемма 4.1. Пусть f (х) —неубывающая функция вещественной переменной. Тогда если T^W^fW, то ТА{п) sS/(tog2 п + 1). Доказательство. Пусть тип фиксированы, 2т-г ^ п < 2т, и пусть значение п таково, что 2т-г s= h < 2т, (4.3) и при этом ГА(п) = ГА*(т). (4.4) Используем неубывание /(х): ТА{п) s= ТА{п) = Т*(т) s=/(т) =/(Llog2 п\ + 1) s= /(log2 п + 1). П Лемма 4.2. Пусть g{x) —неубывающая функция вещественной переменной. Тогда (i) если TA{n)^g{n), то T*A{m)^g{2m), (ii) если TA{n)^g{n), то Т*А{т) ^g{2m-x). 34 Глава 1. Сложности алгоритмов как функции числовых аргументов Доказательство. Пусть т фиксировано, 2™-1 s= п < 2т, и пусть значение h таково, что выполнены (4.3) и (4.4). Используем неубывание (i) T*A{m) = TA{h)^g{h)^g{2m), (ii) T*A{m) = TAm 2g(fO 2g{2m-x). U Утверждения следующих двух теорем непосредственно следуют из доказанных лемм. (При рассмотрении асимптотической оценки, содержащей некоторую переменную, подразумевается, что значение этой переменной стремится к бесконечности.) Теорема 4.1. Пусть f (х) — неубывающая функция вещественной переменной. Тогда если rj(m) = 0(/(m)), то ТА{п) = 0(/(log2 п + 1)); как следствие, при /(х+1) = 0(/(х)) имеем ТА{п) = 0(/(log2 п)). Теорема 4.2. Пусть g{x) — неубывающая функция вещественной переменной. Тогда (i) если TA{n) = 0{g{n)), то T*(m) = 0(g(2m)), (ii) если r A (n) = fi(g (n)), то Т*(т) = ВД2'"-1)); как следствие, при g (|) =fi(g W) имеем Т*(т) = ОД2т)). Существуют функции, для которых условие /(х + 1) = 0(/(х)) или g (§) =n(?W) не выполнено —например, /(х) = 2*2, g (x) = 2\ Для рассмотренных в примере 4.1 сложностей T TD(n), T T*D(m) ситуация выглядит следующим образом. Функция /(х) = 2х/2 является возрастающей, и по теореме 4.1 из T*D(m) = 0{2т12) следует Гтп(п) = 0(2(1°82"+1) / 2) = 0(Л/7Т). Рассматривая возрастающую функцию g{x) = 4~х, мы можем, применив теорему 4.2(i), вывести из T TD(n) = O (vTT) оценку T T*D(m) = 0(V2^) = 0(2 m/ 2). Получить из оценки T T*D(m) = П(2т / 2) оценку T TD(n) = П(л/н) мы не можем, так как последняя оценка не верна; это не противоречит доказанным утверждениям. Пример 4.2. Идея бинарного алгоритма возведения а в целую неотрицательную степень п, называемого также алгоритмом повторного возведения в квадрат (мы будем обозначать его буквами RS, от английского названия алгоритма repeated squaring — повторное возведение в квадрат), состоит в том, что если двоичная запись п есть 13к...13г130, то вычисление ап может быть сведено к вычислению последовательности значений ^=а(2', i = 0,l,...,k (каждый следующий элемент последовательности получаем возведением в квадрат преды- § 4. Длина числа как возможный размер входа дущего), и подсчету произведения и тех q, для которых /3; = 1: q:=a; и:=1; for i = 0 to fc-1 do if /3 i = l then u:=u-q fi; q:= q 2 od u:=u- q Например, a 11 = a 8 • a 2 • a (5 умножений), так как (11)10 = (1011)2. Займемся сложностью по числу умножений этого алгоритма. Используя А(п) для обозначения битовой длины п и обозначение А*(п) для числа единиц в двоичной записи п, мы легко получаем следующее. Если рассматривать п как размер входа бинарного алгоритма вычисления ап, n eN+, то сложность T RS(n) по числу умножений для этого алгоритма равна А(п) + А*(п) - 2. Если в качестве размера входа рассматривать т = Х{п), то сложность Т^{т) по числу умножений равна 2т - 2. Для 7^s(m) и T RS(n) имеем очевидные асимптотические оценки rR*s(m) = e(m), rRS(n) = e(log n). Заметим, что мы не можем вывести из 7^ (т) = 2т - 2 равенство T RS(n) = A(n) + A*(n) - 2, хотя обратный вывод очевиден. В рассмотренном алгоритме предполагается, что показатель степени п задан как массив двоичных цифр. Если показатель п задан как число, то его двоичные цифры 130,13г,... могут быть получены одна за другой нахождением соответствующих частных и остатков от деления на 2. Это не изменит оценок 6(log n), 6(m) как для общего числа операций, так и для числа мультипликативных операций. Но при этом бинарный алгоритм возведения в степень может быть использован, например, для вычисления Ап, где А —матрица большого порядка и т. д. В этом смысле те операции, которые подразумеваются в командах u:=u-q и q:=q2, естественно подсчитывать отдельно и именно их считать составляющими главные затраты алгоритма. Задачу вычисления ап в некотором множестве с ассоциативным умножением (т. е. в полугруппе) часто формулируют как задачу об аддитивных цепочках для п, т. е. о наборах целых чисел пг < п2 <... < пк, в которых • пг = 1, пк = п; • для каждого i, 1 < i ^ к, найдутся s, t такие, что l^ t ^ s<i и щ + + ns = щ. 36 Глава 1. Сложности алгоритмов как функции числовых аргументов Каждая аддитивная цепочка для n задает способ вычисления an. Например, аддитивная цепочка 1,2,3,4,8,11 для 11 задает тот способ, который соответствует бинарному алгоритму возведения в степень. Задача быстрого возведения в степень n с помощью умножений—это фактически задача построения короткой аддитивной цепочки для n. Обозначение l (n) закреплено за длиной самой короткой аддитивной цепочки для n. Бинарный алгоритм возведения в степень использует свою специфическую аддитивную цепочку (назовем ее бинарной). Бинарная цепочка не для всех n имеет длину l (n) (см. задачу 19). Но, как мы выясним несколько позже, длина бинарной цепочки и l (n) имеют одинаковый порядок. Помимо этого бинарные цепочки легко и быстро строятся, чего в общем случае нельзя сказать об аддитивных цепочках длины l (n). Некоторые предположения относительно функции l (n) до настоящего времени не доказаны, хотя и подтверждены проверкой для многих n. К числу таковых относится, например, гипотеза Шольца—Брау-эра: l (2 n -1)^ n -1 + l (n) для всех n > 0. г
Дата добавления: 2014-01-11; Просмотров: 685; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |