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