《Algorithms算法》笔记:元素排序(4)——凸包问题


凸包问题

凸包问题就是说,找到一个最小的凸多边形能圈住所有的点。

凸包问题的应用

  • 运动规划:找到从s到t的最短路径,最短路径肯定在凸包上

  • 最远的一对:相隔最远的点对肯定在凸包上

凸包的几何性质

  • 可以通过逆时针遍历所有凸包顶点
  • 凸包的顶点是关于p的极角的递增序列,而p有最小的y坐标。

Graham 扫描算法

  1. 选择y坐标最小的p

    • 如何确定最小y坐标?
      循环一遍
  2. 对所有的点按关于p的 极角排序
    • 如何对点进行极角排序?
    • 如何效率的排序?
      用MergeSort
  3. 按顺序连接每个点,如果发现打破pi−2→pi−1→pi 打破了逆时针的原则,则舍弃pi−1,pi。

    • 如何判断是否打破了逆时针原则ccw?
    • 如何解决退化问题(多个点在一条直线上)

      通过计算(b-a)和(c-a)的叉乘就行了。
      如果area > 0 则是逆时针,
      如果area < 0 则是顺时针
      如果area = 0 则是共线

代码

由于每次要判断最后的2个点是否是逆时针,毫无疑问使用栈结构是比较合适的

public class Point2D
{
private final double x;
private final double y;
public Point2D(double x, double y)
{
this.x = x;
this.y = y;
}
...
public static int ccw(Point2D a, Point2D b, Point2D c)
{
double area2 = (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
if (area2 < 0) return -1;
// clockwise
else if (area2 > 0) return +1;
// counter-clockwise
else return 0;
// collinear
}
}
stack<Point2D> hull = new Stack<Point>();
Array.sort(p,Point2D.Y_ORDER);//find p
Array.sort(p,p[0],BY_POLAR_ORDER)// hull.push(p[0]);
hull.push(p[1]); for(i = 2;i < N;i++)
{
Point2D top = hull.pop();
while(Point2D.ccw(hull.peek(),top,p[i]) <= 0)
top = hull.pop();
hull.push(top);
hull.push(p[i]); }

《Algorithms算法》笔记:元素排序(4)——凸包问题的更多相关文章

  1. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

  2. 《Algorithms算法》笔记:元素排序(1)——简单排序

    <Algorithms算法>元素排序(1)——简单排序 Algorithms算法元素排序1简单排序 排序问题 1 回调函数 2Java中回调函数的路线图 3 全序 4 Comparable ...

  3. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  4. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  5. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  6. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  7. 算法笔记(c++)--桶排序题目

    算法笔记(c++)--桶排序 记得题目是排序,输入n个1-1000的数字然后去重然后排序. 桶排序没毛病 #include<iostream> using namespace std; i ...

  8. STL学习笔记(排序算法)

    STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...

  9. C语言笔记 13_排序算法

    排序算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程 ...

随机推荐

  1. D3 数据可视化实战 笔记

    学习真是件奇妙的事情.这本书我之前都看过,有些的知识点却完全没有印象. 总结:把用到的知识好好研究:平时可以了解其他技术的基础,把相关的资料和难点记录下来. javascript陷阱 1.变量类型 v ...

  2. CentOS 7 IPv6关闭

    你可以用两个方法做到这个.方法 1编辑文件/etc/sysctl.conf,vi /etc/sysctl.conf添加下面的行:net.ipv6.conf.all.disable_ipv6 =1net ...

  3. archlinux 64bit 开发android

    arch 64位下直接运行android emulator会出现错误:“Failed to start emulator: Cannot run program "xxxx/sdk/tool ...

  4. Polynomial ( Arithmetic and Algebra) CGAL 4.13 -User Manual

    1 Fundamentals A polynomial is either zero, or can be written as the sum of one or more non-zero ter ...

  5. 如何修改Entity Framework Db Frist模式下的Entity继承关系?

    1.准备工作 Db Frist创建实体数据模型(创建edmx并不是重点,各位随意即可),此处取名ZeroCodeDB,所得文件如图所示:其中红框中的文件(ZeroCodeDB.tt)是各实体的生成的关 ...

  6. Linux下MySQL数据库的备份与还原

    昨天对公司数据库进行备份.用了以下的方法一. 导出1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql 如果要导出数据库全部: mysqldump - ...

  7. ping使用

    while read line do ip=`echo $line | awk '{print $2}' ` -i $ip ];then echo $line | tee -a b fi

  8. pandas iterrows()

    按照行遍历,第一个是行索引,第二个是每一行,series类型.

  9. 如何外部访问你的本地网站natapp

    用natapp,要实名制才可以获得免得authtoken 1.注册登录: https://natapp.cn/tunnel/lists 2.这个要填写一下,端口我写的是3000 3.客户端下载 解压: ...

  10. [HTML] <meta name="viewport" content="width=device-width,initial-scale=1.0">释义

    <meta name="viewport" content="width=device-width,initial-scale=1.0">这是 HT ...