首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

怎么在O(n)内,找到一条直线,所有的点到直线的垂直距离(纵坐标相减的值)不超过1

2013-12-15 
如何在O(n)内,找到一条直线,所有的点到直线的垂直距离(纵坐标相减的值)不超过1直线方程可以写做y kx + b

如何在O(n)内,找到一条直线,所有的点到直线的垂直距离(纵坐标相减的值)不超过1

直线方程可以写做y = kx + b
对于CF到CE的线集,设其与线段EF的交点为x0,y0,则有x0 = xb,y0 = yb+c,c满足-1<=c<=1,则
k = (yb-ya+c-1)/(xb-xa)
b = ya - xa*k = ya - xa*(yb-ya+c-1)/(xb-xa)
则上述k,b只与c有关,接下来遍历除A、B以外的n-2个点,分别求满足条件的c的范围,加上范围-1<=c<=1,一共n-1个范围,如果有交集,则存在这样的直线,如果没有则不存在,复杂度都是O(n)的
(3)在(2)中没有考虑第5种,是在直线CE、DF之间且CD、EF交点不是C、D、E、F的直线集合,因为如果存在一条这样的直线满足条件,则必然在(2)中存在两条与之平行的分别过C、F点(或D、E点)的直线,则这两条平行线中必然有一条也能满足题设条件!

[解决办法]

引用:
Quote: 引用:

Quote: 引用:

(2)则满足到A、B点的Y距离不大于1的直线集有5种情况,其中1种是CF到CE的直线集合如下图所示(还有DF到DE的直线集、ED到EC的直线集,FD到FC的直线集,这4种实际上分析是相同的):

没仔细看,但是我目测你求的是截距<=1而不是垂直距离<=1的解。

这题本质是求是否存在一个角度,使得所有点投影下来以后能被一个长为2的线段覆盖。
如果允许nlogn的话我的做法是求凸包,然后围着转一圈就出答案了。点已经凸包排好序的情况下这个做法可以线性。任意输入要线性这我暂时还不会……

求出凸包以后,nlogn的时间复杂度是怎么得出来的?
你说的点凸包排好序是什么意思?
非常期待你的回复。

那就别看我的办法了。我的办法是做点到直线距离<=1而不是y轴距离为1的。y轴方向距离<=1的解法得另外想。1L的可能可行但是我还没仔细看过。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

(2)则满足到A、B点的Y距离不大于1的直线集有5种情况,其中1种是CF到CE的直线集合如下图所示(还有DF到DE的直线集、ED到EC的直线集,FD到FC的直线集,这4种实际上分析是相同的):

没仔细看,但是我目测你求的是截距<=1而不是垂直距离<=1的解。

这题本质是求是否存在一个角度,使得所有点投影下来以后能被一个长为2的线段覆盖。
如果允许nlogn的话我的做法是求凸包,然后围着转一圈就出答案了。点已经凸包排好序的情况下这个做法可以线性。任意输入要线性这我暂时还不会……

求出凸包以后,nlogn的时间复杂度是怎么得出来的?
你说的点凸包排好序是什么意思?
非常期待你的回复。

那就别看我的办法了。我的办法是做点到直线距离<=1而不是y轴距离为1的。y轴方向距离<=1的解法得另外想。1L的可能可行但是我还没仔细看过。
不过凸包可以解决这类问题?只是你不确定时间复杂度能满足O(n)对吗?

凸包本身nlogn时间打死了。求出凸包以后围着凸包转一圈倒只要O(n)。但是这个解法我仔细想想只能适用于方向性无关的距离,比如每个点到那条线的欧几里得距离<=1的情况。y轴距离<=1的话就不知道是不是一定要凸包才能解了,可能有别的办法。

热点排行