Поиск k-ой порядковой статистики в двух массивах — различия между версиями
Анна (обсуждение | вклад) (→Варианты решения) |
Анна (обсуждение | вклад) (→Варианты решения) |
||
Строка 9: | Строка 9: | ||
=== Совсем не наивное решение === | === Совсем не наивное решение === | ||
Оба решения, приведенные выше, работают за линейное время, то есть приемлемо работают только при небольших значениях <tex>k</tex>. Следующее решение работает за <tex>O(log(n) + log(m))</tex>. | Оба решения, приведенные выше, работают за линейное время, то есть приемлемо работают только при небольших значениях <tex>k</tex>. Следующее решение работает за <tex>O(log(n) + log(m))</tex>. | ||
+ | |||
+ | Чтобы получить логарифмическую сложность, будем использовать бинарный поиск, который вдвое сокращает область поиска с каждой итерацией. То есть для достижения нужной сложности мы должны на каждой итерации вдвое сокращать круг поиска в каждом из массивов. |
Версия 19:17, 13 апреля 2015
Содержание
Постановка задачи
Пусть даны два отсортированных массива
и размерами и соответственно. Требуется найти -ый порядковый элемент после их слияния. Будем считать, что все элементы в массивах различны и нумеруются с нуля.Варианты решения
Наивное решение
Сольем два массива и просто возьмем элемент с индексом
. Сливание будет выполнено за .Чуть менее наивное решение
Будем использовать два указателя, с помощью которых сможем обойти массивы не сливая их. Поставим указатели на начало каждого из массивов. Будем увеличивать на единицу тот из них, который указывает на меньший элемент. После
-ого добавления сравним элементы, на которых стоят указатели. Меньший из них и будет ответом. Таким образом, мы получим -ый элемент за шагов.Совсем не наивное решение
Оба решения, приведенные выше, работают за линейное время, то есть приемлемо работают только при небольших значениях
. Следующее решение работает за .Чтобы получить логарифмическую сложность, будем использовать бинарный поиск, который вдвое сокращает область поиска с каждой итерацией. То есть для достижения нужной сложности мы должны на каждой итерации вдвое сокращать круг поиска в каждом из массивов.