• 计算几何---凸包问题


    https://zh.wikipedia.org/zh-cn/%E5%87%B8%E5%8C%85

    1,增量式算法

    逐次将点加入,然后检查之前的点是否在新的凸包上。由于每次都要检查所有之前的点,时间复杂度为

    2. 包裹法(Jarvis步进法)

    首先由一点必定在凸包的点开始,例如最左的一点

    3. 葛立恒(Graham)扫描法

    Graham scan.png

    由最底的一点A_1开始(如果有多个这样的点,那么选择最左边的),计算它跟其他各点的连线和x轴正向的角度,按小至大将这些点排序,称它们的对应点为

    考虑最小的角度对应的点

    这个算法的整体时间复杂度是

    这个算法由葛立恒在1972年发明。[1]它的缺点是不能推广到二维以上的情况。

    4. 单调链

    将点按x坐标的值排列,再按y坐标的值排列。

    选择x坐标为最小值的点,在这些点中找出y坐标的值最大和y坐标的值最小的点。对于x坐标为最大值也是这样处理。将两组点中y坐标值较小的点连起。在这条线段下的点,找出它们之中y坐标值最大的点,又在它们之间找x坐标值再最小和最大的点……如此类推。

    时间复杂度是

    5. 分治法

    将点集X分成两个不相交子集。求得两者的凸包后,计算这两个凸包的凸包,该凸包就是X的凸包。时间复杂度是

    6. 快包法(Akl-Toussaint启发式)

    选择最左、最右、最上、最下的点,它们必组成一个凸四边形(或三角形)。这个四边形内的点必定不在凸包上。然后将其余的点按最接近的边分成四部分,再进行快包法(QuickHull)。

  • 相关阅读:
    普通链表的各种排序及常用操作
    数据结构、算法与应用(C++描述)(第二版)第六章习题解答
    数据结构、算法与应用(C++描述)(第二版)第三章习题解答
    数据结构、算法与应用(C++描述)(第二版)第二章习题解答
    数据结构、算法与应用(C++描述)(第二版)第一章习题解答
    数据结构、算法与应用(C++描述)(第二版)第五章习题解答
    C++排序算法
    Code-C++-Cut CString to get keyValue by ","||"}"
    C++-Struct string初始化&&map初始化
    JSON的简单介绍以及C语言的JSON库使用
  • 原文地址:https://www.cnblogs.com/icmzn/p/7121490.html
Copyright © 2020-2023  润新知