补充知识:向量叉积,向量P = (x1, y1); Q = (x2, y2); P×Q = (x1*y2 - x2*y1);
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
叉积的方向与进行叉积的两个向量都垂直,所以叉积向量即为这两个向量构成平面的法向量。
我们来考虑题目,假设凸多边形各个定点坐标按照逆时针方向存储于一个数组中,那么可以通过计算0-i与0-P两个向量之间的左右关系确定点P于某两个相邻的顶点构成的向量之间,如O-x与o-(x-1),然后看是否(x-1)-p向量位于(x-1)-x向量的逆时针方向,如果是顺时针方向则不在凸多边形内。
double multiply(Point& p1, Point& p2, Point& p0) { return (p1.x - p0.x) * (p2.y - p0.y)*1.0 - (p1.y - p0.y) * (p2.x - p0.x)*1.0; } bool inConvexPolygon(vector<Point> Polygon, Point target) { int len = Polygon.size(); if (multiply(target, Polygon[1], Polygon[0]) > 0 && multiply(target, Polygon[len - 1], Polygon[0]) < 0) { return false; } int s = 1, e = len -1; int line = -1; while (s <= e) { int m = s + ((e-s) >> 1); if (multiply(target, Polygon[m], Polygon[0]) > 0) { // target在m顺时针方向 line = m; // line保存的是m逆时针方向后的第一个点 e = m -1; } else { // target在m逆时针方向 s = m + 1; } } return multiply(Polygon[line], target, Polygon[line -1]) > 0; }
相关推荐
在实际编程中,掌握这些O(logN)时间复杂度的算法对于优化程序性能至关重要,特别是在处理大数据量时。例如,折半查找常用于数据库索引、二分图的判断等问题;欧几里得算法在数论和加密算法中广泛应用;而快速幂运算...
压缩包内的"O(logN)重口味排序.txt"可能详细阐述了一种特定的O(logN)排序算法,包括其工作原理、实现步骤、优缺点以及可能的优化技巧。为了获取更具体的信息,你需要打开这个文件进行阅读。这些算法在实际应用中,...
撸一个std::lower_bound,不断优化,直到最坏复杂度也为O(logN) 什么是LRU缓存,怎么实现 实现二叉树的层序遍历再按层输出 实现 怎么实现线程池 实现一个二叉树的持久化方案,可以伪代码,必须用指针 编程实现单例...
- 对于不含孔的简单多边形,最小凸多边形分区问题可以在O(n^3)时间内解决。 - 当多边形含有孔时,该问题是NP难的。 #### 五、研究方法及技术 - **无Steiner顶点的分割**:这一变体考虑不引入额外顶点的分割方法。...
传统的线裁剪方法通常需要对多边形的每条边进行检测,以判断是否与被裁剪线所在的直线相交,这种方法的时间复杂度为O(n),其中n为多边形边的数量。然而,在实际应用中,被裁剪线往往只与多边形的一小部分边相交,...
- **判断点 Q 是否在多边形内**:判断一个点是否位于一个多边形内部。 - **计算多边形的面积**:计算多边形的面积。 - **解二次方程 AX^2+BX+C=0**:求解一般形式的二次方程。 - **计算直线的一般式 AX+BY+C=0**:...
| _O(n)_ ~ _O(n^2)_ | _O(n)_ | Medium || Bit Manipulation, Counting Sort, Pruning| 342 | [Power of Four](https://leetcode.com/problems/power-of-four/) | [C++](./C++/power-of-four.cpp) [Python](./...
### 谷歌笔试题2010知识点详解 #### 一、判断一个自然数是否是某个数的平方 **题目描述**: 不使用开方运算来判断一个自然数是否为另一个数的平方。 **解决方案**: 1. **方法1**: - 遍历从1到N的所有数字,...
2-4 和2-5 分别展示了不同的时间复杂度,虽然2-5的算法在特定边界条件下具有O(√n)的时间复杂度,但通常用于素数判断的是O(√n)。 2-6 和2-7 强调了数据结构的分类和算法分析的两个主要方面。数据结构分为线性结构...
如此递归下去,最多只需要O(logn)次乘法操作,大大提高了效率。 在Java中,快速幂算法的实现通常涉及递归或迭代。以下是一个简单的迭代版本: ```java public static long fastPower(int base, int exponent) { ...
在进行链表结构开发的过程之中会发现所有的数据按照首尾相连的状态进行保存,那么当要进行某一个数据查询的时候(判断该数据是否存在),这种情况下它所面对的时间复杂度是”O(n)”。 如果说现在它的数据量小(不...
**方法1 - 正方形筛选法**: 在[-1,1]×[-1,1]的正方形内随机选择点,检查其是否位于半径为1的圆内。平均而言,需要(pi/4)次尝试才能成功,因为圆面积占正方形面积的比例为pi/4。 **方法2 - 角度与距离法**: 首先...
2. 算法复杂度分析:分为时间复杂度和空间复杂度,常见的时间复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)、O(2n)、O(n!)、O(nn)等。 第二章 穷举法和递推法 1. 穷举法:枚举所有可能的解,并选择其中的...
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作; 3.递归地...
### ACM/ICPC算法大全(C语言)知识点概览 #### 图论(Graph Theory) - **DAG的深度优先搜索标记** - DAG(有向无环图)中的深度优先搜索(Depth-First Search, DFS)是一种重要的遍历算法,用于检测图中的环、计算...
1. BFS、DFS的复杂度可能不是O(N+E),因为 BFS、DFS 在遍历图或树时需要考虑图或树的结构,可能需要更多的时间。 2. PFS 每次调用 priorUpdata(),总复杂度 O(n),因为 PFS 需要对所有节点进行更新。 3. Floyd 建堆...
- **凸多边形三角剖分**:对于n个顶点的凸多边形,共有n-3条弦,n-2个三角形。 #### 第五章 回溯法 - **搜索方法**: - **广度优先搜索**:确保找到解但消耗资源较多。 - **深度优先搜索**:节省资源但可能找不...
在本项目中,我们将探讨如何使用O(LogN)的时间复杂度来实现PriorityQueue,并理解其内部工作原理。 首先,PriorityQueue的插入操作(add()或offer())和删除操作(remove()或poll())都具有O(LogN)的时间复杂度。这...
对于凸包的大小,如果在有限域A中随机选择n个点,期望大小取决于A的形状:在圆盘中为O(n),在二维k凸多边形中为O(k log n),而在各边平行于坐标轴的d维超立方体中为O(logn)^(1/3)d^(1/3)。 求解凸包的算法有多种,...
- 在O(logn)时间内找到最大值所在位置k,可以使用二分查找策略,先找到中点,比较中点前后区间的单调性来缩小范围。 - 算法正确性可以通过归纳法证明,即每次都能正确找到新的边界,直到找到最大值。 - 时间...