学习目的:
1. 掌握各数据结构要解决的问题,优缺点
2. 算法设计策略
3. 常用算法要解决的问题,以及如何选择
4. 可以使用c或 c++编写算法,java通过jni进行调用c程序
第一部分基础知识
第一章 算法作用
没有一种数据结构适用所有目的,所以明白数据结构的优缺点很重要
第二章 算法入门
1. 循环不变式用来证明递归的正确性
2. 对于一个算法,一般只考察其最坏情况的运行时间,原因如下:
1. 最坏情况是一个上界
2. 某些算法最坏情况非常频繁
3. 大致上来看,最坏情况和平均情况一样差
分治策略
将原问题分解为n个较小规模的相似子问题,递归地解决完小问题,再合并其结果,就得到原问题的解,步骤如下:
1. divide
2. conquer :解决子问题
3. combine
4. 两个数组A和B存放 n位2进制整数,相加结果存放在n+1位的C中
up=0;
for i=0 to n
C[i]=(A[i]+B[i]+up)%2
up=(A[i]+B[i]+up)/2
c[n]=up
归并排序
对3,41,52,26,38,57,9,49进行排序
3,9,26,28,41,49,52,57
3,26,41,52 9,28,49,57
3,41 26,52 38,57 9,49
3 41 52 26 38 57 9 49
分解:将数据分解为两部分 1
解决:对每部分递归调用归并排序 2*T(n/2)
合并:合并两个有序的子序列 n
所以时间为 T(n) =2*T(n/2)+n
分治法应用案例:
大整数乘法:A,B为n位的二进制数,使用特殊的分治策略,可达到 O(n)^1.59
矩阵相乘:使用 Strassen 分治策略
求 X的n次方 x^n=X^(n/2)*X^(n/2) 时间为 lgn
斐波那契数列 (1 1)的n次方= (F[n+1] F[n])
(1 0) (F[n] F[n-1]) 复杂度为 lgn
解题思路:
若题目规定了时间限制,则使用主定理推出该使用什么样的递归式
第四章 递归式
求解方法
代换法:主要是用数学归纳法证明该解的存在性
递归树:画出每层代价的树,猜测递归式的解
主方法:求解递归式的公式:非常之强大
第五章 概率分析和随机算法
数组随机化算法
for i=1 to n
swap a[i] 与 a[random(i+1, Length(a) ) ]
如快排中,随机选取种子数来向快排中加入随机化的成分