《数据结构与算法分析Java语言描述》第一章1.2与1.3节读书笔记
1. 数学知识复习
1.1 指数
XAXB=XA+B
XBXA=XA−B
1.2对数
在计算机科学中,除非特别声明。否则所有对数都是以2为底。
定理1.1:
logAB=logCAlogCB;A,B,C>0,A=1
定理1.2:
logAB=logA+logB;A,B>0
推导:
logA/B=logA−logB
log(AB)=BlogA
logX<X对所有的X>0成立
1.3 级数
i=0∑n2i=2N+1−1
i=0∑nAi=A−1AN+1−1
如果0<A<1 则
i=1∑NAi≤1−A1
i=1∑Ni=2N(N+1)≈2N2
i=1∑Ni2=6N(N+1)(2N+1)≈3N3
i=1∑Nik≈∣k+1∣Nk+1k=−1
当k=-1时,上面的公式不成立,需要下面的公式。HN为调和 和,下面近似式的误差γ≈0.57721566,称为欧拉常数
HN=i=1∑Ni1≈logeN
以下一般代数运算:
i=1∑Nf(N)=Nf(N)
i=n0∑Nf(i)=i=1∑Nf(i)−i=1∑n0−1f(i)
1.4 模运算
如果A-B整除以N,那么A与B模N的余数是相同的。记作A≡B(mod N)。
1.5 证明方法
1. 归纳证明法
- 第一步证明基准情形,确定定理对最基准的值的正确性。
- 进行归纳假设,假设定理对直到有限数 k 的的所有情况都是成立的。
- 依据这个假设证明定理对下一个值(k+1)成立。
1.1证明演示
证明斐波那契数列,F0=1, F1=1, F2=2, F3=3, F4=5, …, ,Fi=Fi−1+Fi−2, 满足对i≥1,有Fi<(5/3)i。
证明:
- 基准情形:F1=1<35,F2=2<925
- 归纳假设:假设定理对于i=1,2,…,k成立,则有Fk<(5/3)k
- 证明k+1成立:
- 由定义有: Fk+1=Fk+Fk−1
- 则有:Fk+1<(5/3)k+(5/3)k−1=(3/5)(5/3)k+1+(3/5)2(5/3)k+1=(3/5+9/25)(5/3)k+1<(5/3)k+1
2. 反证法
- 假设某个定理不成立。
- 证明该假设导致某个已知的性质不成立,证明原假设是错误的(定理成立)。
2.1 证明演示:
证明存在无穷多个素数。
证明:
1.假设定理不成立:假设不存在无穷多个素数。
2.推导某个已知性质不成立:
- 由1的假设有最大素数Pk,令P1,P2,...,Pk依序排列。
- 考虑有 : N=P1P2P3...Pk+1
- 显然,N>Pk,根据假设(Pk为最大素数,则N比不为素数)。但是N不能整除以P1,P2,...,Pk。产生矛盾,因为每一个整数要么是素数,要么是素数的乘积。
- 因此Pk是最大的素数假设不成立,意味定理成立。
2. 递归简论
2.1 递归四条基本法则:
- 基准情形:必须包含某些基准情形,无需递归就能解出。(程序出栈条件)
- 不断推进:每一次递归,必须朝着基准情形推进
- 设计法则:假设所有递归调用都能运行
- 合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。(在计算F(n-1)时同时调用了F(n-2),而同时原式也需要调用一次F(n-2),重复)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class RecurdiveTest {
public static void main(String[] args) { int res = f(4); System.out.println(res); }
public static int f(int x) { if (x == 0) { return 0; } else { return 2 * f(x-1) + x * x; } } }
|