【问题标题】:Convex hull: known number of points but not points itself凸包:已知点数但不是点本身
【发布时间】:2016-11-09 12:51:14
【问题描述】:

我需要找到一种算法,该算法从给定的一组点S 大小为n 计算凸包。 我知道S 中正好有 6 个点构成了凸包。

计算这个的最好和最有效的方法是什么?

我考虑过从S 生成所有可能的点组合(这将是 n 选择 6 个点),这将花费 O(n^6),然后检查这是否是一个凸包,这将花费 O(n ) 但会导致非常糟糕的总运行时间。一定会有更好的办法。有什么提示吗?

【问题讨论】:

  • 附带说明,nC6 是 O(n^6),而不是 O(n)
  • 先在这里查看en.wikipedia.org/wiki/Convex_hull_algorithms 怎么样?编辑:忍者
  • 凸包是独一无二的,所以你为什么要谈论 6 点等,只需查找算法并执行它 - 如果你有 1000 点或 10000 点,这是一个小问题,它不能超过 O( n^2)
  • 检查 6 组需要 O(N),因此总复杂度为 O(N^7)。一般来说,O(N^7) 是不可想象的,除了微小的 N。对于 N=10,N^7 已经是千万。 N=100,就是十亿。

标签: algorithm geometry computational-geometry convex-hull convex


【解决方案1】:

如果凸包上只有 6 个点,那么 Jarvis March 或礼品包装算法将非常有效。它在O(nh) 时间运行,其中h 是凸包上的点数。

【讨论】:

  • 值得补充的是,由于 h = 6 是一个常数,这是一个 O(n) 算法,可证明对于给定问题是最优的:您必须查看每个点一次,这意味着问题的复杂度为 Ω(n)。
【解决方案2】:

如前所述,Jarvis March / Gift-wrapping 算法在这种情况下非常快,因为与 Graham Scan 中的 O(nlogn) 相比,时间复杂度为 O(nh)。

唯一认为会更快的算法是在O(nlogh) 中运行的Chan 算法,但由于h 非常小,差异将是微不足道的。阅读有关 Chan 算法的更多信息here。

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2011-01-08
    • 2014-12-12
    • 1970-01-01
    • 2023-03-31
    • 2018-05-07
    • 2015-10-02
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多