В общем, я думаю, что у вас проблемы. Представьте себе следующие списки:
['a':100, 'b':99, ...]
['c':90, 'd':89, ..., 'b':2]
и у вас есть k = 1 (т.е. вы хотите только верхний). «b» - правильный ответ, но вам нужно посмотреть до конца второго списка, чтобы понять, что «b» превосходит «a».
Edit:
Если у вас правильное распределение (длинные хвосты с небольшим количеством), вы можете добиться большего успеха. Давайте пока держим k = 1, чтобы облегчить нашу жизнь.
Основной алгоритм - хранить хэш-карту ключей, которые вы видели до сих пор, и их итоговых значений. Пройдите по списку элементов обработки и обновления вашей карты.
Ключевым наблюдением является то, что ключ может получить в счет не более суммы сумм в текущей точке обработки каждого списка (назовите эту сумму S). Таким образом, на каждом шаге вы можете удалить из своей хеш-карты любые ключи, сумма которых на S больше, чем ваш текущий элемент максимального количества. (Я не уверен, какую структуру данных вам нужно будет обрезать, поскольку вам нужно искать ключи с учетом диапазона значений - может быть, очередь с приоритетами?)
Когда в вашей хэш-карте содержится только один элемент, а его количество не менее S, вы можете прекратить обработку списков и вернуть этот элемент в качестве ответа. Если ваше распределение подсчетов работает нормально, это раннее завершение может фактически сработать, поэтому вам не нужно обрабатывать все списки.