Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.
[имя] спросил: реализуй скалярное произведение двух векторов в RLE-представлении, не распаковывая и не сохраняя исходные векторы целиком в памяти.
Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.
Пусть серия имеет формат (значение, положительная_длина); полные длины векторов должны совпадать.
def dot_rle(left, right):
left, right = iter(left), iter(right)
a, b = next(left, None), next(right, None)
total = 0
while a is not None and b is not None:
x, nx = a
y, ny = b
if nx <= 0 or ny <= 0:
raise ValueError('Длины серий должны быть положительными')
size = min(nx, ny)
total += x * y * size
a = next(left, None) if nx == size else (x, nx - size)
b = next(right, None) if ny == size else (y, ny - size)
if a is not None or b is not None:
raise ValueError('Разные длины векторов')
return total
Для m и n серий время O(m+n), дополнительная память O(1). Входные длины предполагаются целыми; в API этот контракт валидируют отдельно.