衡量 算法效率的常用标准是速度!
算法入门
插入排序思想:从第二个开始,将每个作为关键字,与前面一个做对比,若前面比key大,互换,通过循环,保持之前的顺序是排好的。
伪代码:insertion-sort(A)
w-s for j =2 to leng[A] n-1 i = j -1; n-1 while i>0 and A[i] > key (n-1)!=(n^2-n)/2 do A[i+1] <- A[i] i <- i-1 A[i+1] = key n-1
T(n) = O(n^2)
循环不变式正确性的证明:初始化,保持,终止(可以判断一般的递归式使用循环的正确性)
最坏情况(w-s)和平均情况(a-w),一般情况下算最坏情况。
增长的量级,即增长率。最坏情况表示Ө记号。
算法设计
分治法:分解,解决,合并。
合并排序思想:将n个元素分解成个含n/2个元素的子序列
用合并排序法对两个子序列递归地排序
合并两个已排序的两个子序列
Merge -sort(A,p,r) a-s if p < r then p = (p+r)/2 分解 lg(n) Merge -sort(A,p,q) 解决 T(n/2) Merge -sort(A,p+1,r) Merge -sort(A,p,q,r) 合并 O(n)运行时间 o(1) n = 1
T(n) = 2T(n/2) + o(n) n >1
当n > 1 时,T(n) = o(nlg(n)),可采用主定理来证明,也可以用“递归树”来证明。
每一层的代价是cn,而树的高是lg(n),故其总代价是O(cnlg(n))
练习:冒泡排序:重复交换相邻的两个反序元素
Bubblesort(A) w-s for i = i to leng(A) n do for j = leng(A) to i+1 n-1 if A[j] < A[j-1] then exchange A[j] <-> A[j-1] n!1 n =1
T(n) = O(n^2) n >1
函数的增长
表示: Ө记号 E c1, c2, n0, 使任意n>= n0,有0<= c1g(n) <=f(n)<= c2g(n)
O记号 渐进上界的时候用O(g(n))来表示: cg(n) >= f(n) >= 0
Ω记号 渐进下界的时候用Ω(g(n))来表示:f(n) >= cg(n)>= 0
o记号 非渐进紧确的上界:cg(n) >= f(n) >= 0 例:2n = o(n^2),2n^2 != o(n^2)
标准记号和常用函数:下取整和上取整
取摸运算:若(a mod n) = (b mod n) 则可以写 a≡b(mod n)
对数:lg(n) =log 2(n)(2为底)
ln(n) = log e(n)
lg^k(n) = (lg(n))^k
阶乘
函数迭代
多重对数函数:lg*(n) lg*(16) =3 定义:lg*(n) = min (i>= 0:lg^i(n) <= 1)
递归式
三种递归式的方法:
代换法:假设某界存在,用数学归纳法证明
递归树方法:将递归式转换成树形结构,再利用对合式限界来解出递归式
主方法:T(n) = aT(n/b) +f(n)
主方法三种情况:若对于某常数ε>0,有f(n) = O(n^(log_b(a)-ε)),则T(n)=Ө(n^(log_b(a)));
若f(n)=Ө(n^(log_b(a))),则T(n) = Ө(n^(log_b(a)) * lgn);
若对某常数ε>0,有f(n)=Ω(n^(log_b(a) + ε)),且对常数c<1与足够大的n,有a*f(n/b) ≤ c*f(n),则T(n) = Ө(f(n))。
概率分析和随机算法
雇佣问题
随机算法
指示器随机变量:给定一个样本空间S和事件A,那么事件A对应的指示器变量I{A}的定义为:
I{A} = 1 如果A发生的话
or = 0 如果A不发生的话
变量X_H来对应正面朝上的情况,则:
X_H = I{H} = 1 如果H发生,即正面朝上
or = 0 如果T发生,即背面朝上
指示器随机变量的期望值等于对应事件发生的概率。