【问题标题】:Dynamic convex hull trick动态凸包技巧
【发布时间】:2015-05-27 19:21:26
【问题描述】:

我在空闲时间阅读了一些有趣的算法,我刚刚发现了凸包技巧算法,我们可以使用它计算给定 x 坐标上平面中几条线的最大值。我找到了这篇文章:

http://wcipeg.com/wiki/Convex_hull_trick

这里作者说,这个算法的动态版本运行在对数时间,但没有证据。当我们插入一行时,我们测试了他的一些邻居,但是当我们可以通过这样的插入测试所有N 行时,我不明白它怎么会是O(log N)。是正确的还是我错过了什么?
更新:这个问题已经回答了,有趣的是下面的其余部分

  • 如何删除?
    我的意思是...如果我们删除一行,我们可能需要以前的行来重置整个船体,但是在插入新行时,该算法会删除所有不必要的行。
  • 这是另一种解决上述问题的方法(或类似问题,例如管理插入、删除、在 x 点或给定范围上查找最大值等查询)

提前谢谢你!

【问题讨论】:

    标签: algorithm optimization data-structures convex-hull convex-optimization


    【解决方案1】:

    要回答您的第一个问题:“插入怎么可能是 O(logn)?”,您确实可以最终检查 O(n) 个邻居,但请注意,您只需要在发现需要时检查一个额外的邻居进行删除操作。

    关键是如果你要插入n个新行,那么你最多可以做n次删除操作。因此,除了您需要在已排序数据结构中找到其位置的每行 O(logn) 工作之外,额外工作的总量最多为 O(n)。

    所以插入所有 n 行的总工作量是 O(n) + O(nlogn) = O(nlogn),或者换句话说,每行摊销 O(logn)。

    【讨论】:

    • 谢谢,我现在明白了。但是对我来说仍然不清楚,我们如何使用这样的数据结构处理查询。通过查询,我的意思是从集合中插入和删除行。
    【解决方案2】:
    1. 文章声称每次插入的时间已摊销(不是最坏的情况)O(log N)。摊销界限很容易证明(每行最多删除一次,每次检查要么是最后一个,要么导致删除一行)。

    2. 文章根本没有说这个数据结构支持删除。我不确定是否可以有效地处理它们。有一个障碍:时间复杂度分析是基于这样一个事实,即如果我们删除一条线,我们将来就永远不需要它,而允许删除的情况并非如此。

    【讨论】:

      【解决方案3】:

      插入可以比 O(log n) 更快,它可以在 O(Log h) 中实现,其中 h 是已经计算的 Hull 点的集合。可以在每个点 O(log h) 中完成批量插入或一个一个插入。你可以阅读我的文章:

      1. A Convex Hull Algorithm and its implementation in O(n log h)
      2. Fast and improved 2D Convex Hull algorithm and its implementation in O(n log h)
      3. First and Extremely fast Online 2D Convex Hull Algorithm in O(Log h) per point

      关于删除:我很确定,但必须证明,它可以在每点 O(log n + log h) = O(log n) 中实现。在我的第三篇文章末尾有一段关于它的文字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        相关资源
        最近更新 更多