寻找凸包

2023-10-31

问题:点集 Q 的凸包 (convex hull) 是一个最小的凸多边形 P:Q 中的每个点或在 P 的边界上或 在 P 的内部,我们用 CH(Q) 表示点集 Q 的凸包。 问题定义: 输入:平面上的点集 Q 输出:Q 的凸包 CH(Q)

(a) 请给出一种算法计算 CH(Q), 叙述基本思想并写出伪代码;

 (b) 分析算法时间复杂度;

(c) 分析算法的正确性;

 

1Graham扫描法主要用一个栈来解决凸包问题,点集Q中每个点都会进栈一次,不符合条件的点会被弹出,算法终止时,栈中的点就是凸包的顶点(逆时针顺序在边界上)

1、先选出点集Q(p0,p1,p2,…,pn)中y坐标最小的点记为p0, 如果y坐标相同则相同点中x坐标最小的点。

2、把(p0,p1,p2,…,pn)按照极角从小到大排序(以p0为极点),极角相同的点按照到的距离从小到大排序。

3、把p0,p1,p2压入栈。

4、遍历剩下的点(p3,p4,p5,…,pn),while循环把发现不是凸包顶点的点移除出去,因为当逆时针遍历凸包时,我们应该在每个顶点向左转。因此当while循环发现在一个顶点处没有向左转时,就把该顶点移除出去。至于如何判断向左向右则是根据叉积来判断。

伪代码如下:

GRAHAM-SCAN(Q)

      1 let p0 be the point in Q with the minimum y-coordinate, or the leftmost such point in case of a tie

      2 let<p1,p2,…,pn> be the remaining points in Q ,sorted by polar angle in counterclockwise order around p0

         (if more than one point has the same angle ,remove all but the one is farthest from p0)

      3 if m<2

      4  return "convex hull is empty"

      5 else let S be an empty stack

      6  PUSH(p0 , s)

      7  PUSH(p1 , s)

      8  PUSH(p2 , s)

      9  for i = 3 to m

      10    while the angle formed by points NEXT-TO-TOP(S),TOP(S)

                    and pi makes a nonleft turn

      11      POP(S)

      12    PUSH(pi , S)

      13 return S

 

(2)分析算法的时间复杂度

1. 求Q中y-坐标值最小的点p0 : 时间O(n)

2. 按照与p0极角(逆时针方向) 大小排序Q中其余点,结果为:<p1,p2,…,pn>

时间O(nlogn)

3. Push p0,p1,p2 into S : 时间O(1)

4. FOR i=3 TO n DO

5. While Next-to-top(S)、Top(S) 和pi形成非左移动 Do Pop(S); Push(pi,S) : 需要O(n)时间

6. Return S.

因为每个顶点至多进栈一次,出栈一次,每次需要常数计算时间

综上,T(n) = O(nlogn)

 

(3)分析算法的正

定理:设n个二维点的集合Q是Graham-Scan算法的输入,|Q|³3,算法结束时,栈S中自底到顶存储CH(Q)的顶点(按照逆时针顺序)

证明: 使用循环不变量方法

Loop invariant : 在处理第i个顶点之前, 栈S中自底到顶存储CH(Qi-1)的顶点.

Proof by induction(通过归纳证明)

Initialization: (第6~8步)

处理i=3之前,栈S中包含了Qi-1=Q2={p0 ,p1 ,p2}中的顶点, 这三个点形成了一个CH. 循环不变量为真.

Maintenance:

1.设在处理第i(i³3)个顶点之前, 循环不变量为真,即:栈S中自底到顶存储CH(Qi-1)的顶点. 往证: 算法执行9~12步之后,栈S中自底到顶存储CH(Qi)的顶点.

2.10~11步while循环执行结束后,第12步将pi压入栈之前,设栈顶元素为pj,次栈顶元素为pk,则此时,栈中包含了与for循环的第j轮迭代后相同的顶点,即CH(Qj),循环不变量为真.

3.执行第7步之后, pi入栈, 则栈S中包含了CH(QjÈ{pi})中的顶点,且这些点仍按逆时针顺序,自底向上出现在栈中.即: CH(QjÈ{pi})= CH(Qi )

