绪论
算法理论的两大论题:
- 算法设计—对于一个问题如何设计一个有效的算法
- 算法分析—如何评价或判断一个算法的优劣
问题的求解过程:
分析问题→设计算法→编写程序→整理结果
算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。
算法的五大特性:
⑴ 输入:一个算法有零个或多个输入。
⑵ 输出:一个算法有一个或多个输出。
⑶ 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
⑷ 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
⑸ 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
算法的描述方法
⑴ 自然语言
⑵ 流程图
⑶ 程序设计语言
⑷ 伪代码——算法语言
慕课:排序算法的效率:
以元素比较作基本运算
货郎问题
问题:有n个城市,已知任两个城市之间的距
离。求一条每个城市恰好经过1次的回路,使得总长度最小。
-
输入:
有穷个城市的集合 C = { c1, c2, …, cn},距离 d(ci,cj) = d(cj,ci)∈Z+,1<=i < j <=n -
解:
1, 2 …, n 的排列 k1, k2, …, kn使得:
-
现状:至今没找到有效的算法
0-1背包问题
问题:有n个件物品要装入背包,第i 件物品的重量 wi, 价值vi,i=1,2,…,n. 背包最多允许装入的重量为B, 问如何选择装入背包的物品,使得总价值达到最大?
- 实例:n=4,B=6,物品的重量和价值如下:
- 问题的解:0-1向量 <x1, x2, …, xn>
xi=1 <=> 物品 i 装入背包
双机调度
问题:有n项任务, 任务 i 的加工时间为 ti , ti∈Z+, i=1,2,…,n。用两台相同的机器加工,从0时刻开始计时,完成时间是后停止加工机器的停机时间。问如何把这些任务分配到两台机器上,使得完成时间达到最小?
- 实例:
任务集 S ={1,2,3,4,5,6}
t1=3,t2=10,t3=6,t4=2,t5=1,t6=7
解:
机器1的任务:1, 2, 4
机器2的任务:3, 5, 6
完成时间 : max{ 3+10+2, 6+1+7 }=15 - 解: 0-1向量 <x1, x2, …, xn>, xi=1表示任务i分配到第一台机器,i =1,2,…,n。
不妨设机器1的加工时间<=机器2的加工时间,令T=t1+t2+…+tn,D=⌊T/2⌋ ,机器1的加工时间不超过D,且达到最大。
NP-hard问题
•这样的问题有数千个,大量存在于各个应用领域。
•至今没找到有效算法:现有的算法的运行时间是输入规模的指数或更高阶函数。
•至今没有人能够证明对于这类问题不存在多项式时间的算法。
•从是否存在多项式时间算法的角度看,这些问题彼此是等价的。这些问题的难度处于可有效计算的边界。