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

4.1.4. Производящие функции

При работе с последовательностями используется идея: каждой числовой последовательности сопоставляется некоторая функция действительного (комплексного) переменного таким образом, чтобы обычным операциям над последовательностями соответствовали простые операции над сопоставленными функциями. Наиболее общим в комбинаторике является сопоставление последовательности x0, x1, x2,… производящей функции X(s) = действительной переменной s.

Проиллюстрируем использование полиномиальных производящих функций для вывода нескольких важных формул для сочетаний без повторений на примере бинома Ньютона

. (4.17)

Рассмотрим следующие частные случаи:

а) если x = 1, то 2n =; это выражение позволяет определить количество подмножеств некоторого множества;

б) если x = -1, то 0 =, т.е.,

где i - чётное, а i’– нечётное.

Для сочетаний с повторениями используется полиномиальная производящая функция X(s)=1 + s1x + s2x2 +…, коэффициенты sr которой представляют собой r-сочетания из n различных элементов с повторениями. Эта функция является обобщением бинома Ньютона, которая рассматривается как произведение многочленов разных степеней, причём старшая степень каждого из перемножаемых многочленов задаётся специфи-кацией (приложение Б). Например, для r-сочетаний из трёх элементов a, b, c со спецификацией {3, 1, 2} имеем

(1 + x + x2 + x3)(1 + x )( 1 + x + x2)=1 + 3x + 5x2 + 6x3 + 5x4 + 3x5 + x6.

Здесь коэффициент при xr дает искомое число r-сочетаний. Так, имеется пять 2-сочетаний (аа, ab, ac, bc, cc), шесть 3-сочетаний (aaa, aab, aac, abc, acc, bcc) и т. д.

4.2. Оценки сложности алгоритмов

Важным мотивом, побуждающим рассматривать формальные модели вычислений, является желание раскрыть вычислительную сложность различных задач с целью получить нижние оценки на время вычисления. Чтобы показать, что не существует алгоритма, выполняющего данное задание менее чем за определённое время, необходимо точное и подчас высокоспециализированное определение того, что есть алгоритм. Одним из примеров такого определения служат машины Тьюринга.

Машина Тьюринга – простейшая модель вычислений; существуют и более сложные модели, например многоленточные машины Тьюринга, автоматы Неймана [7]. Все они могут быть использованы для решения тех задач, для которых существует алгоритм. На основе этих моделей строятся более специализированные модели вычислений, а именно: неветвящиеся арифметические программы, битовые вычисления, вычисления с двоичными векторами и деревья решений.

Алгоритмы имеют следующие характеристики:

1) сложность;

2) трудоёмкость;

3) надежность и др.

Далее рассматривается только первая характеристика – сложность. Для оценки сложности алгоритмов существует много критериев. Чаще всего важен порядок роста необходимых для решения задачи времени и ёмкости памяти (количество ячеек для хранения данных) при увеличении количества входных данных. Свяжем с каждой конкретной задачей некоторое число, называемое её размером, которое выражало бы меру количества входных данных. Например, размером задачи умножения матриц может быть наибольший размер матриц сомножителей; размером задачи о графах может быть число рёбер данного графа и т.п.

Время, затрачиваемое алгоритмом, как функция размера задачи, называется временной сложностью этого алгоритма. Поведение этой сложности в пределе при увеличении размера задачи называется асимптотической временной сложностью. Аналогично определяются ёмкостная сложность и асимптотическая ёмкостная сложность.

Именно асимптотическая сложность алгоритма определяет в итоге размер задач, которые можно решить этим алгоритмом. Если алгоритм об-рабатывает входы размера n за время Cn2, где C - некоторая постоянная, то говорят, что временная сложность этого алгоритма есть O(n2) (читается “порядка n2“). Точнее, говорят, что неотрицательная функция g(n) есть O(f(n)), если существует такая постоянная C, что g(n)Cf(n) для всех, кроме конечного (возможно, пустого) множества, неотрицательных значений n.

Временная сложность в худшем случае (или просто временная сложность) алгоритма - это функция f(n), равная наибольшей (по всем входам размера n) из сумм времён, затраченных на каждый выполненный оператор. Временная сложность в среднем - это среднее, взятое по всем входам размера n, тех же самых сумм.

Аналогично определяется понятие для ёмкости памяти, только вместо "времён, затраченных на каждый выполненный оператор", следует подставить "ёмкость всех ячеек, к которым было обращение".

Определение. Говорят, что неотрицательные функции f1(n) и f2(n) полиномиально связаны (эквивалентны), если найдутся такие полиномы P1(x) и P2(x), что для всех n справедливы неравенства f1(n)P1(f2(n)) и f2(n)P2(f1(n)).

Пример 4.1. Пусть f1(n)=2n2 и f2=n5.Покажем, что функции f1 и f2 полиномиально связаны, для чего введём в рассмотрение полиномы P1(x)=2x и P2(x)=x3. Имеем 2n22(n5) и n5(2n2)3=8n6.

Пример 4.2. Для функций f1(n)=n2 и f2(n)=2n не удаётся подобрать такие полиномы P1(x) и P2(x), чтобы выполнились неравенства f1(n)P1(f2(n)) и f2(n)P2(f1(n)) при любом n, так как показательная функция с ростом n растёт быстрее степенной.

Не важно, как алгоритм представлен - в терминах языка высокого уровня или последовательностью двоичных символов; если алгоритм имеет полиномиальную (экспоненциальную) сложность для первого представления, то он будет иметь также полиномиальную (экспоненциальную) сложность и для второго представления.

Говорят, что данный алгоритм является алгоритмом с полиномиальным временем, если время его работы, т.е. число элементарных двоичных операций, которые он выполняет на входной строке длины l, ограничено сверху некоторым полиномом P(l). Класс всех задач, решаемых такими алгоритмами, обозначается через P; в этот класс очевидно не входят задачи, для решения которых необходим экспоненциальный алгоритм.

Введём в рассмотрение класс NP задач, которые можно решить за полиномиальное время с помощью недетерминированного алгоритма. В отличие от детерминированного алгоритма, в котором для любого данного состояния1 существует не более одного вполне определённого следующего состояния, в недетерминированном алгоритме может быть больше одного допустимого следующего состояния2. Отметим, что P NP .

Задача A является NP–трудной, если детерминированный полиномиальный алгоритм её решения можно использовать для получения детерминированного полиномиального алгоритма для каждой задачи из NP. Другими словами, задача A является NP–трудной, если она по крайней ме-ре так же трудна, как и любая задача в NP. NP–трудная задача из NP на-зывается NP–полной; такая задача не труднее, чем любая задача из NP.

Соседние файлы в папке Основаная часть