Hashmap - это хорошо, но это может занять много памяти.
Если ваши векторы хранятся в виде пар ключ-значение, отсортированных по ключу, векторное умножение можно выполнить в O (n): вы простодля параллельной итерации по обоим векторам (такая же итерация используется, например, в алгоритме сортировки слиянием).Псевдокод для умножения:
i = 0
j = 0
result = 0
while i < length(vec1) && j < length(vec2):
if vec1[i].key == vec2[j].key:
result = result + vec1[i].value * vec2[j].value
else if vec1[i].key < vec2[j].key:
i = i + 1
else
j = j + 1