Вы можете использовать кучу:
import heapq
def smallest_product(k, a, b):
k = min(k, len(a) * len(b))
l = [(a[0] + b[0], 0, 0)]
heapq.heapify(l)
seen = set()
for _ in range(k):
s, i, j = heapq.heappop(l)
if i + 1 < len(a) and (i + 1, j) not in seen:
heapq.heappush(l, (a[i + 1] + b[j], i + 1, j))
seen.add((i + 1, j))
if j + 1 < len(b) and (i, j + 1) not in seen:
heapq.heappush(l, (a[i] + b[j + 1], i, j + 1))
seen.add((i, j + 1))
yield (a[i], b[j])
result = list(smallest_product(10, [ 2, 12, 45, 85, 87, 98], [ 8, 18, 35, 48, 49, 59]))
print(result)
Вывод
[(2, 8), (2, 18), (12, 8), (12, 18), (2, 35), (12, 35), (2, 48), (2, 49), (45, 8), (12, 48)]
Приведенный выше код является переводом Python с кода в здесь . Этот метод имеет временную сложность O(k*log k)
.
Выход (Для k = 11)
[(2, 8), (2, 18), (12, 8), (12, 18), (2, 35), (12, 35), (2, 48), (2, 49), (45, 8), (12, 48), (2, 59)]