Изменения

Перейти к: навигация, поиск

Участник:Artem.ustinov/НВП

107 байт убрано, 17:18, 7 января 2018
Обработка блока
=== Обработка блока ===
Обрабатывая блоки, будем Каждому элементу <tex>x</tex> взаимно однозначно сопоставим ключ <tex>y = \mathtt{key}(x);~x=\mathtt{elt}(y)</tex>. Очередь <tex>B</tex> будет работать не со значениями элементов, а непосредственно с ключами, которые определенны для каждого элемента внутри блоков. Все блоки будут обрабатываться онлайн, то есть мы не перейдём к обработке следующего блока, пока не закончим с текущимэлементов.
Каждому элементу Определим ключи элементов так, чтобы их значения были в промежутке <tex>x\{1,2,\dots,2m\}</tex> взаимно однозначно сопоставим ключ . Работая с блоком <tex>C_j</tex>, будем сливать элементы, ключи которых находятся в очереди <tex>B</tex>, с <tex>C_j^s</tex> в список <tex>y = \mathtt{keymerged}(x);~x=</tex>. Поскольку мы предположили, что <tex>m\geqslant k</tex>, то количество ключей в <tex>B</tex> не больше <tex>m</tex>, тогда длина <tex>\mathtt{eltmerged}(y)</tex>. Все значения ключей расположим в промежутке не больше <tex>2m</tex>, что позволяет однозначно определить ключи на множестве <tex>\{1,2,\dots,2m\}</tex>. Как было замечено ранее, и элементы, чьи ключи находятся в очереди <tex>B</tex> будем работать со значениями ключей элементов, располагаются в возрастающем порядке, поэтому возможно производить тривиальную операцию [[Сортировка слиянием#Принцип работы#Слияние двух массивов | слияния]] за <tex>O(m)</tex>.
Чтобы определить ключи элементов так, чтобы их значения были в представленном промежутке, будем, работая с блоком <tex>C_j</tex>, сливать элементы, ключи которых находятся в очереди <tex>B</tex>В итоге, с <tex>C_j^s</tex> в получим отсортированный список <tex>\mathtt{merged}</tex>.Получим ключи, сопоставив поэтому если сопоставить ключ каждому элементу в <tex>\mathtt{merged}</tex> как его позицию в этом списке. Как было замечено ранее, элементыто справедливо утверждение, чьи ключи находятся в что <tex>B</tex>, располагаются в возрастающем порядке, поэтому возможно производить тривиальную операцию [[Сортировка слиянием#Принцип работы#Слияние двух массивов | слияния]]. Поскольку мы предположили, что (\pi_{i}<tex>m\geqslant pi_{k} \Longleftrightarrow \mathtt{key}(\pi_{i})</tex>, то количество ключей в <tex>B</tex> не больше <tex>m</tex>, тогда длина <tex>\mathtt{mergedkey}(\pi_{k}</tex> не больше <tex>2m))</tex>, что позволяет однозначно определить ключи на множестве где <tex>\pi_{1,2i},\dots,2mpi_{k}\in \mathtt{merged}</tex>. Таким образом, приоритетная очередь сможет корректно работать с ключами элементов.
После того, как мы определили новые ключи для элементов, обновим обновляем ключи в очереди <tex>B</tex>.
Затем запускаем описанный выше алгоритм <tex>\mathrm{LIS}</tex>, для ключей элементов <tex>C_j</tex> в порядке исходной последовательности.
* Достаем из очереди <tex>B</tex> ключи <tex>x</tex>, конвертируем их в элементы <tex>\mathtt{elt}(x)</tex> и кладём в список <tex>\mathtt{elems}</tex>.
* Сливаем элементы в <tex>\mathtt{elems}</tex> со следующим отсортированным блоком в список <tex>\mathtt{merged}</tex>.
* Присваеваем Присваиваем новые ключи элементам в порядке списка <tex>\mathtt{merged}</tex>.
* Вставляем в <tex>B</tex> новые ключи элементов списка <tex>\mathtt{elems}</tex>.
* Обрабатываем ключи элементов блока в порядке исходной последовательности с помощью алгоритма <tex>\mathrm{LIS}</tex>. Для восстановления НВП также используем массив "предшественников", который будет работать с соответствующими ключам элементами <tex>\mathtt{elt}(x)</tex>.
76
правок

Навигация