Один простой способ - создать максимальную кучу размером b .Затем запустите этот код:
for arr in arrays // process each of the k arrays in turn
for i = 0 to length(k)-1
if heap.count < b
heap.push(arr[i])
else if (arr[i] < heap.peek())
heap.pop()
heap.push(arr[i])
Идея состоит в том, что вы заполняете максимальную кучу первыми b элементами.Затем для каждого другого элемента, если он меньше самого большого элемента в куче, вы удаляете самый большой элемент в куче с новым элементом.
Когда вы обработали все км предметов, самые маленькие b предметов находятся в куче, и, поскольку это максимальная куча, первые ba предметов, которые вы выберете, будут a th через b th элементов во всех k массивах.
// all items have been processed, take the first *b - a* items from the max heap
for i = 0 to (b-a-1)
result[i] = heap.pop()
Наихудший случай - O (km log b) для первого цикла и O (b log b) длявторой цикл, использующий O (b) дополнительную память.
Если вам разрешено уничтожать исходные массивы, вы можете написать собственный быстрый выбор, который индексирует массивы k как один массив,Это будет O (км) с использованием O (k) дополнительной памяти для косвенного индекса.Недостатком является то, что код индексации будет несколько медленнее.И, конечно же, эти элементы будут перемещаться между массивами.И вам, вероятно, понадобится O (b) дополнительная память для возвращаемого значения.Асимптотически это более эффективно, чем мой первоначальный выбор.Будет ли он работать быстрее - это совсем другой вопрос.
Еще одна возможность.Запустите метод build-heap для каждого из массивов k .Это было бы О (км).Затем выполните объединение, чтобы выбрать первые b элементов.Для слияния потребуется:
- O (log m) для удаления каждого элемента из исходных массивов
- O (log b) для добавления каждого элемента в кучу слияния
- O (log b), чтобы удалить каждый элемент из кучи слияния
Вторым шагом будет O (b * (log m + log b + log b)).
Это дает всего O (км + b * (log m + log b + log b)), и вы будете использовать O (b) дополнительную память.Будет ли это быстрее, чем оригинальное предложение, сомнительно.Это зависит от отношений между b и m .Чем больше значение b , тем меньше вероятность, что оно будет быстрее.И код гораздо сложнее написать.