КАТЕГОРИИ: Архитектура-(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) |
Затраты алгоритма для данного входа, алгебраическая сложностьСложность в худшем случае Как функции числовых аргументов. Сложности алгоритмов Наиболее часто используемые обозначения Сд(х), Сд(х)—временные и пространственные затраты алгоритма А для входа (входных данных) х; \\х\\— размер входах; TA{s), SA (s)—значения временной и пространственной сложности алгоритма А для значения s размера входа; А(п)—количество цифр в двоичной записи неотрицательного целого п (битовая длина п); Я* (п) — количество единиц в двоичной записи неотрицательного целого п; [а] —наибольшее целое, меньшее или равное вещественному а; \а] —наименьшее целое, большее или равное вещественному а; N, N+—множества неотрицательных и положительных целых чисел; Z—множество (кольцо) целых чисел; Zk — кольцо вычетов по модулю к; Q, Ж, С — множества (поля) рациональных, вещественных и комплексных чисел; Пп —множество всех перестановок чисел 1, 2,..., п; □—конец доказательства. Глава 1 Пусть по входным данным (входу) х алгоритм А вычисляет результат (выход) у. Такое вычисление связано с затратами времени и памяти. Допустим, что достигнуто соглашение о том, как измеряются эти затраты, тогда можно рассмотреть функции затрат С\{х), CsA{x), где верхний индекс Т указывает на временные затраты г, S — на пространственные затраты (затраты памяти и пространственные затраты— это синонимы), соответствующие вычислениям, связанным с применением А к входу х; буквы Т и S возникают из английских слов time — время и space — пространство. Вид этих функций может быть очень непростым; их трудно исследовать методами математического анализа, потому что аргумент х не является, вообще говоря, числом и не принадлежит какому-либо метрическому пространству. Можно ввести некоторую неотрицательную числовую характеристику ||х|| возможных входов алгоритма и оценивать функции затрат с помощью функций, зависящих не от х, а от ||х||: CTA{x)^Lp{\\x\\), CsA{x)^^{\\x\\). (1.1) Если ц> и -ф не слишком быстро растут при возрастании (числового) аргумента, то эти оценки могут обнадеживать автора или потребителя алгоритма А. 1 Здесь и далее имеется в виду временные (связанные с расходованием времени), а не временные (непостоянные, краткосрочные) затраты. Аналогично — временная сложность и т.д. 10 Глава 1. Сложности алгоритмов как функции числовых аргументов Избираемую нами величину || • || принято называть размером входа. В соответствии с нашим замыслом размер входа должен характеризовать «громоздкость» исходных данных; то, что || x || является числом, позволяет говорить о росте ip, ip и исследовать этот рост. Выбор размера входа —существенный этап оценивания функций затрат; нужна, во всяком случае, уверенность, что оценки вида (1.1) будут нести полезную информацию. В дальнейшем, однако, предметом нашего изучения будут не функции затрат, а некоторые другие функции, о которых мы скажем после ряда примеров. Предварительно условимся о некоторых обычных для литературы по сложности алгоритмов обозначениях. Пусть a el, т.е. a — вещественное число. Значение |_ a j есть результат округления a до целого в меньшую сторону: 1.3,14J = 3, |_-3,14| = -4 (эту величину — целую часть a — записывают и как [ a ]). Соответственно, \a] есть результат округления a до целого в большую сторону: [3,141=4, [-3,141 = -3. Если a — целое, то [a\ = \a]=a. Рассмотрим три простых примера. Пример 1.1. Исходя из определения произведения матриц, мы получаем алгоритм умножения двух квадратных матриц порядка n, требующий n 3 операций умножения. Этот алгоритм далее будет обозначаться буквами MM, от английских слов matrix multiplication — матричное умножение. Пример 1.2. Один из очевидных алгоритмов распознавания простоты данного n eN+, который мы будем называть алгоритмом пробных делений, состоит в выяснении того, имеется ли среди чисел 2, 3,..., LV n J хотя бы одно, делящее n. Количество проверок делимости n на те или иные целые числа (для краткости можно говорить о «числе делений») колеблется от 1 до La n J - 1. Этот алгоритм далее будет обозначаться буквами TD, от английских слов trial divisions —пробные деления. Пример 1.3. При сортировке простыми вставками число сравнений1 колеблется от n - 1 до —-—, в зависимости от входного массива x 1 ,x2,...,xn. Если интересоваться числом перемещений элемен- 1 Основные алгоритмы сортировки и поиска приводятся в приложении A. Обсуждая конкретные алгоритмы сортировки, мы для краткости иногда будем опускать само слово «алгоритм», говоря, например, не об алгоритме сортировки простыми вставками, а просто о сортировке простыми вставками и т. д. Все сортировки, которые мы рассматриваем, являются сортировками с помощью сравнений, т. е. никаких других операций, кроме сравнений и перемещений (присваиваний или обменов), над элементами массива производиться не может, — исключение составляет пример 29.1. Элементы сор- § 1. Затраты алгоритма для данного входа тов (операций обмена <->), то оно колеблется от 0 до n ( n 2 1 В этих примерах уже фактически сказано, что считается размером входа и затратами. В примере 1.1 размер входа — целое неотрицательное n —это порядок матриц. В примере 1.2 размер входа — само входное число (сам вход) n. В примерах 1.1, 1.2 количество исследуемых операций однозначно определяется по n. Столь жесткая зависимость затрат от размера входа может и не иметь места, как это следует из примера 1.3, где размер входа — это длина n массива. В связи с этим примером остановимся пока на операциях сравнения. Количество сравнений n ( n Определение 1.1. Пусть на возможных входах x алгоритма A определена неотрицательная числовая функция || x || (размер входа). Пусть также определены целочисленные неотрицательные функции CA(x), CA (x) временных и пространственных затрат алгоритма A. Тогда временной и пространственной сложностями A называются функции числового аргумента TAЛn) = шах CTЛx), SJn) = maxCSAx) (1.2) 11 x 11 = n 1 x 1 = n (областью изменения n как аргумента функций TA{n) и SA{n) является множество значений размера || • ||). Более полно каждая такая сложность именуется сложностью в худшем случае. Вместо TA{n),SA{n) мы иногда будем писать просто T{n),S{n), если ясно, о каком алгоритме идет речь. Два примечания к определению 1.1. 1) Значение CAT{x) есть в подавляющем большинстве случаев число каких-то операций, а CSA{x) —число хранимых величин какого-то типа, поэтому предположение о целочисленности значений этих функций вполне естественно. Без этого предположения в (1.2) пришлось тируемых массивов считаются попарно различными. Если не оговорено противное, то речь всегда идет о сортировке по возрастанию. Размером входа каждой из сортировок мы без специального упоминания считаем число n элементов массива. 12 Глава 1. Сложности алгоритмов как функции числовых аргументов бы использовать sup вместо max, что сделало бы многие рассуждения о сложности более тяжеловесными. 2) Видимо, вместо «сложность в худшем случае» правильнее было бы сказать «сложность как затраты в худшем случае», но такова принятая здесь терминология. Мы пока (до § 5) не рассматриваем сложность в среднем, и поэтому, не опасаясь путаницы, будем называть сложность в худшем случае просто сложностью. Вернемся к алгоритмам MM, TD, I из примеров 1.1, 1.2, 1.3. Рассмотрим вначале временные сложности T мм(n), T TD(n), T (n). Получаем Tмм(n) = n3 и T^n) = n ( n -1). Для T TD(n) у нас нет столь простой формулы. Заметим, например, что для значений n от 111 до 120 мы имеем n: 111 112 113 114 115 116 117 118 119 120 TTD(n): 2 19 14 12 16 1 Изменение этой функции при n -> оо можно охарактеризовать так: для любых n значение этой функции не превосходит La n J - 1, и найдутся сколь угодно большие n, для которых ее значение равно L-s/ n J-L В примерах 1.2 и 1.3 не возникает необходимости в хранении больших объемов величин сверх объема входа (сортировка простыми вставками не требует дополнительного массива). Дополнительная память, если и нужна, — это несколько дополнительных переменных (ячеек), используемых алгоритмом. Поэтому можно считать, что S^n)S^n) ограничены константами. В примере 1.1 нам требуется дополнительная матрица, в которой будет формироваться результат; имеем SMM(n) = n2. Во всех этих примерах мы, как легко заметить, принимаем во внимание лишь часть затрат и в соответствии с этим определяем сложность алгоритма. В примере 1.1 учитывались только умножения как более дорогие (доминирующие по затратности) операции. В примере 1.3 мы рассматриваем либо сравнения, либо обмены. И во всех примерах мы игнорировали затраты по выполнению управляющих операторов, хотя, скажем, при выполнении простейшего оператора цикла for i = l to n do... od тратится время на изменение параметра цикла, проверку условия продолжения цикла и т.д. Обычно в таких ситуациях считается, что мы учитываем основную часть затрат для худшего случая. Если пытаться точно подсчитывать § 1. Затраты алгоритма для данного входа все, не упуская ничего, то получение и обоснование оценки сложности заурядного алгоритма может превратиться в очень тяжелую работу. Принимая решение о том, в чем измеряются временные затраты, мы разделяем важное и неважное. Разумеется, при этом необходима осторожность, без которой к разряду неучитываемых «дешевых» операций могут быть отнесены такие, на выполнение которых в реальных вычислениях уйдет существенное время из-за их огромного количества. Отметим еще, что, вообще говоря, время выполнения операции зависит от размеров ее операндов, это относится и к арифметическим операциям, и к операции сравнения (например, длинные числа сравнивать труднее, чем короткие и т.д.). Аналогично дело обстоит с пространственными затратами и соответственно с пространственной сложностью; здесь, прежде чем находить сложность, надо решить, что является «единицей хранения»: скажем, при умножении двух матриц мы можем получить матрицу с элементами, которые записываются более длинно, чем элементы исходных матриц. Однако довольно часто считается, что результат операции всегда умещается в одной ячейке. Иногда приходится отвлекаться от того, что десятичная или двоичная запись иррационального числа не может быть размещена в ячейке какого-либо устройства. Более того, в теории алгебраической сложности как разделе алгебры г рассматривают, например, алгоритмы, применимые к элементам произвольного абстрактного кольца или поля, и вопрос о представлении этих элементов в реальном компьютере или в абстрактной машине не обсуждается вообще. Определение 1.2. Пусть функция СТА(х) в определении 1.1 отражает затраты на выполнение лишь какого-то одного типа операций в предположении, что все эти операции требуют одинакового времени выполнения, не зависящего от вида и размера операндов, и это время равно 1. Тогда соответствующая функция ТА(п) —это сложность по числу операций рассматриваемого типа. Привлечение в качестве Сд(х) функции, отражающей только количество хранимых дополнительных величин того или иного фиксированного типа, приводит к пространственной сложности SA(n) по числу величин рассматриваемого типа. Такую сложность называют алгебраической сложностью по числу операций или числу величин рассматриваемого типа, подчерки- См., например, [25]. 14 Глава 1. Сложности алгоритмов как функции числовых аргументов вая этим предположение о равнозатратности всех рассматриваемых операций и равнообъемности всех учитываемых величин. Алгебраическую сложность арифметических алгоритмов по числу умножений и делений называют мультипликативной сложностью. Из основных арифметических операций умножение и деление являются наиболее дорогими, и при рассмотрении арифметических алгоритмов часто интересуются именно (алгебраической) мультипликативной сложностью. Несколько позднее мы будем говорить о битовой сложности, которая позволяет принимать в расчет различие в размерах операндов и рассматривать при нахождении сложности непохожие операции, сопоставляя их затратность на битовом уровне. Формулы (1.2) вновь заставляют вспомнить о важности понятия размера входа. В силу разных причин не всегда этот размер легко и естественно может быть введен так, что сложность алгоритма возрастает при увеличении размера входа. Но, по крайней мере, функция || • || должна обеспечивать определенность значений TA{n), SA{n) для всех достаточно больших n — иначе было бы невозможно говорить о поведении TA{n), SA{n) при n —> <х>. Заведомо неудачный размер входа — это, скажем, число строк n данной матрицы, если речь идет об алгоритмах вычисления произведения всех элементов и если матрица не обязательно является квадратной: при выбранном таким образом размере входа мы имеем тождественное равенство TA{n) = оо для сложности по числу умножений любого такого алгоритма A, так как при фиксированном числе строк число столбцов и число элементов могут быть сколь угодно большими. Другие возможные осложнения, вызванные неудачным выбором размера входа, будут обсуждаться в § 13. Достаточно очевидно, что если алгоритм A состоит в последовательном (друг за другом) выполнении алгоритмов U и V, то мы, вообще говоря, не можем утверждать, что TA{n) = TU{n) + TV{n), так как, например, размер входа алгоритма U может существенно отличаться, как в большую, так и в меньшую сторону, от размера его выхода. Пусть A и B —некоторые алгоритмы. Как можно заметить, из выполнения для всех n неравенства TA{n) < TB{n) не следует, что CTА{x) < <CB (x) для всех возможных входов x (достаточно вспомнить сортировку слияниями и пузырьковую сортировку; последняя выполняется быстрее первой, коль скоро массив задан уже в упорядоченном виде). Аналогично дело обстоит с пространственными сложностью и затратами. § 1. Затраты алгоритма для данного входа В некоторых случаях алгоритму сопоставляют несколько сложностей. Итоговые временные затраты сортировки массива с помощью сравнений складываются из затрат на сравнение и на перемещение элементов. Без учета типа элементов массива нельзя сказать, какая из операций является более дорогой. Поэтому для алгоритмов сортировки используются две сложности: с одной стороны—по числу сравнений, а с другой —по числу перемещений элементов, т.е. присваиваний (:=) или обменов (<->). Если же рассматривается некоторый арифметический алгоритм, то, исследовав его мультипликативную сложность, можно дополнительно интересоваться, в качестве уточнения, аддитивной сложностью (числом сложений и вычитаний в худшем случае) и т. д. В приложении D мы тщательно исследуем мультипликативную и аддитивную сложности алгоритмов вычисления значения полинома при заданном значении аргумента. Пусть некоторому алгоритму А сопоставлены две, скажем, временные сложности Т'А{п) и Т'А\п). Например, Т'А{п) и Т'А\п) могут быть сложностями по разным операциям. Если операции первого и второго вида предполагаются имеющими одинаковую затратность, то это еще не дает оснований считать, что сложность ТА{п), которую мы определим, рассматривая совместно операции обоих видов, будет равна Т'А(п) + Т'А{п), потому что максимумы этих двух видов затрат могут достигаться на разных входах одного и того же размера. Можно только утверждать, что ТА{п)^ГА{п) + ГА\п). Пример 1.4. Чтобы проиллюстрировать указанное обстоятельство, мы вновь обратимся к сортировке простыми вставками, которая может рассматриваться в двух вариантах \г и 12: для вставки элемента xi+1 в уже упорядоченную часть хг,х2,...,xt элементы этой упорядоченной части просматриваются либо в порядке xh х{-ъ..., либо в порядке хг,х2,... В первом варианте максимум числа сравнений достигается тогда, когда входной массив имеет обратную к требуемой упорядоченность: хг > х2 >... > хп^ и на этом же входе достигается максимум числа обменов; имеем \ (п) = Т^ (п) + Т{[(п) = п{п- 1), где Т{^п),Т{^п) суть сложности по числу сравнений и обменов. Во втором варианте максимум числа сравнений достигается, когда массив уже упорядочен так, как требуется: хг <х2 <... <хп, а максимум числа обменов—когда хг > х2 >... > хп. Если i > 1, то при вставке элемента xi+1 в уже упорядоченную часть хг, х2,..., х{ потребуется тем меньше обменов, чем больше потребуется сравнений. Если элемент 16 Глава 1. Сложности алгоритмов как функции числовых аргументов займет место с номером к, то это потребует i-k + 1 обменов. Число же сравнений равно к, если к s= i, и равно к - 1, если k = i + l. Суммарное число сравнений и обменов равно i + 1, если к s= i, и равно i, если k = i + l. Поэтому максимум общего числа сравнений и обменов достигается, например, на входном массиве, имеющем обратную к требуемой упорядоченность: хг > х2 >... > хп. Легко устанавливает- ?. (п + 2)(п-1) Рассматривая сложности 7] (п), 7] (п) первого и второго вариантов сортировки простыми вставками по общему числу сравнений и обменов, мы имеем 7\(n) = n (n -l), fh = ( и, таким образом, Г] (п) / ^ (п)—»2 при возрастании п. Обладающий большей общей сложностью fh первый вариант алгоритма рассматривается в литературе значительно чаще второго, не в последнюю очередь из-за того, что его запись несколько проще: мы можем со всеми подробностями записать первый вариант с помощью псевдокода for i = 2 to п do k:=i; while k > 0 and xk >xk+1 do xk <-> xk+1; k:=k-l od od (предполагается, что если k ^ 0, то булево выражение, имеющее вид конъюнкции к > 0 and хк > хк+ъ принимает значение 0, т. е. «ложь», даже если при этом, например, значение хк не определено, и, следовательно, не определено значение второго члена конъюнкции). Второй вариант будет иметь вид: for i = 2 to n do fc:=l; while k<i and xk<xt do k:=k + l od; f or j = i - 1 downto к do Xj^xj+1 od od В первом варианте используется на один оператор цикла меньше, но с точки зрения вычислительной сложности это не является пре- § 1. Затраты алгоритма для данного входа имуществом,—важным является число лишь учитываемых операций при выполнении алгоритма. Хотя обычно для каждой сортировки рассматривают сложности по сравнениям и перемещениям раздельно, но, тем не менее, если эти сложности совпадают с соответствующими сложностями другой сортировки, то совместное рассмотрение обоих типов операций может оказаться небезынтересным. Заметим попутно, что среди сортировок с квадратичной сложностью по числу сравнений чрезвычайно низкой сложностью по числу перемещений, а именно сложностью, равной п - 1, обладает сортировка выбором. В некоторых случаях к учитываемым операциям относят операции весьма разнородные, и время выполнения каждой из них считают равным 1 — пример 3.1, как и некоторые другие, даст соответствующую иллюстрацию. При нахождении каждой такой «смешанной» сложности затраты для каждого конкретного входа учитываются разом все вместе. Этот параграф завершим обсуждением тех предположений о выполнении рассматриваемых алгоритмов, которые неявно уже использовались нами. Мы исходили из того, что вычисления проводятся некоторой машиной, память которой состоит из ячеек. При этом как объем каждой ячейки, так и общее число ячеек считается бесконечным, что, разумеется, является чистой абстракцией. Поместив в ячейку результат каких-то вычислений или считав содержимое некоторой ячейки, машина обращается еще к какой-то ячейке и т. д. Относительно этого процесса предполагается, что сам переход от ячейки к ячейке не связан с какими-либо затратами. Этот принцип лежит в основе модели вычислений, называемой РАМ («равнодоступная адресная машина»—довольно неуклюжий, но принятый термин; имеется в виду машина с равнодоступными ячейками памяти) г. Модель РАМ существенно отличается в этом смысле от другой известной модели вычислений—машины Тьюринга (МТ), где время перехода от одной ячейки ленты к другой зависит от расстояния между ячейками; при этом одна ячейка ленты МТ содержит один символ фиксированного конечного алфавита2. 1 В литературе на английском языке —RAM (random-access machine). 2 Раньше в литературе по вычислительной математике и программированию сло 18 Глава 1. Сложности алгоритмов как функции числовых аргументов Употребление слова «модель» в этом контексте подчеркивает то обстоятельство, что реальные вычислительные устройства (компьютеры) работают на тех или иных специфических принципах, но при исследовании вычислительной сложности алгоритмов этой спецификой можно до известного предела пренебрегать и исходить из упрощающей системы допущений. Далее мы будем еще неоднократно обращаться к понятию модели вычислений; всюду до главы 5 без оговорок подразумевается модель РАМ.
Дата добавления: 2014-01-11; Просмотров: 1811; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |