3622
правки
Изменения
→Решение за O(N log N): исправлена бага в алгоритме за O(n log n)
{{Задача
|definition =
Дан массив из <tex>n</tex> чисел: <tex>a[0..n - 1]</tex>. Требуется найти в этой последовательности строго возрастающую подпоследовательность наибольшей длины.
}}
{{Определение
|definition =
'''Наибольшая возрастающая подпоследовательность (НВП)''' (''англ. ''. Longest increasing subsequence - , LIS'') строки <tex> x </tex> длины <tex> n </tex> {{--- }} это последовательность <tex> x[i_1] < x[i_2] < \dots < x[i_k] </tex> символов строки <tex> x </tex> таких, что <tex> i_1 < i_2 < \dots < i_k, 1 \le leqslant i_j \le leqslant n </tex> и , причем <tex> k </tex> {{--- }} наибольшее из возможных.
}}
<code>
</code>
== Ещё одно решение за О(N log N) ==Существует ещё одно решение, которое позволяет нам найти длину наибольшей возрастающей подпоследовательности, но без возможности восстановления данной подпоследовательности. Для вывода самой подпоследовательности достаточной пройти этого мы воспользуемся таблом Юнга. Оно обладает таким свойством, что длина первой строки табла и будет являться искомой величиной<ref>[https://en.wikipedia.org/wiki/Robinson%E2%80%93Schensted_correspondence#Properties Wikipedia {{---}} Robinson–Schensted correspondence]</ref>. Само табло представляет из себя расположение <tex>n_1+n_2+...+n_M</tex> различных целых чисел в массиве строк, выровненных по массиву predлевому краю, где в <tex>i</tex> строке содержится <tex>n_i</tex> элементов; при этом в каждой строке элементы возрастают слева направо, а элементы каждого столбца возрастают сверху вниз. Чтобы построить табло требуется прочитать очередной элемент <tex>a_i</tex>, если он больше либо равен <tex>n_j</tex>, где <tex>j</tex> {{---}} длина строки, то просто добавить в конец строки, если меньше, то требуется найти первый элемент <tex>b</tex>, начиная который больше данного <tex>a_i</tex>. Поставить элемент <tex>a</tex> вместо <tex>b</tex>. С элементом <tex>b</tex> требуется провести те же действия, что и с номера того <tex>a</tex>, только уже на <tex>i+1</tex> строке табла. Пример построения табла на массиве <tex>a = [ 3, 4, 9, 2, 5, 1 ]</tex> : 1. Берём элемент <tex>3</tex>. Видим, что <tex>3 > 0</tex>, который расположен на первой строке в ячейке с индексом <tex>j = 0</tex>. Увеличиваем <tex>j</tex> и <tex>t[i][j] = 3</tex>. :{| border = 1; class="wikitable"| 3 |} 2. Берём элемент <tex>4</tex>. Видим, что <tex>4 > 3</tex>. Увеличиваем <tex>j</tex> и <tex>t[i][j] = 4</tex>. :{| border = 1; class="wikitable"| 3 | 4 |} 3. Аналогично для элемента<tex>9</tex>. :{| border = 1; class="wikitable"| 3 | 4 | 9 |} 4. Берём элемент <tex>2</tex>. Так как <tex>2 < 9</tex>, на котором мы зафиксировали наш ответ lisто бинарным поиском находим нужную нам позицию <tex>z</tex>, такую, что <tex>t[i][z-1] \leqslant 2 < t[i][z]</tex>. В данном случае это первая позиция. Присваиваем <tex>t[i][z] = 2</tex> и спускаясь по его предыдущим элементампроделываем такую же операцию, пока не достигнем но для строки с индексом <tex>i+1</tex>. :{| border = 1; class="wikitable"|-align = "center"| 2 | 4 | 9 |-align = "center"| 3 |} 5. Аналогично для элемента <tex>5</tex>. :{| border = 1 в предке очередного ; class="wikitable"|-align = "center"| 2 | 4 | 5 |-align = "center"| 3 | 9 |} 6. Аналогично для элемента<tex>1</tex>. :{| border = 1; class="wikitable"|-align = "center"| 1 | 4 | 5 |-align = "center"| 2 | 9 |-align = "center"| 3 |} Таким образом, длина наибольшей возрастающей подпоследовательности для массива <tex>a</tex> равна <tex>3</tex> (max^nнапример, подпоследовательность из элементов <tex>[ 3, 4, 9 ]</tex>)_1 . == См. также ==*[[Задача о наибольшей общей подпоследовательности]]*[[Наибольшая общая возрастающая подпоследовательность]]*[[Задача о наибольшей общей палиндромной подпоследовательности]]==Примечания== <references /tex>== Источники информации ==* [http://ru.wikipedia.org/wiki/LIS Википедия {{---}} Задача поиска наибольшей увеличивающейся подпоследовательности]* [https://en.wikipedia.org/wiki/Longest_increasing_subsequence Wikipedia {{---}} Longest increasing subsequence]* [http://informatics.mccme.ru/moodle/mod/book/view.php?id=488 Дистанционная подготовка {{---}} Наибольшая возрастающая подпоследовательность (НВП, Longest Increasing Subsequence, LIS)]* [http://e-maxx.ru/algo/longest_increasing_subseq_log#7 MAXimal :: algo :: Длиннейшая возрастающая подпоследовательность за O (N log N)] [[Категория:Дискретная математика и алгоритмы]][[Категория:Динамическое программирование]]