У меня скоро появится интересная проблема, и я начал думать об алгоритме. Чем больше я думаю об этом, тем больше я боюсь, потому что я думаю, что это будет ужасно масштабироваться (O (n ^ 4)), если я не смогу стать умным. У меня проблемы с умением об этом. Вот упрощенное описание проблемы.
У меня есть N полигонов (где N может быть огромным> 10 000 000), которые хранятся в виде списка из M вершин (где M порядка 100). Что мне нужно сделать, так это создать для каждого полигона список любых вершин, которые совместно используются другими полигонами (представьте, что полигоны являются окружающими интересующими областями, иногда областями, но сталкиваются друг с другом). Я вижу что-то вроде этого
Polygon i | Vertex | Polygon j | Vertex
1 1 2 2
1 2 2 3
1 5 3 1
1 6 3 2
1 7 3 3
Это означает, что вершина 1 в многоугольнике 1 - это та же точка, что и вершина 2 в многоугольнике 2, а вершина 2 в многоугольнике 1 - это та же точка, что и вершина 3 в многоугольнике 2. Аналогично, вершина 5 в многоугольнике 1 совпадает с вершиной. 1 в многоугольнике 3 ....
Для простоты мы можем предположить, что многоугольники никогда не перекрываются, самое близкое, что они получают, касается края, и что все вершины являются целыми числами (чтобы было легко проверить равенство).
Единственное, что я могу сейчас сделать, это то, что для каждого многоугольника я должен перебрать все многоугольники и вершины, давая мне масштабирование O (N ^ 2 * M ^ 2), что будет очень плохо в мое дело. У меня могут быть очень большие файлы полигонов, поэтому я даже не могу сохранить все это в ОЗУ, так что это будет означать многократное чтение файла.
Вот мой псевдокод до сих пор
for i=1 to N
Pi=Polygon(i)
for j = i+1 to N
Pj=Polygon(j)
for ii=1 to Pi.VertexCount()
Vi=Pi.Vertex(ii)
for jj=1 to Pj.VertexCount()
Vj=Pj.Vertex(jj)
if (Vi==Vj) AddToList(i,ii,j,jj)
end for
end for
end for
end for
Я предполагаю, что это произошло в графическом сообществе (я не провожу там много времени, поэтому я не знаю литературы). Есть идеи?