Докажите нижнюю границу Omega(n log n) для алгоритмов сортировки, основанных только на сравнениях элементов; обсудите, какие дополнительные предположения о ключах позволяют обойти это ограничение
Доказательство (модель дерева решений). Рассмотрим любой алгоритм сортировки, который может опираться только на сравнения пар ключей. Его выполнение на входе из nnn различных элементов можно представить как двоичное дерево решений: каждый внутренний узел — сравнение двух элементов, каждая ветвь — результат сравнения (<<< или >>>), листья — завершённые упорядочения входа. Поскольку разные перестановки входа требуют попадания в разные листья, число листьев не меньше числа перестановок, т.е. не меньше n!n!n!. Если высота дерева равна hhh, то дерево имеет не более 2h2^h2h листьев, значит 2h≥n!⇒h≥log2(n!).
2^h \ge n! \quad\Rightarrow\quad h \ge \log_2(n!). 2h≥n!⇒h≥log2(n!).
Оценка log2(n!)\log_2(n!)log2(n!). По неравенству Стирлинга или простому неравенству n!≥(n/e)nn! \ge (n/e)^nn!≥(n/e)n получаем log2(n!)≥nlog2ne=nlog2n−nlog2e=Θ(nlogn).
\log_2(n!) \ge n\log_2\frac{n}{e} = n\log_2 n - n\log_2 e = \Theta(n\log n). log2(n!)≥nlog2en=nlog2n−nlog2e=Θ(nlogn).
Следовательно высота любого дерева (т.е. число сравнений в худшем случае) имеет нижнюю границу Ω(nlogn).
\Omega(n\log n). Ω(nlogn).
(Это и есть информационно‑теоретическая нижняя граница для алгоритмов на сравнениях. Для случая возможных равных ключей аналогичный вывод даёт нижнюю границу, зависящую от числа различных перестановок входа — в худшем случае ключи различны, получаем ту же оценку.) Какие дополнительные предположения позволяют обойти Ω(nlogn)\Omega(n\log n)Ω(nlogn)
- Ключи — целые числа из конечного диапазона {0,…,k−1}\{0,\dots,k-1\}{0,…,k−1}. Тогда можно использовать подсчёт (counting sort) за O(n+k)O(n+k)O(n+k), что при k=O(n)k=O(n)k=O(n) даёт O(n)O(n)O(n). - Ключи — фиксированная длина битовой строки (слово) длины www. Тогда radix sort (с подсчётом по «цифрам») даёт время O(n⋅w/b+2b)O(n\cdot w/b + 2^b)O(n⋅w/b+2b) для разбиения по bbb-битным цифрам; при разумном выборе параметров и при w=O(logn)w=O(\log n)w=O(logn) это даёт O(n)O(n)O(n). Иными словами, при ограниченной (полиномиальной по nnn) длине ключа можно сортировать за линейное время на RAM-модели, использующей арифметические/битовые операции. - Равномерное распределение ключей или ключи из небольших блоков позволяет применить bucket sort, дающий амортизированно O(n)O(n)O(n) при подходящих предположениях о распределении. - Если разрешены операции, отличные от сравнений (индексация, арифметика, побитовые операции, хеширование), то появляются некомпаративные алгоритмы, обходящие информационную границу моделей на чистых сравнениях. Коротко: нижняя граница Ω(nlogn)\Omega(n\log n)Ω(nlogn) верна для любой модели, где единственное допустимое действие — сравнение двух ключей; её можно обойти, если ключи имеют дополнительную структуру (ограниченный диапазон, фиксированная длина битов, известное распределение) или если алгоритм может делать операции сильнее простого сравнения.
2h≥n!⇒h≥log2(n!). 2^h \ge n! \quad\Rightarrow\quad h \ge \log_2(n!).
2h≥n!⇒h≥log2 (n!). Оценка log2(n!)\log_2(n!)log2 (n!). По неравенству Стирлинга или простому неравенству n!≥(n/e)nn! \ge (n/e)^nn!≥(n/e)n получаем
log2(n!)≥nlog2ne=nlog2n−nlog2e=Θ(nlogn). \log_2(n!) \ge n\log_2\frac{n}{e} = n\log_2 n - n\log_2 e = \Theta(n\log n).
log2 (n!)≥nlog2 en =nlog2 n−nlog2 e=Θ(nlogn). Следовательно высота любого дерева (т.е. число сравнений в худшем случае) имеет нижнюю границу
Ω(nlogn). \Omega(n\log n).
Ω(nlogn). (Это и есть информационно‑теоретическая нижняя граница для алгоритмов на сравнениях. Для случая возможных равных ключей аналогичный вывод даёт нижнюю границу, зависящую от числа различных перестановок входа — в худшем случае ключи различны, получаем ту же оценку.)
Какие дополнительные предположения позволяют обойти Ω(nlogn)\Omega(n\log n)Ω(nlogn) - Ключи — целые числа из конечного диапазона {0,…,k−1}\{0,\dots,k-1\}{0,…,k−1}. Тогда можно использовать подсчёт (counting sort) за O(n+k)O(n+k)O(n+k), что при k=O(n)k=O(n)k=O(n) даёт O(n)O(n)O(n).
- Ключи — фиксированная длина битовой строки (слово) длины www. Тогда radix sort (с подсчётом по «цифрам») даёт время O(n⋅w/b+2b)O(n\cdot w/b + 2^b)O(n⋅w/b+2b) для разбиения по bbb-битным цифрам; при разумном выборе параметров и при w=O(logn)w=O(\log n)w=O(logn) это даёт O(n)O(n)O(n). Иными словами, при ограниченной (полиномиальной по nnn) длине ключа можно сортировать за линейное время на RAM-модели, использующей арифметические/битовые операции.
- Равномерное распределение ключей или ключи из небольших блоков позволяет применить bucket sort, дающий амортизированно O(n)O(n)O(n) при подходящих предположениях о распределении.
- Если разрешены операции, отличные от сравнений (индексация, арифметика, побитовые операции, хеширование), то появляются некомпаративные алгоритмы, обходящие информационную границу моделей на чистых сравнениях.
Коротко: нижняя граница Ω(nlogn)\Omega(n\log n)Ω(nlogn) верна для любой модели, где единственное допустимое действие — сравнение двух ключей; её можно обойти, если ключи имеют дополнительную структуру (ограниченный диапазон, фиксированная длина битов, известное распределение) или если алгоритм может делать операции сильнее простого сравнения.