Sobes.tech
Intern
20

Напиши код на Python, реализующий вычисление скалярного произведения двух RLE-сжатых векторов за один проход.

Companies where asked
Яндекс

Answer from AI

sobes.tech AI

python

Функция для вычисления скалярного произведения двух RLE-сжатых векторов за один проход

Каждый вектор представлен списком кортежей (значение, количество)

def rle_dot_product(rle_vec1, rle_vec2): i, j = 0, 0 result = 0 count1, count2 = 0, 0

while i < len(rle_vec1) and j < len(rle_vec2):
    val1, len1 = rle_vec1[i]
    val2, len2 = rle_vec2[j]

    # Определяем минимальное количество для текущих блоков
    min_count = min(len1 - count1, len2 - count2)

    # Добавляем произведение значений, умноженное на количество совпадающих элементов
    result += val1 * val2 * min_count

    # Обновляем счетчики
    count1 += min_count
    count2 += min_count

    # Если достигли конца блока в первом векторе, переходим к следующему
    if count1 == len1:
        i += 1
        count1 = 0

    # Если достигли конца блока во втором векторе, переходим к следующему
    if count2 == len2:
        j += 1
        count2 = 0

return result

Пример использования

vec1 = [(1, 3), (2, 2), (0, 4)] # соответствует [1,1,1,2,2,0,0,0,0] vec2 = [(0, 2), (3, 3), (2, 4)] # соответствует [0,0,3,3,3,2,2,2,2]

print(rle_dot_product(vec1, vec2)) # Выводит скалярное произведение