Если компоненты ваших векторов являются скалярами, я бы предположил, что для вашего случая умеренного k = 500 подход O (n²), вероятно, настолько быстр, насколько вы можете получить. Вы можете упростить свой расчет, уменьшив расстояние². Кроме того, расстояние (A_i, B_i) = расстояние (B_i, A_i), поэтому убедитесь, что вы сравниваете их только один раз (у вас есть только 500! / (500-2)! Пар, а не 500²).
Если компоненты являются m-мерными векторами A и B, вы можете сохранить компоненты вектора A в R-дереве или kd-дереве , а затем найти ближайшую пару, перебирая все компоненты вектора B и находя ближайшего партнера из A --- это будет O (n). Не забывайте, что big-O предназначен для n-> бесконечности, поэтому деревья могут иметь довольно дорогой постоянный член (то есть такой подход может иметь смысл только для больших k или если вектор A всегда одинаков).