半平面交的定义和解法

通过海量题库、编程比赛和实时排名,系统化提升您的编程能力。

一、定义

半平面交是什么?

我们知道一条直线可以把平面分为两部分,其中一半的平面就叫半平面。那半平面交,就是多个半平面的相交部分。我们在学习线性规划时就有用过。

(1)半平面

一条直线和直线的一侧。半平面是一个点集,因此是一条直线和直线的一侧构成的点集。当包含直线时,称为闭半平面;当不包含直线时,称为开半平面。

解析式一般为。

在计算几何中用向量表示,整个题统一以向量的左侧或右侧为半平面。

(2)半平面交

半平面交是指多个半平面的交集。因为半平面是点集,所以点集的交集仍然是点集。在平面直角坐标系围成一个区域。

这就很像普通的线性规划问题了,得到的半平面交就是线性规划中的可行域。一般情况下半平面交是有限的,经常考察面积等问题的解决。

它可以理解为向量集中每一个向量的右侧的交,或者是下面方程组的解。

多边形的核

如果一个点集中的点与多边形上任意一点的连线与多边形没有其他交点,那么这个点集被称为多边形的核。

把多边形的每条边看成是首尾相连的向量,那么这些向量在多边形内部方向的半平面交就是多边形的核。

二、解法

1. 极角排序

C 语言有一个库函数叫做 atan2(double y,double x),可以返回。

直接以向量为自变量,调用这个函数,以返回值为关键字排序,得到新的边(向量)集。

排序时,如果遇到共线向量(且方向相同),则取靠近可行域的一个。比如两个向量的极角相同,而我们要的是向量的左侧半平面,那么我们只需要保留左侧的向量。判断方法是取其中一个向量的起点或终点与另一个比较,检查是在左边还是在右边。

2. 维护单调队列

因为半平面交是一个凸多边形,所以需要维护一个凸壳。因为后来加入的只可能会影响最开始加入的或最后加入的边(此时凸壳连通),只需要删除队首和队尾的元素,所以需要用单调队列。

我们遍历排好序了的向量,并维护另一个交点数组。当单队中元素超过 2 个时,他们之间就会产生交点。

对于当前向量,如果上一个交点在这条向量表示的半平面交的异侧,那么上一条边就没有意义了。

如上图,假设取向量左侧半平面。极角排序后,遍历顺序应该是→→。当和入队时,在交点数组里会产生一个点D(交点数组保存队列中相同下标的向量与前一向量的交点)。

接下来枚举到时,发现D在的右侧。而因为产生D的向量的极角一定比要小,所以产生D的向量(指)就对半平面交没有影响了。

还有一种可能的情况是快结束的时候,新加入的向量会从队首开始造成影响。

仍然假设取向量左侧半平面。加入向量之后,第一个交点G就在的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量,也即队首的向量。

最后用队首的向量排除一下队尾多余的向量。因为队首的向量会被后面的约束,而队尾的向量不会。此时它们围成了一个环,因此队首的向量就可以约束队尾的向量。

3. 得到半平面交

如果半平面交是一个凸 n 边形,最后在交点数组里会得到 n 个点。我们再把它们首尾相连,就是一个统一方向(顺或逆时针)的 n 多边形。

此时就可以用三角剖分求面积了。(求面积是最基础的考法)

偶尔会出现半平面交不存在或面积为 0 的情况,注意考虑边界。

三、 求解半平面交的步骤(S&I算法 O(nlogn))

我们试着来解决“求解一个区域,可以看到给定图形的各个角落。”为了叙述方便,我们把这个区域叫做多边形的核。

1. 选取一个正方向。(一般为逆时针)

我们用这个一个不规则图形举例子。

首先我们选逆时针方向做为有向线段。

这样选取的好处是,保证核在有向线段的左边。

2. 把有向线段通过极角排序(与 x 轴的夹角)(-180°,180°]

排序结果如下所示。

按照极角排序的原因是写代码方便,排序之后的线段是有序的,可以在双端队列里进行操作。(下面会再解释)。

3. 按顺序遍历每条线段,取左边区域,删右边区域

我们用这个S&I算法求解半平面交时,用的是删减法,首先我们假设全部平面都是半平面交,然后不断加入直线,不断删去右边区域,保留左边区域。最后剩下的区域就是需要求的半平面交。

(1)全部平面都是半平面交。

(2)加入第一条直线,保留左边区域,删除右边区域。

(3)加入第二条线段,保留左边区域,删除右边区域。

(4)依次加入3 - 10线段,保留左边区域,删除右边区域。

(5)加入最后一条线段,保留左边区域,删除右边区域。

(6)剩下的蓝色部分,就是多边形的和,也就是所有直线的半平面交,在蓝色区域的任何一点,都可以看到多边形的每一个角落。

(7)这时我们得到的是围成这个蓝色区域的直线集合。

L={2,5,7,9,11} ,如果至少有三条边,就说明该多边形有核(三条以上时,核为全部直线围成的凸包。)如果要求面积,我们可以将直线的交点求出来,然后再用叉积求凸包面积。

4. 如果题目要求求面积。

我们可以发现求出来的直线的集合是有序的L={2,5,7,9,11},这些直线刚好是逆时针围着这个半平面交。(这就是按极角排序的好处)。如果要求面积,我们可以把所有L[i] 和L[i+1] 的交点求出来,然后用叉乘求凸包面积。

5. 总结

总体而言,求半平面交其实就是维护线段的集合 L,遍历每一条线段,判断这条线段加入后对于半平面交的影响,然后在集合 L 中剔除掉对半平面交没有决定作用的边,留下起决定作用的边。即最终目的是维护半平面交的线段集合 L。

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