4.对于任意一个在第i轮迭代中被弹出的栈顶点pt,设pr为紧靠pt的次栈顶点, pt被弹出当且仅当pr、pt、pi构成非左移动。因此, pt不是CH(Qi )的一个顶点,即CH(Qi-{pt})= CH(Qi )。 设Pi为for循环第i轮迭代中被弹出的所有点的集合,则有CH(Qi-Pi )= CH(Qi ),又 Qi-Pi= QjÈ{pi},故有CH(QjÈ{pi})= CH(Qi-Pi)=CH(Qi)

5.即得到:一旦将pi压入栈后, 栈S中恰包含CH(Qi)中的顶点, 且按照逆时针顺序,自底向上排列。

Termination:

i=n+1,栈S中自底到顶存储CH(Qn)的顶点, 算法正确.

证毕.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找凸包 的相关文章

  • 1.3. 分治法—最近点对问题

    1 问题描述 给定平面S上n个点 找其中的一对点 使得在n个点组成的所有点对中 该点对间的距离最小 2 求解过程 划分 将集合S分成两个大小基本相等的子集 S 1 S 1 S1 和 S
  • LeetCode打卡——62.不同路径

    LeetCode打卡 62 不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同
  • 数据结构——在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性

    题目 在一个有序表中 现在要插入一个元素 要求在插入后不改变表的有序性 要求采用一种时间复杂度较低的算法 所采用的的数据结构不限 思想 本题有多种做法 但是最少的时间复杂度是申请一个新的顺序表 一次比较后插入 时间复杂度为O N 这是典型的
  • python实现斐波那契数列

    斐波那契数列指的是这样一个数列 0 1 1 2 3 5 8 13 特别指出 第0项是0 第1项是第一个1 从第三项开始 每一项都等于前两项之和 Python 实现斐波那契数列代码如下 实现一 1 def fibonacci 2 num in
  • 图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

    作者 i dovelemon 日期 2017 07 29 来源 CSDN 主题 Monte Carlo Integration 引言 好久没有写博客了 最近一直在忙于工作 同时GLB库中关于PBR的渲染算法 一直卡住 无法实现下去 不过在这
  • hihoCoder 1582 Territorial Dispute

    Problem hihocoder com problemset problem 1582 vjudge net problem HihoCoder 1582 Reference hihocoder 1582 Territorial Dis
  • 无向图的表示:邻接矩阵和邻接表

    这里将一个无向图用邻接表和邻接矩阵表示 输入 顶底个数n 图中的各个边 用两个顶点表示 输出 这个无线图的邻接矩阵和邻接表 其中邻接表中的链接按元素大小升序排列 先给出一个例子说明 假设有无向图如下 则其邻接矩阵和邻接表如提示框中所示 其实
  • 2014百度校招笔试

    1 ISO七层说明 2 用百度地图查询 百度大厦 到 北京大学 得到路线不太稳定是怎么回事 分析可能的原因 测试开发唯一区别于软件开发的一题 3 TCP UDP协议的区别 举出上一层的应用协议 二 算法 1 写出a0 a1 a2 an的所有
  • 动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】

    文章目录 1 序 2 动态规划的基本概念 1 3 动态规划算法的基本思想 2 4 动态规划的求解步骤 2 5 动态规划算法的基本要素 2 5 1 最优子结构 5 2 重叠子问题 6 一些经典的动态规划问题 1 序 近期笔者会写一些博客 与大
  • 【分治算法】有重复元素的排列问题

    算法实现题 2 8 有重复元素的排列问题 问题描述 设 R r1 r2 rn 是要进行排列的 n 个元素 其中元素r1 r2 rn 可能相同 试设计 一个算法 列出 R 的所有不同排列 编程任务 给定 n 以及待排列的 n 个元素 计算出这
  • 3.2 回溯法—N皇后问题

    1 问题描述 在 n n n times n n n的棋盘上摆放 n n n个皇后 使任意两个皇后都不能处于同一行 同一列或同一斜线上 2 问题
  • 蓝桥杯——修改数组

    问题描述 给定一个长度为N的数组A A1 A2 AN 数组中有可能有重复出现的整数 在小明要按以下方法将其修改为没有重复整数的数组 小明会依次修改A2 A3 AN 当修改Ai时 小明会检查Ai是否在A1 Ai 1中出现过 如果出现过 则小明
  • 1477. 找两个和为目标值且不重叠的子数组

    1477 找两个和为目标值且不重叠的子数组 题目描述 样例1 样例2 样例3 样例4 示例 5 提示 解题思路 代码实现 题目描述 给你一个整数数组 arr 和一个整数值 target 请你在 arr 中找 两个互不重叠的子数组 且它们的和
  • python算法中的字符串算法(详解)

    目录 学习目标 学习内容 字符串匹配算法 Brute Force算法 KMP算法
  • JS和Java实现链表类的基本功能

    综合网上实例 参考 http www 2cto com kf 201204 126773 html JavaScript实现参考 http m blog csdn net blog caiwenfeng for 23 8496029 Jav
  • 算法——因子和阶乘

    题目描述 输入正整数n 2 lt n lt 100 把阶乘n 1x2x3x xn分解成素因子相乘的形式 从小到大输出各个素数 2 3 5 的指数 你的程序应忽略比最大素因子更大的素数 否则末尾会有无穷对个0 样例输入 5 53 样例输出 5
  • 搜狐畅游2018年9月15日校招真题(2)

    通过该道题目 题目描述 示例代码 include
  • Zlib的安装与测试

    官方网址 http www zlib net 进入官网看到 如图所示 最新版本为zlib 1 2 11 然后你用wget http www zlib net zlib 1 2 11或者wget http www zlib net zlib
  • 《算法设计与分析》学习笔记

    目录 算法基本概念 算法的定义 算法复杂度分析 渐近记号 渐近上界记号O 渐近下界记号 渐近紧确界记号 非渐近紧确上界记号o 非渐近紧确下界记号 渐进记号极限定义 分治 分治步骤 递归树 编辑代入法 主方法 改变变量 二叉树 堆 建堆 堆排
  • 算法设计与分析 | 一般背包问题

    题目描述 某天KID利用飞行器飞到了一个金银岛上 上面有许多珍贵的金属 KID虽然更喜欢各种宝石的艺术品 可是也不拒绝这样珍贵的金属 但是他只带着一个口袋 口袋至多只能装重量为 W 的物品 岛上金属有 s 个种类 每种金属重量不同 分别为

