问题描述
生成代表一组线段中最小值的线段集的最有效算法是什么?(见图片)
生成的线段应具有以下属性:
- 请勿重叠
- 每个细分都必须位于原始集合的一个细分之内
- 原始集的任何部分上的任何点都不能落在其下
解决方法
看起来像是扫掠线算法的不错选择。
创建一个段端点列表,并用一个开始/结束标志以及对该段的引用对其进行标记。通过增加横坐标对列表进行排序。
现在,当您维护有效的细分列表时,请从左至右扫描列表。任何“开始”点都会在列表中创建一个段条目,而“结束”点则将其丢弃。在任何时候,活动列表都将包含之前和当前“事件”点之间重叠配置的细分的子集。
通过插值,评估这些端点处的坐标并对其进行垂直排序。这可以让您
- 检测相交(对应于垂直列表中的重新排序)
- 找到最低的纵坐标。
最后,您将必须从左到右对交点进行排序,最后,您将获得一个不相交且垂直方向按总顺序排列的子段列表。