Это не может быть сделано менее чем за O(n)
время. Эскиз доказательства Если бы он это сделал, ему бы пришлось полностью не смотреть хотя бы на один массив. Очевидно, что один массив может произвольно изменить значение элемента kth
.
У меня относительно простой O(n*log(n)*log(m))
, где m
- длина самого длинного массива. Я уверен, что можно быть немного быстрее, но не намного быстрее.
Рассмотрим простой случай, когда у вас есть n
массивы, каждый из которых имеет длину 1. Очевидно, это изоморфно нахождению k
-го элемента в несортированном списке длины n
. Это можно найти в O(n)
, см. Алгоритм медианы медиан, изначально разработанный Блюмом, Флойдом, Праттом, Ривестом и Тарьяном , и более быстрые (асимптотически) алгоритмы невозможны.
Теперь проблема в том, как расширить это для более длинных отсортированных массивов. Вот алгоритм: Найти медиану каждого массива. Сортировать список кортежей (median,length of array/2)
и отсортировать по медиане. Пройдите, сохраняя сумму длин, пока не достигнете суммы, превышающей k. Теперь у вас есть пара медиан, так что вы знаете, что k-й элемент находится между ними. Теперь для каждой медианы мы знаем, является ли kth больше или меньше его, поэтому мы можем выбросить половину каждого массива. Повторение. Когда все массивы имеют один элемент (или меньше), мы используем алгоритм выбора.
Реализация этого покажет дополнительные сложности и граничные условия, но ничего, что увеличит асимптотическую сложность. Каждый шаг
- Находит медианы или массивы,
O(1)
каждый, поэтому O(n)
всего
- Сортирует медианы
O(n log n)
- Прогулки по отсортированному списку
O(n)
- Нарезает массивы
O(1)
каждый так, O(n)
всего
то есть O(n) + O(n log n) + O(n) + O(n) = O(n log n)
. И мы должны выполнить это до тех пор, пока длина самого длинного массива не будет равна 1, что будет составлять log m
шагов в общей сложности O(n*log(n)*log(m))
Вы спрашиваете, можно ли это обобщить на случай несортированных массивов. К сожалению, ответ - нет. Рассмотрим случай, когда у нас есть только один массив, тогда лучший алгоритм должен будет сравнить хотя бы один раз с каждым элементом, чтобы получить в общей сложности O(m)
. Если бы было более быстрое решение для n несортированных массивов, то мы могли бы реализовать выборку, разбив наш единственный массив на n частей. Так как мы только что доказали выбор O(m)
, мы застряли.