Week_02
一、大纲
二、序列求和的方法
1.等比数列与调和级数求和公式
∑ k = 0 ∞ a q k = a 1 − q ( q < 1 ) , ∑ k = 1 n 1 k = ln n + O ( 1 ) \sum_{k=0}^{\infty}aq^k = \frac{a}{1-q} \ (q<1) \ \ \ \ \ \ \ \ \ , \ \ \ \ \ \ \ \ \ \ \ \sum_{k=1}^n \frac1 k = \ln n + O(1) \\ k=0∑∞aqk=1−qa (q<1) , k=1∑nk1=lnn+O(1)
∑ t = 1 k t 2 t − 1 = ( k − 1 ) 2 k + 1 \sum_{t=1}^k t \ 2^{t-1} = (k-1)2^k+1 t=1∑kt 2t−1=(k−1)2k+1
2.二分查找
//算法 BinarySearch(T, l, r, x)
//输入: 数组T, 下标从l到x;数x
//输出: j
l=1; r=n;
while l<=r do
m = (l+r)/2;
if T[m]==x then return m;
else if T[m]>x then r=m-1;
else l=m+1;
return 0;
分析:假设 n = 2 k − 1 n = 2^k-1 n=2k−1 ,则输入有 2 n + 1 2n+1 2n+1 种
(1) x x x 在 T T T 中:
x = T [ 1 ] x = T [ 2 ] … x = T [ n − 1 ] x = T [ n ] x = T[1] \\ x = T[2] \\ \dots \\ x = T[n-1]\\ x = T[n] \\ x=T[1]x=T[2]…x=T[n−1]x=T[n]
(2) x x x 不在 T T T 中:
x < T [ 1 ] T [ 1 ] < x < T [ 2 ] … T [ n − 1 ] < x < T [ n ] T [ n ] < x x < T[1] \\ T[1] < x < T[2] \\ \dots \\ T[n-1] < x < T[n] \\ T[n] < x x<T[1]T[1]<x<T[2]…T[n−1]<x<T[n]T[n]<x
比较t次的输入个数:
对 t = 1 , 2 , … , k − 1 t=1,2,\dots,k-1 t=1,2,…,k−1 ,比较 t t t 次: 2 t − 1 2^{t-1} 2t−1 个;
比较 k k k 次的输入有 2 k − 1 + n + 1 2^{k-1}+n+1 2k−1+n+1 个
总次数:对每个输入乘以次数并求和
平均时间复杂度:
假设 n = 2 k − 1 n=2^k -1 n=2k−1 ,各种输入概率相等
A ( n ) = 1 2 n + 1 [ ∑ t = 1 k − 1 t 2 t − 1 + k ( 2 k − 1 + n + 1 ) ] = ⌊ log n ⌋ + 1 2 A(n) = \frac1{2n+1}[\sum_{t=1}^{k-1}t2^{t-1}+k(2^{k-1}+n+1)] \\ =\lfloor \log n \rfloor +\frac12 A(n)=2n+11[t=1∑k−1t2t−1+k(2k−1+n+1)]=⌊logn⌋+21
3.估计和式上界的放大法
放大法:
- ∑ k = 1 n a k ≤ n a m a x \sum_{k=1}^{n} a_k \le na_{max} ∑k=1nak≤namax
- 假设存在常数 r < 1 r<1 r<1 ,使得对一切 k ≥ 0 k\ge 0 k≥0 有 a k + 1 / a k ≤ r a_{k+1}/a_k \le r ak+1/ak≤r 成立
∑ k = 0 n a k ≤ ∑ k = 0 ∞ a 0 r k = a 0 ∑ k = 0 ∞ r k = a 0 1 − r \sum_{k=0}^{n}a_k \le \sum_{k=0}^{\infty}a_0r^k = a_0\sum_{k=0}^{\infty}r^k = \frac{a_0}{1-r} k=0∑nak≤k=0∑∞a0rk=a