数据与算法教程课件--15 算法设计基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

归并排序最坏情况比较和移动次数
8
例:任务分配问题
◦ 假设有 个任务需要分配给 个人执行,每个任务
只分配给一个人,每个人只分配一个任务,且第j
个任务分配给第 个人的成本是 , (1 ,

),任务分配问题要求找出总成本最小分配方案。

任务1 任务2 任务3

9
2
7 人员1
C= 6
4
3 人员2
5
8
1 人员3
9
例:任务分配问题
◦ 用蛮力法解决任务分配问题要生成整数1~ 的全排
列,然后把成本矩阵中的相应元素相加来求得每种
分配方案的总成本,最后选出具有最小和的方案;

序号
分配方案
总成本

1
1, 2, 3
9+4+1=14

2
1, 3, 2
3
2, 1, 3
9+3+8=20 2+6+1=9
4
2, 3, 1
2+3+5=10
5
3, 1, 2
7+6+8=21
6
3, 2, 1
7+4+5=16
考虑全部排列复杂度: !
10
例:求凸包问题
◦ 一个点集S的凸包是包含S的最小凸集合;
◦ 给定平面上 的点的坐标,求其凸包;实际上是包

含所有这些点的最小凸多边形.
力 法
P1
P2
P3
P8
P5
P4
P9
P6
P7
11
例:求凸包问题
◦ 求凸包的目标:找到凸多边形的顶点(极点);.
为平衡(balancing)子问题,一般情况下平衡子问题

总是比子问题规模不等的做法要好;

◦ 假设规模为 的问题时间复杂度为 ,采用分治

法将问题分解成为若干个规模为 / 的子问题,其 中 个需要求解,设规模为1的问题耗时1个单位,

而将子问题解合并需时 ,则有分治递推公式:

T (n)
=
O(1) kT (n / m) +
◦ 蛮力法基本思想:对于一个由 个点构成的集合

中的两个点 和 ,当且当该集合中的其他点都位 于穿过这两点的直线的同一边时,它们的连线是该

集合凸包边界的一部分。对每一对顶点都检验一遍

后,满足条件的线段构成了该凸包的边界;
◦ 所有不同的点共组成了
1 /2边,对每条边都
要对其他 2个顶点做位置判断,时间复杂性是
65 65 69 69 71 73 83 79 82 84 76 78 77 80 88
... ...
65 65 69 69 71 73 76 77 78 79 80 82 83 84 88
65 65 69 69 71 73 76 77 78 79 80 82 83 84 88
65 65 69 69 71 73 76 77 78 79 80 82 83 84 88
可作为问题时间性能的底限来衡量更高效的算法.
5
例:顺序查找
◦ 顺序查找从表的一端向另一端逐个将元素与给定值
进行比较,若相等,则查找成功,给出该元素在表
中的位置;若整个表检测完仍未找到与给定值相等

的元素,则查找失败,给出失败信息。

0 1 23 456 7 8 9

10 15 24 6 12 35 40 98 55
比较和移动次数最坏情况


65 83 79 82 84 73 78 71 69 88 65 77 80 76 69 65 65 83 79 82 84 73 78 71 69 88 69 77 80 76

65 65 69 83 79 82 84 73 78 71 69 88 76 77 80

65 65 69 69 83 79 82 84 73 78 71 76 88 77 80 65 65 69 69 71 83 79 82 84 73 78 76 77 88 80

◦ 分治法适合借助递归形式实现;有时可以降低问题

的复杂度.

T(n)
=
n
T(n/m)
T(n/m)
… T(n/m) … T(n/m)
……
14
分治法求解问题特征
◦ 问题规模小到一定的程度就可以容易地解决;一般
的问题都具备该特性;

◦ 问题可以分解为若干个规模较小的相同问题,即该

问题具有最优子结构性质;是分治法的前提,反映
f
(n)
n =1 n >1

可以解出:T (n)
=
n logm k
logm n−1
+ kj
f (n / m j )
j=0
16
T (n)
=
O(1) kT (n / m) +
f
(n)
n =1 n >1
递 归
T
(n
/
m)
=
kT
(n
/
Hale Waihona Puke Baidu
O(1) m2) +
f
(n
/
m)
n/m =1 n/m >1
例:计算


总共 1次乘法,更好的方法?

◦ 蛮力法一般采用遍历,依次处理每个元素;

◦ 虽然蛮力算法通常效率不高,但也是一种重要的算
法设计技术:
理论上蛮力法可以解决可计算领域的各种问题;常用来解 决一些较小规模的问题。
对于一些重要的问题蛮力法可以产生一些合理的算法,具 备一定实用价值,且不受问题规模的限制;

了递归思想的应用;

◦ 利用问题分解出的子问题的解可以合并为该问题的 解,是使用分治法的关键特征;

◦ 问题所分解出的各个子问题是相互独立的,即子问
题之间不包含公共的子问题;这条特征涉及到分治
法的效率,如果各子问题是不独立的,则分治法要
做许多不必要的工作,重复地解公共子问题.
15
分治法分析
◦ 使用分治法时,最好使子问题的规模大致相同,称
查找方向
i
平均比较次数 折半查找平均比较次数
6
例:模式串匹配
◦ 将模式串T和主串S每个位置开始的子串都进行比 较;最坏比较次数

如何有效地减少比较次数

如何有效地提高

如何有效地提高
如何有效地提高
如何有效地提高
如何有效地提高
KMP算法最坏比较次数
7
例:冒泡排序
◦ 逐个比较元素,每趟将最小的元素移动到正确位置;
Previously …
优化问题 凸优化 最速下降法 牛顿法
2






算法设计基础

法》
1.4.3 2.4.3 5.5.4 5.6.4
分治 贪心 动态规划
3
• 蛮力法 • 递归与分治 • 贪心法 • 动态规划
4
蛮力法(brute-force)思想
◦ 基于问题的定义描述,直接求解问题;
3.
12
• 蛮力法 • 递归与分治 • 贪心法 • 动态规划
13
分治法(divide and conquer)
◦ 将问题分解成多个同类子问题,如子问题规模仍然
不够小,则再划分为多个子问题;如此递归的进行

下去,子问题规模足够小,很容易求出解;

◦ 求出的小规模问题解合并为一个更大规模的问题解, 自底向上逐步求出原来问题的解;即分而治之;
相关文档
最新文档