【发布时间】:2017-01-10 09:38:02
【问题描述】:
我有一系列段,它们最多在它们的末端相互交叉。我想将这些线段合并成折线。
在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
但是第二个循环显然是二次的,所以我想知道是否有更好的算法来合并/加入/组合一系列片段。
【问题讨论】:
-
为什么要避免创建数据结构?我会创建一个分段端点的地图,以检测是否有多个分段在大约 O(n) 时间内共享一个端点。
-
A related post 建议计算端点的哈希值以加快搜索速度。
-
@MrSmith42 我处理 O(10) 段的顺序,所以除非我在堆栈上创建地图,否则创建动态地图的成本可能会超过最终 O(N) 的成本^2) 循环。这就是为什么我对没有额外数据结构的更好算法感兴趣的原因。我将尝试使用堆栈上的地图并对其进行基准测试。感谢您的建议。
标签: algorithm geometry spatial polyline segment