随机推荐

  • 函数的返回值-接收返回元组函数的方式

    def measure 测量温度和湿度 print 测量开始 temp 39 wetness 50 print 测量结束 元组 可以包含多个数据 因此可以使用元组让函数一次返回多个值 如果函数返回的类型是元组 小括号可以省略 return
  • 在QMap中嵌套QList

    刚接触QT的QMap比较困惑 看这名字以为是二维数组 因为我把QList当作一维数组来用了 事实上也确实可以 但只当一维数组太浪费了 可参考别的资料 cpp view plain copy QMap
  • 面试时,发现公司有这8个现象,建议你慎重考虑

    爱开发 陪伴你一起成长 快年底 相信有不少朋友有跳槽的念头 今天我们来聊一聊面试的一些话题 面试时 我们有机会对公司的情况做一下了解 比如和面试官交流 我们大致能了解到公司的一些基本情况 这些情况比我们在去面试前更为准确 程序员面试时 发现
  • Spark RDD之Key-Value类型操作详解

    partitionBy案例 1 作用 对pairRDD进行分区操作 如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区 否则会生成ShuffleRDD 即会产生shuffle过程 2 需求 创建一个4个分区的R
  • 了解链接是什么?

    链接是将各种代码和数据片段收集并且组合成为一个单一文件的过程 这个文件可以被加载到内存并且执行 链接可以执行于编译时 也就是在程序被加载器加载到内存并且执行 甚至在执行于运行的时候 也就是由应用程序来执行 在早期的计算机系统中 链接是手动执
  • OrCAD中DRC的使用简要说明

    OrCAD中DRC的使用简要说明 1 DRC的使用 Scope entire 检查所有设计 selection 检查选中部分 Mode 理解Mode需要先理解instance 实例 和occurrences 事件 这是OrCAD中非常重要的
  • 单元测试框架(JUnit和Unittest)

    单元测试就是针对最小功能单元编写测试代码 1 JUnit Unit 是一个 Java编程语言的单元测试框架 java程序最小的功能是方法 单元测试就是针对java方法的测试 测试单元中的每个方法必须可以独立测试 方法间不能有任何依赖 1 1
  • 浅谈多路复用select、epoll

    一 多路复用技术 在理解多路复用之前了解一下IO阻塞 IO非阻塞有利于理解IO多路复用 可以想象成父进程为董事长 其雇佣秘书 内核 帮助你监听读写缓冲区 常见的有select poll epoll 这里只谈一下select和epoll po
  • 【持续更新中】Unity常见问题及其解决

    目录 导出游戏时需要选择空的文件夹 CS0103错误 使用的变量名或者方法名并不存在于当前上下文中 CS1061错误 尝试调用方法或访问不存在的类成员 Unity怎么点都没反应 可能是进入了死循环 CS0428错误 类型转换错误 CS165
  • 编写自己的springboot starter

    一 编写自己的springboot starter 可能已经过时了 仅建议参考 引入对应的依赖 编写实现类 编写配置文件读取类 主要注解是 ConfigruationProperties 配置的值例如 example a 编写自动装配类 编
  • 《Deep Residual Learning for Image Recognition》论文学习

    Deep Residual Learning for Image Recognition 文章地址 Deep Residual Learning for Image Recognition arXiv 1512 03385 ResNet G
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 利用SpringBoot简单快速搭建WEB项目入门

    我们在WEB应用开发过程中 我们常常用到的语言是JAVA语言 作为WEB应用中的霸主级别中 的存在 却常常被嘲讽 人生苦短 我用python 是python程序员们引以为傲的格言 人们经常 将JAVA与时代新宠Python作比较 至今网上还
  • 用Python每天自动给女朋友免费发短信,谁说程序员不懂浪漫?

    前言 之前发过一篇文章 用 Python 制作的给父母天气预报提醒的小工具天气变冷了 给父母制作一个天气提醒小助手 这篇文章我同步到博客上之后 有读者在评论区留言 对于部分微信没有网页版接口 导致无法实现这个功能 这位读者建议 建议用发短信
  • Linux自动删除tomcat日志文件

    查看Linux启动的所有crontab crontab l 编辑crontab crontab e bin sh export LANG zh CN export WEB HOME webhome find dir path dir pru
  • 【渗透测试】Struts2系列漏洞

    目录 S2 001 1 漏洞原理 2 影响版本 3 验证方法 S2 005 1 漏洞原理 2 影响版本 3 验证方法 无回显 4 验证方法 有回显 S2 007 1 漏洞原理 2 影响版本 3 漏洞验证 S2 008 1 漏洞原理 2 影响
  • k8s 探针

    1 前言 Kubernetes探针 Probe 是用于检查容器运行状况的一种机制 探针可以检查容器是否正在运行 容器是否能够正常响应请求 以及容器内部的应用程序是否正常运行等 在Kubernetes中 探针可以用于确定容器的健康状态 如果容
  • CSDN账号等级提升规则

    2023最新 大家登录CSDN主要有两种需求 一是获取资源 另一种是发放资源 CSDN大约从2022年开始 不断调整等级规则 CSDN账号达到4级才能有资格上传付费资源 我搜索发现CSDN账号可能因实名的原因 没有买卖的 本文主要介绍3个内
  • 使用uni.share在IOS上分享不显示图片的问题

    问题背景 使用uni app跨平台 编译运行到ios上 发现分享图文的时候 图片无法显示 在安卓上分享正常 uni分享朋友圈api地址 uni share provider weixin scene WXSenceTimeline type
  • 寻找凸包

    问题 点集 Q 的凸包 convex hull 是一个最小的凸多边形 P Q 中的每个点或在 P 的边界上或 在 P 的内部 我们用 CH Q 表示点集 Q 的凸包 问题定义 输入 平面上的点集 Q 输出 Q 的凸包 CH Q a 请给出一