我正试图解决这个问题,但我仍然坚持如何使这项工作。我将发布问题,然后解释我在哪里。
给定一组水平线段和总大小为n的垂直线,我们想要计算每条垂直线相交的水平线段的数量。算法应该具有复杂度O(n * logn),并且应该通过排序,然后进行线性扫描来实现。水平线段由两个x坐标和y坐标指定,而垂直线由单个x坐标指定。输出是一个数字count [l]的数组,每个垂直线l。
对于排序,我认为我会排序整行最早的行(即最小的第二个x坐标,或者在垂直线的情况下,只是它的一个x坐标),这样我就有了通过所有线条的线性进展。我很困惑应该如何播放排序后的线性扫描。如果有人有任何提示,技巧或指导方针,我将不胜感激!
PS:这是中期的练习,所以虽然不一定是家庭作业,但我仍然会这样做。答案 0 :(得分:0)
问题可以写成:
Foreach水平线段(x1,x2),找到与其相交的所有垂直线。您可以通过对垂直线进行排序获得一组位置x来实现。
现在,运行二进制搜索并在x的集合中定位x1,让我们调用它的位置p1。对x2,p2执行相同操作。给定段的交叉数等于p2-p1。
对所有水平部分都这样做。
对垂直线段进行排序将采用O(klog(k))。每次搜索都在O(log(k))中完成,每个段完成两次:O(mlog(k))。其中k是垂直线的数量,m是水平线段的数量。 n = m + k> m,k因此,整体复杂度为O(nlogn)。
答案 1 :(得分:0)
首先放置水平线段的所有起点/终点。和垂直线的x坐标一起。
其次,对它们进行排序。让我们调用排序列表L
。
第三,成像有一条垂直扫描线,从最左边的点列表L
开始,向右移动。
每当扫描线到达某个点时,它就是水平线段的起点,或水平线段的终点或垂直线。
移动扫描线时可以做两件事:
1)保持扫描线当前相交的水平线段组(只要它是水平线段的起点/终点,在集合中添加/删除它)
2)每当它是一条垂直线时,你知道垂直线与你所维持的集合中的所有水平线段相交1)
所以,排序是O(nlogn);通过排序列表L
移动扫描线是O(n)
总而言之,它是O(nlogn)