Я занимаюсь алгоритмами, и одна из моих задач - подсчитать число всех длительно растущих подпоследовательностей для заданных 0 < n <= 10 ^ 6 чисел. Решение O (n ^ 2) не является вариантом.
Я уже реализовал поиск LIS и его длины ( LIS Algorithm), но этот алгоритм переключает числа до минимума. Поэтому невозможно определить, смогут ли подпоследовательности с предыдущим номером (более крупным) достичь самой длинной длины, иначе я мог бы просто посчитать эти переключатели, я думаю.
Любые идеи, как это сделать в O (nlogn)? Я знаю, что его нужно решать с помощью динамического программирования.
Я реализовал одно решение, и оно работает хорошо, но для этого требуется два вложенных цикла (i в 1..n) x (j в 1..i-1).
Так что O (n ^ 2), я думаю, все же это слишком медленно.
Я даже попытался переместить эти числа из массива в двоичное дерево (потому что в каждой i-й итерации я ищу все меньшие числа, а затем число [i] - через элементы i-1..1), но оно было еще медленнее.
Примеры тестов:
1 3 2 2 4
result: 3 (1,3,4 | 1,2,4 | 1,2,4)
3 2 1
result: 3 (1 | 2 | 3)
16 5 8 6 1 10 5 2 15 3 2 4 1
result: 3 (5,8,10,15 | 5,6,10,15 | 1,2,3,4)