一、算法的概念
1、算法 :解决问题的一种方法或一个过程,是一个由若干运 算或指令组成的有穷序列
2、算法—问题 :求解问题的算法可以看作是输入实例与输出之间的函数
3、算法的特点 :input, output(输入,输出)
Deterministic (确定性)
Feasible(可行性)
Finite(有穷性)
二、算法的正确性
1、正确的算法 :对任意一个输入,算法能得到一个正确的输出
2、循环不变量 :与程序变量有关的一个语句,它在循环刚开始前,以及在 循环的每个迭代执行后为真,特别是在循环结束后,仍然 为真。
3、 插入排序的循环不变量 :在for循环第j个迭代执行前,子数组A[1.. j-1]由最初A[1.. j-1]中的元素构成,不过现在是有序的。
4、利用循环不变量证明算法的正确性
三、算法的效率:
- 最好情形时间复杂度(顺序)
- 平均情形时间复杂度 A(n) :在给定同样规模为 n 的输入实例的概率分布下,算法求解这些实例所需要的平均时间
- 最坏情形时间复杂度 W(n) (逆序):算法求解输入规模为 n 的实例所需要的最长时间
最坏情形是任何规模为的问题实例运W行时间的上界,即任何规模为的实例,其运行时间都不会超过最坏情形的运行时间。 知道最坏情形运行时间后,我们就知道算法最差到什么程度。对某些算法,最坏情形经常发生。例如在某个数据库中查询不存在的某条数据就是查询算法的最坏情形,平均情形有时跟最坏情形差不多。
四、算法的伪码表示:
- 赋值语句:←
- 分支语句:if …then … [else…]
- 循环语句:while, for,repeat until
- 转向语句:goto
- 输出语句:return
- 调用:直接写过程的名字
- 注释://…
五、问题计算的复杂度的界定--排序问题:
算法 | 最坏情况下 | 平均情形下 |
---|---|---|
插入排序 | O(n^2) | O(n^2) |
冒泡排序 | O(n^2) | O(n^2) |
快速排序 | O(n^2) | O(nlogn) |
堆排序 | O(nlogn) | O(nlogn) |
二分归并排序 | O(nlogn) | O(nlogn) |
六、问题求解的关键:
• 建模:对输入参数和解给出形式化或半形式化的描述
• 设计算法: 采用什么算法设计技术 正确性——是否对所有的实例都得 到正确的解
• 分析算法——效率
七、函数的渐近的界:
- 大O符号
定义:设 f 和 g是定义域为自然数集 N上的函数. 若存在正数 c 和 n0,使得 对一切 n > n0有
0 < f(n) < c g(n) 成立,
则称 f(n) 的渐近的上界是 g(n), 记作 f (n) = O(g(n))
例子:设 f(n) = n^2 + n,则
f(n)=O(n^2),取 c = 2,n0 =1 即可
f(n)=O(n^3),取 c = 1,n0 =2 即可
1. f (n) = O(g(n)) ,f(n)的阶不高于g(n)的阶.
2. 可能存在多个正数c,只要指出一个即可.
3. 对前面有限个值可以不满足不等式.
4. 常函数可以写作O(1).
- 大Ω符号
定义:设 f 和 g是定义域为自然数集 N上的函数. 若存在正数 c 和 n0,使 得对一切 n >= n0有
0 <= cg(n) <= f(n) 成立,
则称 f(n) 的渐近的下界是 g(n), 记作 f (n) = Ω (g(n))
例子:
设 f(n) = n^2 + n,则
f(n) = Ω (n^2), 取 c = 1, n0 =1即可
f(n) = Ω (100n), 取 c=1/100, n0 =1即可
1. f (n)= Ω (g(n)),f(n)的阶不低于g(n)的阶.
2. 可能存在多个正数c,指出一个即可.
3. 对前面有限个 n 值可以不满足上述不等式.
- 小o符号
定义 :设 f 和 g是定义域为自然数集 N上 的函数. 若对于任意正数 c 都存在 n0,使得对一切 n >= n0有
0 <= f(n) < c g(n) 成立,
则记作 f (n) = o(g(n))
例子:
f(n)=n^2+n,则f(n)=o(n^3)例子 c>=1显然成立,因为n^2+n<cn^3(n0=2)
任给1>c >0, 取 n0 > [2/c] 即可. 因为cn >= cn0 > 2 (当n > n0)
n^2+n < 2n^2 < cn^3
1. f (n) = o(g(n)) , f(n)的阶低于g(n)的阶
2. 对不同正数c, n0不一样. c越小n0越大
3. 对前面有限个 n 值可以不满足不等式
- 小ω符号
定义:设 f 和 g是定义域为自然数集 N上 的函数. 若对于任意正数 c 都存在 n0,使 得对一切 n >= n0有
0 <= cg(n) < f(n) 成立,
则记作f (n) = ω (g(n))
例子:
设 f (n) = n^2 + n,则f (n) = ω (n),不能写 f (n) =ω (n^2),因为取 c = 2,不存在n0使得对一切 n> n0有下式成立 c n^2 = 2n^2< n^2 + n
1. f (n)= ω (g(n)), f (n)的阶高于g(n) 的阶.
2. 对不同的正数c, n0不等,c 越大n0 越大.
3. 对前面有限个 n 值可以 不满足不等式.
- Θ符号
若 f (n) = O (g(n)) 且 f (n) = Ω (g(n)), 则记作 f (n) =Θ (g(n))
例子:f(n) =n^2 + n, g(n) =100n^2,那么有 f (n) =Θ (g(n))
1. f(n) 的阶与 g(n) 的阶相等.
2. 对前面有限个n 值可以不满足条件.