THE END
0.NOI大纲文字收藏版3. 排序算法 ·【5】归并排序 ·【5】快速排序 ·【6】堆排序 ·【6】树形选择排序(锦标赛排序) ·【5】桶排序 ·【6】基数排序 4. 字符串相关算法 ·【5】字符串匹配算法——KMP 5. 搜索算法 ·【6】搜索的剪枝优化 ·【6】记忆化搜索 ·【7】启发式搜索 ·【7】双向宽度优先搜索 ·【7】迭代jvzq<84yyy4489iqe0ipo8hqpvkov87312?1385217927h>;57=549:0ujznn
1.数据结构之树形选择排序(锦标赛排序)锦标赛排序也叫树形选择排序,是一种按照锦标赛的思想进行选择的排序方法,该方法是在简单选择排序方法上的改进。简单选择排序,花费的时间大部分都浪费在值的比较上面,而锦标赛排序刚好用树保存了前面比较的结果,下一次比较时直接利用前面比较的结果,这样就大大减少比较的时间,从而降低了时间复杂度,由O(n^2)降到O(jvzquC41dnuh0lxfp0tfv8qkjcu28::525:11jwvkerf1mjvckrt1@=;5::15
2.漫画:什么是“锦标赛排序”?漫画:什么是 “锦标赛排序” ? [导读]你了解选择排序吗? ——— 第二天 ——— ——— 如图中所示,我们把原本的冠军选手5排除掉,在四分之一决赛和他同一组的选手6就自然获得了直接晋级。 接下来的半决赛,选手7打败选手6晋级;在总决赛,选手7打败选手3晋级,成为了新的冠军。 因此我们可以判断出,选手7是总jvzquC41yy}/4:ne0eun1jwvkerf1A=:93?/j}rn
3.漫画:什么是“锦标赛排序”?接下来的半决赛,选手7打败选手6晋级;在总决赛,选手7打败选手3晋级,成为了新的冠军。 因此我们可以判断出,选手7是总体上的亚军。 假如给定如下数组,要求从小到大进行升序排列: 第一步,我们根据数组建立一颗满二叉树,用于进行“锦标赛式”的多层次比较。数组元素位于二叉树的叶子结点,元素数量不足时,用空结点补齐。jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1B5655:
4.快速排序本页面将简要介绍快速排序。定义 快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。基本原理与实现 过程 快速排序的工作原理是通过 分治 的方式来将一个数组排序。快速排序分为三个过程:将jvzq<84qk/}jmr3eqo5cc|ne1s{jet2uqtz0
5.14.8树形选择排序·LeetCode算法练习个人总结(Java)·看云14.8 树形选择排序(堆排序前身) 基本概念: 树形选择排序(Tree Selection Sort),又称锦标赛排序(Tournament Sort),也可以算得上堆排序的前身,是一种按照锦标赛思想进行选择排序的方法。它是根据节点的大小, 建立树, 输出树的根节点, 并把此重置为最大值, 再重构树,因为树中保留了一些比较的逻辑, 所以减少了jvzquC41yy}/mjsenq{e0ls1ocrjorsi1nkfvltfg1=54B:3
6.希尔排序,⌊log2⁡n⌋}(从大到小),则希尔排序算法的时间复杂度为 𝑂(𝑛3/2)O(n3/2)。 命题2 若间距序列为 𝐻 ={𝑘 =2𝑝 ⋅3𝑞 ∣𝑝,𝑞 ∈ℕ,𝑘 ≤𝑛}H={k=2p⋅3q∣p,q∈N,k≤n}(从大到小),则希尔排序算法的时间复杂度为 𝑂(𝑛log2⁡𝑛)O(nlog2⁡n)。jvzquC41qk3xktn0qtm0djxke1yiguq/uqxu1
7.数据结构求答案单选题第1题(2)分排序趟数与序列的原始状态有时间复杂性为O(nlog2n)且空间复杂性为O(1)的排序方法是( )。 A、归并排序 B、堆排序 C、快速排序 D、锦标赛排序 第15题 (2) 分 要将现实生活中的数据转化为计算机所能表示的形式,其转化过程依次为( )。 A、逻辑结构、存储结构、机外表示 B、存储结构、逻辑结构、机外表示 C、机外表示、逻辑结构、存储结构 DjvzquC41yy}/|‚gcpi4dqv4swgyukxs1::9fhj89d3jg9kf:3d:9h=fhc5?9d;=f0jznn
8.中国石油大学数据结构试题及答案C 锦标赛排序 D 快速排序 6、设有两个串t和p,求p在t中首次出现的位置的运算叫做()。 A 求子串 B 模式匹配 C 串替换D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储字数是()jvzquC41o0972mteu0tfv8iqe1>43<>7;7<70qyon
9.经典排序算法详解对象的移动次数不超过关键码的比较次数,所以锦标赛排序总的时间复杂度为O(nlog2n)。 多了附加存储。如果有 n 个对象,必须使用至少 2n-1 个结点来存放胜者树。 稳定 6、堆排 堆排序分为两个步骤:第一步,根据初始输入数据,利用堆的调整算法 FilterDown( ) 形成初始堆,第二步,通过一系列的对象交换和重新调jvzquC41dnuh0lxfp0tfv8~wejkoiuncpanbry~1ctzjeuj1fgzbkux174945@=9
10.Python选择排序中的树形选择排序python选择排序里面主要讲了三个排序,分别是简单选择排序、树形选择排序、堆排序。今天这篇文章主要讲树形选择排序,树形选择排序也被称为锦标赛排序,树形选择排序运用了锦标赛的思想进行排序,树形选择排序是指首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进行两两比较,如此重复,直至选出最小的记录为止。jvzquC41yy}/lk:30pku1jwvkerf1;7;72?/j}r