Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定一个递增多项式,如何有效地找到y的固定区间的x值?_Algorithm_Math - Fatal编程技术网

Algorithm 给定一个递增多项式,如何有效地找到y的固定区间的x值?

Algorithm 给定一个递增多项式,如何有效地找到y的固定区间的x值?,algorithm,math,Algorithm,Math,问题:给定一个保证从x=0增加到xmax的n次多项式(系数为a0到an-1),找到具有等间距y值的前m个点(即对于所有i,yi-yi-1==c)的最有效算法是什么 示例:如果我希望间距为c=1,并且我的多项式是f(x)=x^2,那么前三个点将位于y=1(x=1)、y=2(x~=1.4142)和y=3(x~=1.7321) 我不确定它是否有意义,但我的具体问题涉及给定系数的多项式的立方。我的直觉告诉我,最有效的解决方案应该是相同的,但我不确定 我在2012年世界总决赛的ACM中遇到了这些问题(问

问题:给定一个保证从x=0增加到xmax的n次多项式(系数为a0到an-1),找到具有等间距y值的前m个点(即对于所有i,yi-yi-1==c)的最有效算法是什么

示例:如果我希望间距为c=1,并且我的多项式是
f(x)=x^2
,那么前三个点将位于y=1(x=1)、y=2(x~=1.4142)和y=3(x~=1.7321)


我不确定它是否有意义,但我的具体问题涉及给定系数的多项式的立方。我的直觉告诉我,最有效的解决方案应该是相同的,但我不确定

我在2012年世界总决赛的ACM中遇到了这些问题(问题B),这主要是因为我很好奇



编辑:我不确定这是否应该继续?

您可以使用二进制搜索找到给定Y的X。它是对数时间复杂度,与x值范围的大小成正比,除以您的容错能力

def solveForX(polyFunc, minX, maxX, y, epsilon):
    midX = (minX + maxX) / 2.0
    if abs(polyFunc(midX) - y) < epsilon:
        return midX
    if polyFunc(midX) > y:
        return solveForX(polyFunc, minX, midX, y, epsilon)
    else:
        return solveForX(polyFunc, midX, maxX, y, epsilon)

print solveForX(lambda x: x*x, 0, 100, 2, 0.01)
编辑:要扩展评论中的想法,如果您知道要搜索多个X值,可以缩小[minX,maxX]搜索范围

def solveForManyXs(polyFunc, minX, maxX, ys, epsilon):
    if len(ys) == 0:
        return []
    midIdx = len(ys) / 2
    midY = ys[midIdx]
    midX = solveForX(polyFunc, minX, maxX, midY, epsilon)
    lowYs = ys[:midIdx]
    highYs = ys[midIdx+1:]
    return solveForManyXs(polyFunc, minX, midX, lowYs, epsilon) + \
    [midX] + \
    solveForManyXs(polyFunc, midX, maxX, highYs, epsilon)

ys = [1, 2, 3]
print solveForManyXs(lambda x: x*x, 0, 100, ys, 0.01)
输出:

1.416015625
[1.0000884532928467, 1.41448974609375, 1.7318960977718234]

这比数学SE更适合这里。在数学SE中,你只会得到答案,告诉你在给定y值的情况下解x的方程。在这里,可能有人可以通过编程方式帮助您完成这项工作,或者提出更好的解决方案。您使用的是哪种特定的编程语言?我更喜欢Python,因为这样做很有趣,因为您不必处理样板文件和较低级别的内容。不过,我会接受任何语言的解决方案,甚至是朝着正确方向的总体推进。我一直认为沿着这些思路做一些事情会很好,但我想知道:找到第一个m值的最快方法是简单地重复m次吗?当你在寻找一个单一的值时,这肯定是有效的,但在一般情况下,这似乎是多余的工作。一个快速的优化是,如果你在寻找N个X值,那么首先插入(N/2)个Y值。然后使用X(N/2)作为N/2下每个Y值的最大值,以及N/2以上每个Y值的最小值。