Код Junior Эмбеддинги и векторный поиск спрашивают часто обновлено

Top-k ближайших по косинусу

Условие

Напишите top_k(query, docs, k): docs это список векторов. Верните индексы k документов с наибольшим косинусным сходством с query по убыванию сходства; при равенстве сходства меньший индекс раньше. Сравнивайте сходства, округлённые до 9 знаков, чтобы шум float не ломал порядок. Нулевые векторы имеют сходство 0. Если документов меньше k, верните все.

Примеры

top_k([1, 0], [[1, 0], [0, 1], [1, 1]], 2) // [0, 2]
top_k([1, 0], [[0, 1], [-1, 0]], 5) // [0, 1]
top_k([1, 1], [[2, 2], [1, 1], [3, 3]], 2) // [0, 1]

Как подойти

Подсказки: 1
  1. Сортируйте пары (-сходство, индекс).

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.