Algorithm 给定一个递增多项式,如何有效地找到y的固定区间的x值?
问题:给定一个保证从x=0增加到xmax的n次多项式(系数为a0到an-1),找到具有等间距y值的前m个点(即对于所有i,yi-yi-1==c)的最有效算法是什么 示例:如果我希望间距为c=1,并且我的多项式是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中遇到了这些问题(问
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值的最小值。