`

Google Interview - 判断点是否在凸多边形内的O(logn)解法

 
阅读更多

补充知识:向量叉积,向量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向量的逆时针方向,如果是顺时针方向则不在凸多边形内。

polygon

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)时间复杂度的算法对于优化程序性能至关重要,特别是在处理大数据量时。例如,折半查找常用于数据库索引、二分图的判断等问题;欧几里得算法在数论和加密算法中广泛应用;而快速幂运算...

    O(logN)sort.zip_logn的排序

    压缩包内的"O(logN)重口味排序.txt"可能详细阐述了一种特定的O(logN)排序算法,包括其工作原理、实现步骤、优缺点以及可能的优化技巧。为了获取更具体的信息,你需要打开这个文件进行阅读。这些算法在实际应用中,...

    javalruleetcode-interview-question-collection:面试问题收集

    撸一个std::lower_bound,不断优化,直到最坏复杂度也为O(logN) 什么是LRU缓存,怎么实现 实现二叉树的层序遍历再按层输出 实现 怎么实现线程池 实现一个二叉树的持久化方案,可以伪代码,必须用指针 编程实现单例...

    Minimum convex partition of a polygon with holes by cuts in given directions

    - 对于不含孔的简单多边形,最小凸多边形分区问题可以在O(n^3)时间内解决。 - 当多边形含有孔时,该问题是NP难的。 #### 五、研究方法及技术 - **无Steiner顶点的分割**:这一变体考虑不引入额外顶点的分割方法。...

    图形算法.pdf

    传统的线裁剪方法通常需要对多边形的每条边进行检测,以判断是否与被裁剪线所在的直线相交,这种方法的时间复杂度为O(n),其中n为多边形边的数量。然而,在实际应用中,被裁剪线往往只与多边形的一小部分边相交,...

    常用算法代码

    - **判断点 Q 是否在多边形内**:判断一个点是否位于一个多边形内部。 - **计算多边形的面积**:计算多边形的面积。 - **解二次方程 AX^2+BX+C=0**:求解一般形式的二次方程。 - **计算直线的一般式 AX+BY+C=0**:...

    LeetCode最全代码

    | _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

    ### 谷歌笔试题2010知识点详解 #### 一、判断一个自然数是否是某个数的平方 **题目描述**: 不使用开方运算来判断一个自然数是否为另一个数的平方。 **解决方案**: 1. **方法1**: - 遍历从1到N的所有数字,...

    数据结构练习题.docx

    2-4 和2-5 分别展示了不同的时间复杂度,虽然2-5的算法在特定边界条件下具有O(√n)的时间复杂度,但通常用于素数判断的是O(√n)。 2-6 和2-7 强调了数据结构的分类和算法分析的两个主要方面。数据结构分为线性结构...

    基于java实现的快速幂、快速乘算法,利用二进制位运算将O(n)的算法复杂度降到O(logn)

    如此递归下去,最多只需要O(logn)次乘法操作,大大提高了效率。 在Java中,快速幂算法的实现通常涉及递归或迭代。以下是一个简单的迭代版本: ```java public static long fastPower(int base, int exponent) { ...

    第10课-比较器-二叉树教程(内附源码).zip

    在进行链表结构开发的过程之中会发现所有的数据按照首尾相连的状态进行保存,那么当要进行某一个数据查询的时候(判断该数据是否存在),这种情况下它所面对的时间复杂度是”O(n)”。 如果说现在它的数据量小(不...

    谷歌笔试题

    **方法1 - 正方形筛选法**: 在[-1,1]×[-1,1]的正方形内随机选择点,检查其是否位于半径为1的圆内。平均而言,需要(pi/4)次尝试才能成功,因为圆面积占正方形面积的比例为pi/4。 **方法2 - 角度与距离法**: 首先...

    算法与程序设计:知识点回顾.ppt

    2. 算法复杂度分析:分为时间复杂度和空间复杂度,常见的时间复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)、O(2n)、O(n!)、O(nn)等。 第二章 穷举法和递推法 1. 穷举法:枚举所有可能的解,并选择其中的...

    快速排序Java 时间复杂度O(nlogn) 空间复杂度O(logn)

    2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作; 3.递归地...

    ACM/ICPC算法大全(c语言)

    ### ACM/ICPC算法大全(C语言)知识点概览 #### 图论(Graph Theory) - **DAG的深度优先搜索标记** - DAG(有向无环图)中的深度优先搜索(Depth-First Search, DFS)是一种重要的遍历算法,用于检测图中的环、计算...

    数据结构-2014-2-期末-2(补充)1

    1. BFS、DFS的复杂度可能不是O(N+E),因为 BFS、DFS 在遍历图或树时需要考虑图或树的结构,可能需要更多的时间。 2. PFS 每次调用 priorUpdata(),总复杂度 O(n),因为 PFS 需要对所有节点进行更新。 3. Floyd 建堆...

    算法设计与分析知识点.docx

    - **凸多边形三角剖分**:对于n个顶点的凸多边形,共有n-3条弦,n-2个三角形。 #### 第五章 回溯法 - **搜索方法**: - **广度优先搜索**:确保找到解但消耗资源较多。 - **深度优先搜索**:节省资源但可能找不...

    PriorityQueue:使用 O(LogN) 复杂度为测试类实现 PriorityQueue

    在本项目中,我们将探讨如何使用O(LogN)的时间复杂度来实现PriorityQueue,并理解其内部工作原理。 首先,PriorityQueue的插入操作(add()或offer())和删除操作(remove()或poll())都具有O(LogN)的时间复杂度。这...

    动态规划的优化_谢兴宇.pdf

    对于凸包的大小,如果在有限域A中随机选择n个点,期望大小取决于A的形状:在圆盘中为O(n),在二维k凸多边形中为O(k log n),而在各边平行于坐标轴的d维超立方体中为O(logn)^(1/3)d^(1/3)。 求解凸包的算法有多种,...

    清华大学-912-2018年真题1

    - 在O(logn)时间内找到最大值所在位置k,可以使用二分查找策略,先找到中点,比较中点前后区间的单调性来缩小范围。 - 算法正确性可以通过归纳法证明,即每次都能正确找到新的边界,直到找到最大值。 - 时间...

Global site tag (gtag.js) - Google Analytics