找到包围一点的线的算法
Posted
技术标签:
【中文标题】找到包围一点的线的算法【英文标题】:Algorithm to find the lines bracketing one point 【发布时间】:2010-10-22 13:41:41 【问题描述】:我有以下任务:
在程序中,我们应该在位图显示上画线。一组
n
实数对(a<sub>i</sub>,b<sub>i</sub>)
定义了n
行y<sub>i</sub> = a<sub>i</sub>*x + b<sub>i</sub>
。这些行在x
-间隔[0, 1]
中排序,因为y<sub>i</sub> < y<sub>i+1</sub>
对于0
和n-2
之间的所有i
值以及[0, 1]
中x
的所有值
不太正式,线条不会在垂直板中接触。给定一个点(x,y)
,其中0 < x < 1
,我们想要确定两行将点括起来。
我们怎样才能快速解决这个问题?
【问题讨论】:
【参考方案1】:Function bracket( Real x, Real y, Array a[1..n],b[1..n] of Reals): Returns void
Integer i = 1;
While (i<=n && (a[i] * x + b[i]) <= y, i++)
If (i==1 || i == n+1)
Print("Not bracket exists");
Exit()
If (a[i] * x + b[i]) == y)
Print("Point lies on line",i);
Exit()
Print("Point between lines ", i-1, " and ", i);
不过有一点小问题。见下图:
你会说点 F 被 [0,1]x[0,1] 中的两行“括起来”吗?这种情况下的正确答案是什么?
【讨论】:
也许二分搜索会更快? @Dialectus 也许我误解了 OP(“我们怎样才能快速解决这个问题?”)。如果“快速”意味着 O(logn) 你是对的,如果“快速”意味着只在一条指令中,那么上面的“while”循环就可以了。在这种情况下使用之前从未见过“快速”:)以上是关于找到包围一点的线的算法的主要内容,如果未能解决你的问题,请参考以下文章