答案 0 :(得分:3)
考虑到Evgeny Kluev提出的双平面概念,以及我关于找到最左边交点的评论,我将尝试给出一个没有任何双重空间的等效直接解法。
解决方案很简单:按字典顺序按(x,y)对点进行排序。现在按排序顺序在每两个相邻点绘制一条线。可以证明,通过这些线之一实现最小角度。为了获得最大角度,您需要按字典顺序按(x,-y)排序,并且只检查相邻的点对。
让我们通过最小角度的想法来证明。考虑两个点 A 和 B ,它们产生最小可能的角度。在这些点中,我们可以选择 x 坐标差异最小的对。
假设他们有相同的 y 。如果它们之间没有其他点,则它们相邻。如果它们之间有任何点,那么显然它们中的至少一个在我们的顺序中与 A 相邻,并且它们都产生相同的角度。
假设在 A 和 B 之间存在一个带有x坐标的点 P ,即 Ax< ; Px< Bx的。如果 P 位于 AB 上,则 AP 具有相同的角度但 x 坐标的差异较小,因此存在矛盾。当 P 不在 AB 上时, AP 或 PB 会给你更少的角度,这也会产生矛盾
现在我们将点 A 和 B 放在两条相邻的垂直线上。这些线之间没有其他要点。如果 A 和 B 是其垂直线上的唯一点,则 AB 对按排序顺序和QED明显相邻。如果这些线上有很多点,显然最小角度是通过取左边垂直线上的最高点(必须是 A )和右边垂直线上的最低点(必须是乙)。由于我们按 y 对 x 的点进行排序,因此这两点也相邻。
答案 1 :(得分:2)
对点进行排序(或使用哈希图)以确定是否存在任何水平线。
然后在双平面上解决这个问题。在这里,您只需要找到最左边和最右边的交叉点。使用二进制搜索来查找一对水平坐标,使得所有交叉点都在它们之间。 (您可以通过从这些坐标继续进行二进制搜索来快速找到近似结果。)
然后根据双平面上的切线对线条进行排序。并且对于按此排序顺序的相邻线对,找到最接近那些水平坐标的交点。在最坏的情况下(当原始平面上的某些线几乎是水平的时),这并不能保证良好的复杂性。但在大多数情况下,时间复杂度将通过排序来确定:O(N log N)+ O(binary_search_complexity)。