Нам нужно вести списки увеличивающихся последовательностей.
В общем, у нас есть множество активных списков различной длины. Мы добавляем элемент A [i] в эти списки. Мы сканируем списки (для конечных элементов) в порядке убывания их длины. Мы проверим конечные элементы всех списков, чтобы найти список, конечный элемент которого меньше A [i] (минимальное значение).
Наша стратегия определяется следующими условиями,
1. Если A [i] является наименьшим среди всех конечных кандидатов в активные списки, мы запустим новый активный список длиной 1.
2. Если A [i] является наибольшим среди всех конечных кандидатов в активные списки, мы клонируем самый большой активный список и расширим его на A [i].
3. Если A [i] находится между ними, мы найдем список с наибольшим конечным элементом, который меньше, чем A [i]. Клонировать и расширить этот список на A [i]. Мы отбрасываем все остальные списки той же длины, что и этот измененный список.
Обратите внимание, что в любом случае во время построения активных списков выполняется следующее условие.
«конечный элемент меньшего списка меньше конечных элементов больших списков».
Это будет понятно на примере, давайте возьмем пример из вики:
{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}.
A [0] = 0. Случай 1. Нет активных списков, создайте их.
0.
----------------------------------------------- ------------------------------
A [1] = 8. Случай 2. Клонировать и расширить.
0.
0,8
----------------------------------------------- ------------------------------
A [2] = 4. Случай 3. Клонировать, расширить и выбросить.
0.
0, 4
0, 8. Отклонено
----------------------------------------------- ------------------------------
A [3] = 12. Случай 2. Клонировать и расширить.
0.
0, 4
0, 4, 12.
----------------------------------------------- ------------------------------
A [4] = 2. Случай 3. Клонировать, расширить и выбросить.
0.
0, 2.
0, 4. Отклонено.
0, 4, 12.
----------------------------------------------- ------------------------------
A [5] = 10. Случай 3. Клонировать, расширить и выбросить.
0.
0, 2.
0, 2, 10.
0, 4, 12. Сбрасывается.
----------------------------------------------- ------------------------------
A [6] = 6. Случай 3. Клонировать, расширить и выбросить.
0.
0, 2.
0, 2, 6.
0, 2, 10. Сбрасывается.
----------------------------------------------- ------------------------------
A [7] = 14. Случай 2. Клонировать и расширить.
0.
0, 2.
0, 2, 6.
0, 2, 6, 14.
----------------------------------------------- ------------------------------
A [8] = 1. Случай 3. Клонировать, расширить и выбросить.
0.
0, 1.
0, 2. Отклонено.
0, 2, 6.
0, 2, 6, 14.
----------------------------------------------- ------------------------------
A [9] = 9. Случай 3. Клонирование, расширение и удаление.
0.
0, 1.
0, 2, 6.
0, 2, 6, 9.
0, 2, 6, 14. Отклонено.
----------------------------------------------- ------------------------------
A [10] = 5. Случай 3. Клонировать, расширить и выбросить.
0.
0, 1.
0, 1, 5.
0, 2, 6. Сброшено.
0, 2, 6, 9.
----------------------------------------------- ------------------------------
A [11] = 13. Случай 2. Клонировать и расширить.
0.
0, 1.
0, 1, 5.
0, 2, 6, 9.
0, 2, 6, 9, 13.
----------------------------------------------- ------------------------------
A [12] = 3. Случай 3. Клонирование, расширение и удаление.
0.
0, 1.
0, 1, 3.
0, 1, 5. Сброшено.
0, 2, 6, 9.
0, 2, 6, 9, 13.
----------------------------------------------- ------------------------------
[13] = 11. Случай 3. Клонировать, расширить и выбросить.
0.
0, 1.
0, 1, 3.
0, 2, 6, 9.
0, 2, 6, 9, 11.
0, 2, 6, 9, 13. Сброшено.
----------------------------------------------- ------------------------------
A [14] = 7. Случай 3. Клонирование, расширение и удаление.
0.
0, 1.
0, 1, 3.
0, 1, 3, 7.
0, 2, 6, 9. Сброшено.
0, 2, 6, 9, 11.
----------------------------------------------- -----------------------------
A [15] = 15. Случай 2. Клонировать и расширить.
0.
0, 1.
0, 1, 3.
0, 1, 3, 7.
0, 2, 6, 9, 11.
0, 2, 6, 9, 11, 15. <- LIS List </strong>
Также убедитесь, что мы сохранили условие «конечный элемент меньшего списка меньше конечных элементов больших списков».
Этот алгоритм называется сортировкой терпения.
http://en.wikipedia.org/wiki/Patience_sorting
Итак, выберите костюм из колоды карт. Найдите самую длинную увеличивающуюся последовательность карт из перетасованной масти. Вы никогда не забудете подход.
Сложность: O (NlogN) * 1164 *
Источник: http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/