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