【发布时间】:2011-11-17 05:23:12
【问题描述】:
免责声明:是的,这是一个家庭作业,我考虑了几天但找不到方法。
所以有 n 条直线(y= ax + b),我想找到它们的上包络线(图片中的粗体部分)。它必须在 O(nlogn) 中。
我的理解是,我需要找到一种方法来忽略某些行,因为如果我搜索所有行,它就不会是 O(nlogn)。
我正在考虑一种分而治之的方法,以便我可以将列表分成两部分并递归地继续直到解决方案。但后来我不知道如何摆脱一些线条。显然,我不需要考虑图中的一些底线,因为它们不可能为解决方案做出贡献。但我什么也没想到。任何提示表示赞赏。
【问题讨论】:
-
如果您正在查看最坏情况下的性能,那么丢弃一些行将无助于降低渐近复杂度:很容易构建一个 every 行的情况提供信封的一部分。
-
正如@NPE 所写,您确实需要考虑每一行。但这没关系 - 只需 O(n) 扫描一次。您需要避免的是考虑每条线 X 线的交点。其中有 n^2 个,所以如果你天真地扫描所有这些,你会得到一个 O(n^2),这比 O(n log(n)) 更糟糕。
标签: algorithm geometry computational-geometry analysis