Изменения

Перейти к: навигация, поиск
Нет описания правки
В этой статье рассматриваются алгоритмы '''Сортировка сравнениями''' (англ. ''Comparison sort'') {{---}} алгоритм [[Сортировки | сортировки сравнением. В таких алгоритмах единственным действием с элементами массива является их сравнение. Значения самих ]], который совершает операции сравнения элементов или иная информация о них , но никак не доступнаиспользует их внутреннюю структуру.
{{
Теорема
|about=о нижней оценке для сортировки сравнениями
|statement=В наихудшем худшем случае в ходе выполнения любого алгоритма любой алгоритм сортировки сравнением выполняется сравнениями выполняет <tex>\Omega(n \log n)</tex> сравнений, где <tex>n</tex> {{- --}} число сортируемых элементов массива.
|proof=Во-первых, будем считать целью нашего алгоритма определить исходную перестановку, после её определения сортировка сведется к нахождению обратной перестановки. Будем искать наихудший случай для алгоритма среди всех возможных перестановок чисел от 1 до <tex>n</tex>, таким образом у каждого сравнения всего два возможных исхода - <tex>a_i < a_j</tex> или <tex>a_i > a_j</tex>.
Рассмотрим некоторое состояние нашего |proof=[[Файл:G2.png|450px|thumb|Пример дерева для алгоритмасортировки трех элементов. В этом состоянии уже известны результаты каких-то сравнений<br>Внутренний узел, помеченный как <tex> i:j </tex>, указывает сравнение между <tex> a_{i} </tex> и в зависимости от них делается следующее, после чего алгоритм переходит в одно из двух состояний<tex> a_{j} </tex>. Кроме тогоЛист, алгоритм может остановиться, если исходная перестановка будет однозначно установлена. Заметимпомеченный перестановкой <tex> \left \langle \pi(1), что этот процесс можно описать двоичным деревом\pi(2), узлы которого будут соответствовать состояниям\ldots , листья - определенным входным перестановкам\pi(n) \right \rangle </tex>, а ребра - результатам сравненийуказывает упорядочение <tex> a_{\pi(1)} \leqslant a_{\pi(2)} \leqslant \ldots \leqslant a_{\pi(n)} </tex>.]]
Вот пример Любому алгоритму сортировки сравнениями можно сопоставить [[Дерево поиска, наивная реализация|дерево]]. В нем узлам соответствуют операции сравнения элементов, ребрам {{---}} переходы между состояниями алгоритма, а листьям {{---}} конечные перестановки элементов (соответствующие завершению алгоритма сортировки). Необходимо доказать, что высота такого дерева для любого алгоритма сортировки сравнениями не меньше чем <tex>\Omega(n \log n)</tex>, где <tex>n = 3</tex>:{{---}} количество элементов.
[[Файл:DecisionTreeОграничимся рассмотрением сортировки перестановок <tex>n</tex> элементов. При сравнении некоторых двух из них, существует два возможных исхода (<tex>a_i \leqslant a_j</tex> и <tex>a_i > a_j</tex>), значит, каждый узел дерева имеет не более двух сыновей. Всего существует <tex>n!</tex> различных перестановок <tex>n</tex> элементов, значит, число листьев нашего дерева не менее <tex>n!</tex> (в противном случае некоторые перестановки были бы не достижимы из корня, а, значит, алгоритм не правильно работал бы на некоторых исходных данных).png]]
Заметим так же, что число листьев у этого дерева должно быть не меньше <tex>n!</tex>, иначе одна из перестановок не сможет быть определена.
Число сравнений в наихудшем случае будет равно глубине этого дерева, поэтому осталось показать, что эта глубина есть <tex>\Omega(n \log n)</tex>. Для этого заметим, что у двоичного дерева глубины <tex>n</tex> листьев не больше <tex>2^n</tex> (в случае полного двоичного дерева), т. е. у двоичного дерева с <tex>n</tex> листьям глубина по крайней мере <tex>\lceil \log_2 n \rceil</tex>. Осталось оценить <tex>\log_2 n = \log_2 1 + \log_2 2 + \ldots + \log_2 n ></tex><tex>n/2 \log_2 (n/2) = n/2(\log_2 n - 1)=O(n \log n)</tex>
Докажем, что двоичное дерево с не менее чем <tex>n!</tex> листьями имеет глубину <tex>\Omega(n \log n)</tex>. Легко показать, что двоичное дерево высоты <tex>h</tex> имеет не более чем <tex>2^h</tex> листьев. Значит, имеем неравенство <tex>n! \leqslant l \leqslant 2^h</tex>, где <tex>l</tex> {{---}} число листьев. Прологарифмировав его, получим: <tex> h \geqslant \log_2 n! = \log_2 1 + \log_2 2 + \ldots + \log_2 n ></tex> <tex> \dfrac{n}{2} \log_2 \left(\dfrac{n}{2}\right) = \dfrac{n}{2}(\log_2 n - 1) = \Omega (n \log n)</tex> Итак, для любого алгоритма сортировки сравнениями , существует такая перестановка, на которой он выполнит <tex>\Omega(n \log n)</tex> сравнений.}} ==Следствия== {{Утверждение|statement=Пирамидальная сортировка и сортировка слиянием являются асимптотически оптимальными сортировками сравнением.|proof=Верхние границы <tex> O(n \log n) </tex> времени работы пирамидальной сортировки и сортировки слиянием совпадают с нижней границей <tex>\Omega(n \log n)</tex> для наихудшего случая из теоремы о нижней границе для сортировки сравнениями.}} {{Утверждение|statement=Любая сортирующая сеть с $n$ нитями имеет размер $\Omega(n \log n)$.|proof=Каждый компаратор реализует одно сравнение двух элементов.Поэтому сортирующая сеть является алгоритмом сортировки, который основан на сравнениях, при чем количества компараторов и сравнений в этом алгоритме совпадают. Значит, их $\Omega(n \log n)$}} {{Утверждение|statement=Любая сортирующая сеть с $n$ нитями имеет глубину $\Omega(\log n)$.|proof= На каждом слое может быть не более $\dfrac{n}{2}$ компараторов, так как внутри одного слоя гнезда компаратора крепятся к разным нитям, ча их $n$. т Пусть $d$ {{---}} количество слоев этой сети. дТогда количество компараторов $k \leqslant \dfrac{n}{2} \cdot d$ Теорема утверждает, что количество сравнений этого алгоритма (то есть количество компараторов) $k = \Omega(n\log n)$.Это означает, что найдется такая константа $c$, что $k \geqslant c \cdot n \log n$.Таким образом $c \cdot n \log n \leqslant k \leqslant \dfrac{n}{2} \cdot d \Rightarrow c \cdot n \log n \leqslant \dfrac{n}{2}\cdot d \Rightarrow 2c\log n \leqslant d \Rightarrow d = \Omega(\log n)$
}}
{{Утверждение|statement=Не существует алгоритма добавления элемента в упорядоченный массив с сохранением порядка, за истинное время $\mathcal{o}(\log n)$, где $n$ {{---}} количество элементов в массиве, |proof=Допустим, есть такой алгоритм. Тогда создадим пустой массив и будем последовательно добавлять в него элементы массива, который хотим отсортировать. В итоге на выходе алгоритма получим отсортированный массив.Тогда сравнений будет $\mathcal{o}(\log 1 + \log 2 + \ldots + \log{(n-1)}) = \mathcal{o}(n\log n)$. Но теорема утверждает, что их должно быть $\Omega(n\log n)$.}} {{Утверждение|statement=Не существует структуры данных, которая одновременно поддерживает добавление элементов и извлечение минимума за амортизированное время <tex> \mathcal{o}(\log n) </tex>. |proof=Если бы такая структура существовала, то с её помощью можно было бы отсортировать все элементы за амортизированное время <tex>\mathcal{o}(n \log{n})</tex> {{---}} добавить все элементы,а затем извлечь минимальный <tex>n</tex> раз. Можно заметить, что теореме даётся оценка на истинную нижнюю границу, а в данном утверждении фигурирует амортизированное время.Но этот факт не является проблемой, так как амортизированное время <tex> \mathcal{o}(\log n) </tex> на одну операцию в случае <tex> n </tex> операций даст суммарное истинное время <tex> \mathcal{o}(n \log n) </tex>.}} == См. также ==* [[Сортирующие_сети]]* [[Быстрая_сортировка]]* [[Двоичная_куча]] ==Источникиинформации==
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 8. Сортировка за линейное время // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с
* [http://da.kalinin.ru/2011/lectures/20110902-1/linear-sort.pdf Андрей Калинин Сортировка за линейное время]
* [http://lectures.stargeo.ru/alg/algorithms.htm#_Toc308850829 Конспект по курсу "Алгоритмы и алгоритмические языки"] (доказательство теоремы через формулу Стирлинга).
* [https://www.lektorium.tv/lecture/13359 Лекториум "Алгоритмы сортировки"]
 
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Сортировки]]
[[Категория: Сортировки на сравнениях]]
66
правок

Навигация