Sobes.tech
Intern

Γράψτε έναν κώδικα σε Python που υπολογίζει το εσωτερικό γινόμενο δύο διανυσμάτων που έχουν συμπιεστεί με RLE σε μια μόνο διαδρομή.

sobes.tech AI

Απάντηση από 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)) # Выводит скалярное произведение