插值就是找一个多项式过几个已知的点。
使用待定系数法+高斯消元可以做到
O(n3)
。这显然不是最优解,不然标签就是高斯消元了= =
下面介绍拉格朗日插值法。
我们考虑一个多项式函数
f(x)
,其中
f(xi)=yi
。再考虑一个一个多项式
g(x)
,其中
g(xi)=zi
。他们的和函数
h(x)
,即这两个多项式的和,可以表示成
h(xi)=yi+zi
。
那么,举个例子,如果我们找到一个多项式
y=k1x+b1
过
(1,3)和(2,0)
,还有一个多项式
y=k2x+b2
过
(1,0)和(2,1)
,把这两个多项式加起来,就可以的到一个过
(1,3)和(2,1)
的多项式。
假如我们要为n个点做一个n-1次多项式,设这n个点为
(xi,yi)
,这个多项式可以看做n个下面的函数的和。其中,第
i
个多项式函数
fi
除了在
fi(xi)=yi
外,其他的位置取值都为0,即
fi(xj)=0(i≠j)
。
大家应该学过二次函数的零点式,即
f(x)=a(x−x1)(x−x2)
显然在
f(x)=0
时,必有
x1,x2
两解。推而广之,一个有n个顶点的n次多项式可以写为,
f(x)=a(x−x1)(x−x2)……(x−xn)
那么插值用的第i个多项式可写作为
fi(x)=a∏i≠j(x−xj)
又有
fi(xi)=yi
,带入
xi
,可得
a=yi∏i≠j(xi−xj)
所以
fi(x)=yi∗∏i≠j(x−xj)∏i≠j(xi−xj)
所以,插值总式为,
f(x)=∑i=1nyi∗∏i≠j(x−xj)∏i≠j(xi−xj)
也可以写作,
f(x)=∑i=1na∗∏i≠j(x−xj)
显然这时候预处理
a
要
O(n2)
,求一次值也要
O(n2)
如果我们先预处理出
D=∏ni=1(x−xi)
,
Dx−xi=∏i≠j(x−xj)
,就可以
O(n)
求值。
假如
xi
为等差数列,那么也可以通过预处理阶乘跑出
∏i≠j(xi−xj)
,从而做到
O(n)
插值,
O(n)
求值。
也就是告诉我们,当
xi
可以由我们定的时候,显然要按顺序算啦。