Таким образом, решение грубой силы может выглядеть следующим образом: ex [x, y, z, l, m ...] вычислять каждое парное расстояние ровно один раз x: (точки -x) y: (точки -x -y ) z: (points -x -y -z) et c ...
def calculate_distances(points)
tocalc = points
answers = dict()
for point in points:
for dot in tocalc:
if point!=dot: # distance to itself is always 0
answers[sorted([point,dot])] = distance(point,dot)
tocalc.pop(0) #no need to process this item again
return answers
Затем вы можете делать такие вещи, как sum(answers.values())
, 'sorted (ответы, ключ = лямбда k: k. value) `, et c.
Из вышесказанного ясно, что нам фактически не нужен второй список для управления вычисляемым, нам просто нужны два индекса, поэтому давайте попробуем сделать это с минимальным объем памяти:
def calculate_distances(points):
currind=0
tocalc_ind = 1
# we also know the answer looks like a matrix with diagonal of zeros...
answers = dict()
for p_ind in range(len(points)):
currind = p_ind
if points[currind] not in answers:
answers[points[currind]] = dict()
for c_ind in range(tocalc_ind,len(points)): # implicitly skipping previous
answers[points[currind]][points[c_ind]] = distance(points[currind],points[c_ind])
return answers
Обратите внимание, что я изменил формат данных, чтобы помочь визуализировать ответ. Я уверен, что есть другие оптимизации, но они должны выполняться за O (n) время, потому что второй вложенный l oop обычного O (n * n) уменьшается каждый ход.