Самая длинная арифметическая прогрессия набора чисел {ab 1 , ab 2 , ab 3 .... ab n } определяется как подмножество {bb 1 , bb 2 , bb 3 .... bb n }, такое что b i + 1 - b i постоянно.
Я хотел бы распространить эту задачу на набор двумерных точек, лежащих на прямой линии.Определим Dist (P 1 , P 2 ) - расстояние между двумя точками P 1 (X 1 , Y 1 ) и P 2 (X 2 , Y 2 ) на линии как
Dist (P 1, P 2 ) = Dist ((X 1 , Y 1 ), (X 2 , Y 2 )) = (X 2 - X 1 ) 2 + (Y 2 - Y 1 )) 2
Теперь Для заданного набора точек мне нужно найти наибольшую арифметическую прогрессию такую, что Dist (P i , P i+ 1 ) является константой, если предположить, что все они лежат на одной строке (константы m & C).
Я немного исследовал, но не смог выяснить алгоритм, который лучше, чем O (n 2 ).
На самом деле в настоящее время я веду словарь:
DistDict=dict()
и говорю, что точки определены в списке как
Points = [(X1,Y1),(X2,Y2),....]
тогда это то, что я делаю
for i,pi in enumerate(Points):
for pj in Points[i+1:]:
DistDict.setdefault(dist(pi,pj),set([])).add((pi,pj))
, так что все, что я закончил, получило словарь точек wкоторые находятся на одинаковом расстоянии.Поэтому единственное, что мне нужно сделать, - это просмотреть, чтобы найти самые длинные set
.
Мне просто интересно, что это должно иметь лучшее решение, но почему-то я не могу найти одно.Я также видел пару похожих постов SO, но я не могу найти что-то более эффективное, чем O (n 2 ).Является ли это каким-то образом трудной проблемой NP, что у нас никогда не может быть чего-то лучшего, или, если нет, какой подход может быть принят.Обратите внимание, что я наткнулся на сообщение, в котором говорится об эффективном алгоритме «разделяй и властвуй» , но не смог сделать из этого ни головы, ни хвоста.
Любая помощь в этом отношении?
Примечание *** Я помечаю этот Python, потому что я понимаю Python лучше, чем, возможно, Matlab или Ruby.C / C ++ / Java тоже хорошо, так как я тоже немного разбираюсь в них: -)