Сложность задачи сортировки
Рассмотрим задачу сортировки в общем виде, когда информацию о последовательности элементов можно получать только с помощью операции сравнения двух элементов. Пусть а1,...,аn - последовательность сортируемых элементов. Не ограничивая общности, можно считать, что элементы заданной последовательности помещены в некоторый массив А в том же порядке, m есть A[i] = a, (i = 1,2,...,n).
Начнем с простейшего алгоритма сортировки данных, называемого алгоритмом сортировки выбором. Формализованное описание этого алгоритма представлено ниже.
АЛГОРИТМ 3.1. СОРТИРОВКА ВЫБОРОМ
Данные: массив А[1..n].
Результат: массив А[1..n] такой, что А[1] ≤ А[2] ≤ ... ≤ A[n].
1. begin
2. procedure MIN(i):
3. begin for j = i to n do
4. if A[i] < A[j] then A[i]↔A[j];
5. end;
6. begin (* главная программа *)
7. for i := 1 to n-1 do MIN(i);
8. end;
9. end.
Алгоритм 3.1 имеет следующую структуру. Процедура MIN(i) выбирает минимальный элемент из массива аi,...,аn и ставит его на первое место, т.е. на место ai. Алгоритм начинает работу с вызова процедуры MIN(l), которая перемещает на первое место наименьший элемент исходного массива. Далее процедура повторяется для массива а2,...,аn и т.д.
Теорема 3.1.Алгоритм СОРТИРОВКА ВЫБОРОМ имеет вычислительную сложность O(n2).
□ Действительно, в процедуре MIN(i) осуществляется (n-i) операции сравнения и, в худшем случае, (n-i) операции обмена. Значит, общее число шагов, выполняемое процедурой MIN(i) пропорционально (n-i). Отсюда, число шагов алгоритма пропорционально (n - 1) + (n — 2) + ... + 1 = n(n - 1 )/2, то есть сложность алгоритма есть O(n2).
Легко видеть, что число сравнений в алгоритме СОРТИРОВКА ВЫБОРОМ в точности равно n(n- 1)/2 , т.е. имеет порядок n2,как и сложность всего алгоритма. Ситуация эта не случайна, так как мы рассматриваем задачу сортировки в предположении, что информацию об элементах можно получать только с помощью операций сравнения. Поэтому в дальнейшем, оценивая сложность того или иного алгоритма, будем учитывать только операции сравнения, поскольку именно они и определяют сложность алгоритма.
Следующая теорема дает оценку снизу сложности любого алгоритма сортировки.
Теорема 3.2.В любом алгоритме, упорядочивающем с помощью сравнений, на упорядочение последовательности из n элементов тратится не менее c∙n∙loqn сравнений при некотором с > 0 и достаточно большом n.
Любой алгоритм, упорядочивающий с помощью сравнений, можно схематично представить в виде корневого дерева (см. параграф 2.1.), называемого двоичным деревом решений. Это дерево можно рассматривать как блок-схему алгоритма сортировки, в котором показаны все сравнения элементов и исходы алгоритма. Вершины дерева (кроме листьев) соответствуют сравнениям элементов, при этом корень дерева соответствует первому сравнению, осуществляемому алгоритмом. Сыновья вершин изображают возможные исходы сравнения отца. Листья соответствуют исходу алгоритма.
На рис 3.1 изображено дерево решений алгоритма СОРТИРОВКИ ВЫБОРОМ для сортировки последовательности из трех элементов а1,а2,а3. Здесь запись а:b означает сравнение элементов а и b. После сравнения а и b идем по левой дуге при а ≤ b и по правой при а ≥ b.
Вообще говоря, исходом работы алгоритма явится последовательность из трех элементов такая, что а1 ≤ а2 ≤ а3, однако окончательное значение а1 может (за счет операции переприсваивания) отличаться от исходного. На рис. 3.1 листья изображают возможные исходы относительно начальных значений переменных.
Рис. 3.1. Двоичное дерево решений для сортировки трех элементов
В любом таком дереве решений каждая перестановка определяет единственный путь от корня к листу. Поскольку алгоритм сортировки должен различать все возможные перестановки, получаем, что дерево решений должно содержать как минимум n! листьев.
При каждом входе алгоритм проходит весь путь от корня до листа, соответствующего данному входу. Следовательно, число операций сравнения, осуществляемое алгоритмом, равно длине пути от корня до листа, то есть равно высоте двоичного дерева решений. Таким образом, высота этого дерева дает оценку снизу сложности алгоритма.
Поскольку, всякое двоичное дерево высоты к имеет не более 2к листьев (лемма 2.1), то получаем, что должно выполняться неравенство 2к > n!, так как листьев в двоичном дереве решений должно быть не меньше, чем перестановок из n элементов. Отсюда, k > logn!. Осталось заметить, что при n > 1 справедлива следующая цепочка неравенств:
n! ≥ n(n - 1 )(n - 2)... ( ) ≥ (n/2)n/2, так что
log n! ≥ log( n/2 )n/2 = n/2 log n/2 ≥ n/4 log n
Итак, k ≥ n/4 logn — полученное неравенство завершает доказательство теоремы 3.2.
Дата добавления: 2021-07-22; просмотров: 308;