繁体   English   中英

对抛物线y = ax ^ 2 + bx + cx = x1,x2,x3,x4的坐标(x,y)进行排序。 根据y坐标

[英]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)

现在在最接近xx值排序列表中找到该值:

    i = index(x: min(|x - x0|))

将点i添加到列表中。 创建两个索引:

    l = i - 1
    r = i + 1

现在,从靠近顶点的索引lr处获取点,并将其添加到列表中。 更新索引,直到用尽列表。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM