diff --git a/index.html b/index.html index 7eb0c95..c1bd541 100644 --- a/index.html +++ b/index.html @@ -14,5 +14,7 @@ Линейные алгоритмы в теории чисел
Квадратичные вычеты и корни по простому модулю +
+ Inplace merge diff --git a/pages/inplace_merge/main.md b/pages/inplace_merge/main.md index aacd00f..ec79863 100644 --- a/pages/inplace_merge/main.md +++ b/pages/inplace_merge/main.md @@ -64,8 +64,8 @@ Выберем $\beta = \Theta(\sqrt{n})$. Выделим $\beta$ максимальных элементов и переместим их в конец. Это пространство мы будем использовать как буфер. Далее разобъём $A, B$ на блоки размера $\beta$. В силу Леммы 2 можно считать, что блоки полные. -**Шаг 1.** Итого у нас получилось порядка $ \frac{n}{\beta} $ блоков размера $\beta$. Отсортируем их **выбором** по минимальному элементу(при -равенстве сравним еще и по максимальному). Сортировка выбором делает порядка $ \left( \frac{n}{\beta} \right)^2 $ сравнений и $ \frac{n}{\beta}$ свопов. +**Шаг 1.** Итого у нас получилось порядка $\frac{n}{\beta}$ блоков размера $\beta$. Отсортируем их **выбором** по минимальному элементу(при +равенстве сравним еще и по максимальному). Сортировка выбором делает порядка $\left( \frac{n}{\beta} \right)^2$ сравнений и $\frac{n}{\beta}$ свопов. Стоимость одного сравнения $O(1)$, а свопа $O(\beta)$, поэтому суммарно этот шаг отработает за $O\left( \frac{n^2}{\beta^2} + \frac{n}{\beta} \beta \right) = O(n)$ в силу выбора $\beta$. @@ -82,7 +82,7 @@ $B$. Здесь мы как раз пользуемся отсортирован Тем самым выделенные элементы должны попасть в первые $(t + 1)$ блоков. Действительно, рассмотрим последний из 'крайних' блоков. Из структурного утверждения, в каждом блоке до него также что-то выделено. Пусть до него включительно есть $k$ блоков. Так как частичных блоков не более двух, то хотя бы $k - 2$ заполнены полностью, то есть -выделено хотя бы $(k - 2)\beta + 1$ элементов. Откуда $k <= t + 1$, что и требовалось. +выделено хотя бы $(k - 2)\beta + 1$ элементов. Откуда $k \leqslant t + 1$, что и требовалось. **Шаг 2.** Согласно следствию нам достаточно итеративно сливать соседние блоки. Каждое такое слияние можно выполнить без дополнительной памяти с помощью буфера из максимумов, которым мы запаслись в начале. Ясно, что суммарно такие слияния работают за $O(n)$. @@ -93,4 +93,5 @@ $B$. Здесь мы как раз пользуемся отсортирован Тем самым мы научились решать исходную задачу. ## Полезные ссылки и источники +* [Оригинальная статья Кронрода](https://www.mathnet.ru/php/archive.phtml?wshow=paper&jrnid=dan&paperid=34705&option_lang=rus) * [Лекция Ф.Д.Руховича по алгоритмам и структурам данных](https://www.youtube.com/watch?v=V-kWungDekU&t=4536s)