前言
算法中有很多会用到归纳的思想,如递归等算法的基础都是归纳。今天来看看归纳的主要思想以及基于归纳的一些算法设计。
归纳
证明当n = 1时命题成立。
证明如果在n = k时命题成立,那么可以推导出在n = k+1时命题也成立。(m代表任意自然数)
这种方法的原理在于:首先证明在某个起点值时命题成立,然后证明从一个值到下一个值的过程有效。当这两点都已经证明,那么任意值都可以通过反复使用这个方法推导出来。
算法样例
1、多项式求解
Pn(x) = anxn+an−1xn+…+a1x+a0
求Pn(x)
归纳假设:我们已求解出Pn-1(x) = an−1xn+…+a1x+a0
则Pn(x) = Pn-1(x) + an * x^n
Tn = Tn + n + 1
Input:a0, a1, a2 … an Output: ans Begin int P(n){ if(n == 0){ return a[0]; } else{ P(n) = P(n - 1) + a[n] * x ^ n; } } ans = P(n) end
增强归纳
同时归纳P(n)与x的n次方
Input:a0, a1, a2 … an Output: ans Begin int x[n] X[0] = 1 X[1] = x int P(n){ if(n == 0){ return a[0]; } else{ x[n] = x[n - 1] * x; P(n) = P(n - 1) + a[n] * x[n]; } } Ans = P(n) End
Tn = Tn-1 + 3
2n次乘法,n次加法
O(3n)
优化
Pn-1(x) = anxn −1+an−1xn+…+a1x
Pn(x) = P(n) * x + a[N - n]
Tn = Tn- 1 + 2
N 次乘法,n次加法
Input: a1, a2, ... an Output: P Begin P = an; for(i = 1 to n){ P = x * P + a[n - i]; } } end
O(2n)
2. 最大导出子图
找G的最大导出子图H, H 中所有顶点的度大于或等于k
导出子图
含有原图一部分点,但点在的边一定在
生成子图
包含原图所有点,但不一定所有边
归纳假设
顶点数少于n的,我们可以找到它的导出子图
对于n的图
遍历所有点
若全都度>= k 则其就是最大的导出