演算法筆記02--歸納法之多項式求值(Horner規則)

兔美醬xz發表於2014-11-23

多項式求值

假設有n+2個實數a0,a1,...,an和x的序列,求多項式

p_nx = a_nx^n + a_n-1x^n-1 + ...+ a_1x + a_0;

則需要乘法:n+n-1 + ...+2+1 = n(n+1)/2

需要加法:n

可見演算法效率為O(n^2)

而p_nx = ((...((((a_n)x + a_n-1)x + a_n-2)x + a_n-3)....)x + a_1x) + a_0

因此思路:

p_0x = a_n

p_1x = xp_0x + a_n-1

p_2x = xp_2x + a_n-2

......

p_nx = xp_n-1x + a_0

時間複雜度:

令T(n)為n次項所需加法和乘法之和,這裡假設乘法為O(1)

T(1)= 1+1 = 2

T(2)= T(1)+ 1 +1 = T(1)+2

T(n)= T(n-1) + 1 +1 = T(n-1) + 2

因此 T(n)= T(1) + 2*(n-1) = 2*n = n +n

即乘法n次,加法n次,時間複雜度O(n)

程式碼:

#include<iostream>

using namespace std;

int solve_px(int a[],int x, int n)
{
	int px = a[0];
	for(int i =1; i<n;i++)
	{
		px = px*x + a[i];
	}
	return px;
}

int main()
{
	//px4 = 3*x^4+6*x^3+2*x^2+5*x+6
	//px0 =         3(a[0])
	//px1 = x*px0 + 6(a[1])
	//px2 = x*px1 + 2(a[2])
	//px3 = x*px2 + 5(a[3])
	//px4 = x*px3 + 6(a[4])

	int a[5] = {3,6,2,5,6};
	int x = 2;
	cout<<solve_px(a,x,5)<<endl;
	return 1;
}

相關文章