[英]Sort coordinates (x,y) of a parabola y=ax^2+bx+c x=x1,x2,x3, x4. according to y coordinates
我尝试了cpp代码块:
bool comp(const pair<int,int>&A, const pair<int,int>&B)
{
if(A.second<=B.second)
{
if(A.first>=B.first)
return 1;
else
return 0;
}
return 0;
}
int main()
{
int a, b, c, x[10], y[10];
cin>>a;
cin>>b;
cin>>c;
for(int i=0;i<4;++i)
{
cin>>x[i];
y[i]=a*x[i]*x[i]+b*x[i]+c;
}
vector<pair<int,int> >V;
for(int i=0;i<4;++i)
{
V.pb(mp(x[i],y[i]));
}
for(int i=0;i<4;++i)
{
sort(V.begin(),V.end(),&comp);
}
for(int i=0;i<V.size();i++)
{
cout<<V[i].first;
cout<<" "<<V[i].second<<" ";
}
return 0;
}
STDIN: abc x1 x2 x3...
和x
处于排序顺序,即x1 < x2 < x3
。 代码应使用抛物线方程为每个x
生成一个新列表( y = y1 y2 y3
),并以运行时复杂度<= O(log n)对上述列表进行排序。
标准输出: x3,y3 x1,y1 x2,y2 ...
(假设计算出的y3 < y1 < y2..
)。
代码不应计算Y。 此计算节点上的乘法“太”昂贵。 该解决方案应确定一种无需计算“ y”值即可仍然对列表进行排序的方法。
我的代码计算y值。 任何人都可以找到一种无需计算y值的排序方法。 python代码实现也对我有用。
越远的x
值是从抛物线的顶点x0
,较高的是其y
值时a
为正,且下其y
值时a
是负的。
|x1 - x0| > |x2 - x0| && a > 0 --> y1 > y2
|x1 - x0| > |x2 - x0| && a < 0 --> y1 < y2
当a
是零,你的抛物线是一个真正的线和x
值按正确的顺序已经排好序时, b
为正或以相反的顺序时, b
为负。
因此,当a
不为零时,找到顶点:
x0 = - b / (2*a)
现在在最接近x
的x
值排序列表中找到该值:
i = index(x: min(|x - x0|))
将点i
添加到列表中。 创建两个索引:
l = i - 1
r = i + 1
现在,从靠近顶点的索引l
或r
处获取点,并将其添加到列表中。 更新索引,直到用尽列表。
当a
为负数时还原列表。 (或从列表末尾添加项目。)
编辑 :这是Python中的实现。 它从子列表弹出元素,而不是使用数组索引,但是逻辑是相同的:
import bisect
def parasort(a, b, c, x):
"""Return list sorted by y = a*x*x + b*x + c for sorted input x."""
if not x:
return x
if a == 0: # degenerate case: line
if b < 0: return x[::-1]
return x[:]
x0 = -0.5 * b / a # apex of parabola
i = bisect.bisect_left(x, x0) + 1 # closest point via bin. search
l = x[:i][::-1] # left array, reverted
r = x[i:] # right array
res = []
while l and r: # merge l and r
if x0 - l[0] > r[0] - x0: # right item is smaller
res += [r.pop(0)]
else: # left item is smaller
res += [l.pop(0)]
res += l + r # append rest of arrays
if a < 0: return res[::-1]
return res
a = 4
b = 0
c = 0
xx = parasort(a, b, c, [-3, 0, 1, 2])
for x in xx:
print x, a*x*x + b*x + c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.