|
С понятием сложности алгоритма связываются затраты времени или памяти, соответствующие худшему случаю, либо затраты в среднем. Это понятие дает математическое уточнение довольно расплывчатого термина “трудоемкость”, с помощью которого иногда пытаются характеризовать алгоритмы. |
|
При рассмотрении со сложностной точки зрения некоторого
алгоритма |
|
|
|
Входы алгоритма могут варьироваться при фиксированном
значении размера входа, при этом затраты, вообще
говоря, меняются. Временно́й и пространственной сложностями
алгоритма
![]() ![]() ![]() ![]() |
|
|
|
Сложность в худшем случае определяет точную верхнюю границу возможных затрат алгоритма для входов данного размера. Нельзя исключить того, что в некоторых случаях эта граница окажется достаточно высокой, а соответствующие худшему случаю входы будут встречаться редко среди всех таких входов. |
|
|
Вопрос:
Пусть алгоритм
![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Пусть
![]() ![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Верно ли, что пространственная сложность сортировки выбором
(в качестве размера входа берется длина
![]() ![]()
|
|
Вопрос:
Пусть некоторому алгоритму
![]() ![]() ![]() ![]() ![]() ![]() ![]()
|
|
Обсуждая сложность в среднем, мы ограничимся ситуацией,
когда при каждом фиксированном значении
|
|
|
|
Для любого алгоритма |
|
|
|
Если алгоритм применяется многократно к входам данного размера, то можно ожидать, что среднее арифметическое затрат будет близко к сложности в среднем нашего алгоритма. Но при этом предполагается, что входам данного размера адекватно сопоставлены некоторые вероятности, а для такого предположения должны быть достаточные основания (типичное допущение, что все входы каждого размера равновероятны, в конкретной ситуации может оказаться безосновательным). |
|
|
|
|
|
Вопрос:
Верно ли, что для рассмотрения сложности в среднем
некоторого алгоритма требуется задание распределения вероятностей:
|
|
Вопрос:
Пусть некоторому алгоритму
![]() ![]() ![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Рассмотрим множество всех перестановок чисел
![]() ![]() ![]() ![]() ![]() ![]()
|
|
Итак, сложность алгоритма как в худшем случае, так и в среднем есть функция числового аргумента — размера входа. Для исследования роста сложности конкретного алгоритма при возрастании размера входа часто используются асимптотические оценки вида
![]() ![]() ![]() ![]() |
|
|
|
Сравнение сложностей различных алгоритмов на основе их асимптотических
оценок возможно не для всех типов таких оценок.
Если, например, для сложностей |
|
|
|
|
|
|
|
Вопрос:
Пусть полином
![]() ![]()
|
|
Вопрос:
Какие из следующих утверждений неверны для сложности
![]() ![]()
|
|
Вопрос:
Будем считать затратностью любого построения на плоскости с
помощью циркуля и линейки количество линий (окружностей или
прямых), проводимых в ходе построения. Рассмотрим задачу
построения отрезка, длина которого равна
![]() ![]() ![]()
|
|
Можно рассматривать сложности разных видов в соответствии с учитываемыми затратами. Пусть функция временных затрат отражает число операций какого-то типа в предположении, что эти операции требуют одинакового времени выполнения, не зависящего от размера операндов, и что это время равно 1. Тогда получается алгебраическая сложность по числу операций рассматриваемого типа. |
|
|
|
Битовая временная сложность получается при рассмотрении числа битовых операций в качестве функции затрат. Аналогично могут быть определены пространственные алгебраическая и соответственно битовая сложности по числу величин рассматриваемого типа. |
|
|
|
|
Вопрос:
Хорошо известно, что мультипликативная сложность метода Гаусса решения системы
![]() ![]()
|
|
Вопрос:
Допустим, что для умножения двух целых положительных чисел
![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
К числу, первоначально равному нулю, прибавляется шаг за
шагом по единице до получения значения
![]() ![]() ![]()
|
|
Понятие сложности рассматривается и в связи с рандомизированными алгоритмами, т.е. алгоритмами, содержащими обращения к генератору случайных чисел с известным распределением. |
|
|
|
Затраты рандомизированного алгоритма, вообще говоря, не определяются однозначно входом алгоритма, они зависят и от полученных случайных чисел. Но усредненные затраты для каждого конкретного входа дают числовую функцию на множестве входов, что позволяет рассматривать сложность алгоритма, следуя общему определению сложности. |
|
|
|
Мы уже говорили о том, что сложность в среднем “обычного” (детерминированного) алгоритма представляет интерес только в том случае, если правильны предположения о вероятности появления того или иного входа. Рассматриваемая нами сложность рандомизированных алгоритмов — это сложность в худшем случае, но она определяется на основе усредненных затрат. Эта усредненность заслуживает полного доверия, так как рандомизированные алгоритмы используют генераторы случайных чисел, в которых распределение вероятностей фиксировано и не зависит от входов. |
|
|
|
|
|
Вопрос:
Верно ли, что определение усредненных затрат некоторого
рандомизированного алгоритма требует задания распределения
вероятностей:
|
|
Вопрос:
Массив
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Предположим, что у нас нет другого генератора случайных
чисел, кроме генератора, в результате обращения к которому
появляется 0 с вероятностью
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
|
|
В теории сложности исходят из некоторой гипотетической модели вычислительного устройства (“модели вычислений”). |
|
Иногда в качестве такой модели выбирается машина с равнодоступными ячейками памяти (“равнодоступная адресная машина” — РАМ). В других случаях — машина Тьюринга. |
|
|
|
Первая из этих моделей ближе к реальным устройствам, вторая является более формализованной, что часто оказывается полезным при исследовании существования алгоритма с теми или иными сложностными свойствами. |
|
Мы будем ориентироваться на модель РАМ. Предположение, что на объем ячейки нет ограничений, приводит к алгебраической сложности, а предположение, что в ячейке хранится один бит, — к временной или пространственной битовой сложности. |
|
Для рассматриваемого нами понятия сложности иногда используется термин вычислительная сложность (возможными частными случаями которой служат алгебраическая и битовая сложности). Это делается для того, чтобы избежать путаницы с описательной сложностью, которая тем или иным способом определяется исходя из самой записи, т.е. текста, алгоритма. |
|
|
|
Мы обсуждаем только вычислительную сложность, и будем продолжать называть ее просто сложностью. |
|
Рассматривая класс алгоритмов решения некоторой задачи, мы получаем семейство функций, являющихся сложностями (например, временными) алгоритмов этого класса. Могут обсуждаться вопросы о нижней границе этого семейства, о существовании в нем минимальной функции. |
|
|
|
Если минимальная функция в этом семействе существует, то соответствующий ей алгоритм — оптимальный в рассматриваемом классе алгоритмов. |
|
|
|
|
Вопрос:
Является ли
![]() ![]() ![]()
|
|
Вопрос:
Обратимся к задаче вычисления
![]() ![]() ![]() ![]()
|
|
Вопрос:
Путник столкнулся со стеной, простирающейся бесконечно в
обе стороны. Имеется дверь в этой стене, но путник не знает ни
расстояния до двери, ни направления к ней. Пусть
![]() ![]() ![]() ![]()
|
|
Вопрос:
Верно ли, что функция
![]() ![]()
|
|
Вопрос:
Пусть
![]() ![]() ![]() ![]() ![]() ![]()
|
|
Оптимальные в заданном классе алгоритмы известны не всегда. Возможно также, что в классе просто нет оптимального алгоритма, т.е. алгоритма, сложность которого является нижней границей для сложностей алгоритмов данного класса. |
|
|
|
Нередко бывает очень трудно ответить на вопрос о существовании в конкретном классе алгоритма такого, сложность которого растет с увеличением размера входа не слишком быстро. |
|
|
|
Относительно некоторых классов алгоритмов трудным является вопрос о том, имеется ли в этом классе алгоритм, сложность которого ограничена сверху некоторым полиномом, вид которого не оговаривается (такой алгоритм принято называть полиномиальным). |
|
|
|
В частности, остается много неясного относительно полиномиальных алгоритмов для задач распознавания, где ответ — это одно из слов “да”, “нет” или же одно из чисел 1, 0 и т.д. Здесь упомянем получившую известность проблему P≟NP. |
|
|
|
|
Вопрос:
Будем считать затратностью любого построения на плоскости с
помощью циркуля и линейки количество линий (окружностей или
прямых), проводимых в ходе построения. Рассмотрим задачу
построения отрезка, длина которого равна
![]() ![]() ![]()
|
|
Вопрос:
Вопрос о существовании полиномиального алгоритма
разложения целого числа
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Можно ли вычислить произведение двух данных комплексных
чисел
![]() ![]() ![]() ![]()
|
|
Вопрос:
Верно ли, что для доказательства того, что P
![]()
|
|
При исследовании существования алгоритма решения задачи, имеющего “не очень высокую” сложность, важную роль играет сводимость какой-то одной задачи к другой. Из возможности быстро решить некоторую задачу может следовать такая же возможность для ряда других, и наоборот, невозможность быстрого решения какой-то одной задачи может автоматически повлечь такую же невозможность для ряда других задач. |
|
Рассмотрение линейной сводимости позволяет придать точный смысл словам, что одна вычислительная задача не сложнее другой. |
|
|
|
Полиномиальная сводимость позволяет заключить, что если одна вычислительная задача решается полиномиальным алгоритмом, то и какая-то другая решается полиномиальным алгоритмом. |
|
|
|
|
Вопрос:
Сводится ли линейно (см. выше в этом пункте) задача умножения
произвольных квадратных матриц к задаче умножения верхних
треугольных матриц в предположении, что для умножения верхних
треугольных матриц рассматриваются только такие алгоритмы, для
которых
![]()
|
|
Вопрос:
Существуют ли в NP задачи, не являющиеся NP-полными?
|
|
Вопрос:
Если бы оказалось, что полиномиального алгоритма
распознавания простоты натурального числа не существует
(забудем на короткое время об алгоритме Агравала, Кайала
и Саксены, см. п. 9),
то следовало ли бы из этого, что P
![]()
|
|
Наряду с разнообразными вопросами о пределах возможного для алгоритмов того или иного класса, всегда актуальными остаются вопросы, связанные с оценками сложности конкретных алгоритмов. Часто тривиальные верхние и нижние оценки выводятся легко, но получение оценок, в полной мере отражающих возможности алгоритма, требует немалых усилий и изобретательности. |
|
|
|
|
Вопрос:
Бинарный алгоритм поиска места элемента в упорядоченном
массиве длины
![]() ![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Сложность
![]() ![]() ![]() ![]() ![]()
|
|
Вопрос:
Верно ли, что
![]() ![]() ![]() ![]()
|
|
Вопрос:
Пусть
![]() ![]()
for
if od в предположении, что все возможные взаимные порядки элементов в исходном массиве длины![]()
|