У меня есть ряд сегментов, которые не более чем пересекаются друг с другом на концах. Я хочу объединить эти сегменты в полилинии.
Есть ли алгоритм, который делает это в O(N_segments)
без использования дополнительного хранилища (например, без необходимости строить дерево или какую-либо другую пространственную структуру данных для точек сегмента и работать над этим)?
Количество сегментов у меня невелико, O (10). Таким образом, размещение их в динамической структуре данных, такой как хеш-таблица или карта (красно-черное дерево), вероятно, будет дороже, чем цикл O(N^2)
в конце, если я не помещу эту структуру данных в стек и не буду избегать выделения памяти. (Используемые мною полилинии реализованы с использованием small_vector
, что позволяет избежать выделения, пока количество точек достаточно мало.
В настоящее время я придумал это:
polylines = []
// 1. Append each segment to a range of polylines, merging when possible:
for each segment in segments:
for each polyline in polylines:
merge_result = merge(segment, polyline)
if (not merge_result) continue
polyline = merge_result
goto done
// either polylines empty or no merge possible
polylines.append(segment)
done:
continue
// 2. Try to merge the polylines among themselves until no more merges are possible
// Pure brute force, quadratic
done = false
while not done:
for p1 in polylines:
for p2 in polylines[p1..end]:
merge_result = merge(p1, p2)
if not merge: continue
p1 = merge_result
polylines.remove(p2)
done = false
goto restart
restart: continue
Но второй цикл явно квадратичный, поэтому мне интересно, есть ли лучший алгоритм для слияния / соединения / объединения последовательности сегментов между собой.