我在空闲时间阅读有趣的算法,我刚刚发现了凸壳技巧算法,利用它我们可以计算给定x坐标平面中几条线的最大值。我找到了这篇文章:
http://wcipeg.com/wiki/Convex_hull_trick
这里作者说,该算法的动态版本以对数时间运行,但没有证据。当我们插入一行时,我们测试了他的一些邻居,但我不明白当我们可以通过这样的插入测试所有O(log N)
行时它是如何N
的。这是正确的还是我错过了什么?
更新:这个问题已经回答了,有趣的是下面的其他问题
提前谢谢!
答案 0 :(得分:0)
要回答你的第一个问题:“如何插入O(logn)?”,你确实可以最终检查O(n)个邻居,但请注意,当你发现需要时你只需要检查一个额外的邻居进行删除操作。
重点是,如果要插入n个新行,则最多可以执行n次删除操作。因此,除了在排序数据结构中找到其位置所需的每行O(logn)工作外,额外工作总量最多为O(n)。
因此,插入所有n行的总工作量是O(n)+ O(nlogn)= O(nlogn),换句话说,每行的摊销O(logn)。
答案 1 :(得分:0)
该文章声称每次插入时摊销(不是最坏情况)O(log N)
时间。缓冲限制很容易证明(每行最多删除一次,每次检查是最后一行或导致删除一行)。
文章没有说这个数据结构完全支持删除。我不确定是否有可能有效地处理它们。存在一个障碍:时间复杂度分析基于以下事实:如果我们删除一条线,将来我们将永远不需要它,而在允许删除的情况下则不然。
答案 2 :(得分:0)
插入可以比O(log n)更快,它可以在O(Log h)中实现,其中h是已经计算的Hull点的集合。批量插入或逐个插入可以每点O(log h)完成。你可以阅读我的文章:
关于删除:我非常确定,但必须证明,它可以在每个点的O(log n + log h)= O(log n)中实现。关于它的文本可以在我的第三篇文章的末尾找到。