算法分析习题课PPT课件

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

正整数K的不同的划分的个数叫做的划分数,记做p(K)。
比如对于6,可以进行如下不同的划分:
6;
------最大加数为6
5+1;
------最大加数为5
4+2; 4+1+1;
------最大加数为4
3+3;3+2+1;3+1+1+1;
------最大加数为3
2+2+2;2+2+1+1;2+1+1+1+1; ------最大加数为2
1+1+1+1+1+1+1
------最大加数为1
因此, p(K) =11。也就是说,6的划分数是11。
请设计一个分治算法,对于一个给定的整数(输入),求出该整数的划分数
(输出)。
8
.
分析 K=k1+k2+…+kp,其中(k1>=k2>=…>=kp)
比如对于6,可以进行如下不同的划分:
6;
------最大加数为6
End for
3
For j = 2 to m
4
For i = 2 to K
If i < j
p[i,j] =p[I,i];
5
If i == j
6
p[i,j] = 1 + p [i,i-1];
7
If i > j
p[i,j] = p[i, j-1] + p[i- j, j];
End for
End for
8
System.out.print(a[i]); } System.out.println(); } else { for (int i = k; i <= m; i++) {
swap(a, k, i); perm(a, k + 1, m); swap(a, k, i); }
public static void main(String[] args) { Integer[] a = new Integer[6]; for (int i = 0; i < a.length; i++) { a[i] = new Integer(i); } perm(a, 0, 5);
现在的问题,转化为如何求b[ j]? A[1]A[2]……A[ j-1] | A[ j]
因此:
A[ j]
if b[ j-1] <=0
A[ j]+b[ j-1] if b[ j-1] >0
换句话说: b[ j] = max(A[ j] + b[ j-1] , A[ j]) 初始情形: b[1] = A[1];
也即1+1+.... +1+1。
(2):当m>K时,等价于m=K。即p(K,m) = p(K,K)。 (3):当m=K的时候,正整数K的划分数 = 最大加数为K的划分数(1) +最
大加数不大于K-1的划分数( p(K,K-1))。
(4):当K>m>1的时候,正整数K的最大加数不大于m的划分数=最大加数
+
a>x
a
a=x
a<x
1
.
输入:已经排序(非降序)的整型数组A[1…n],整数x 输出:若A中存在两个整数的和恰好为x,返回true; 否则返回
false 1. return sumX(1,n)
Procedure:sumX(s,t)
1. if s = t or s > t
2.
;
3. else if A[s] + A[t] = x
3
.
时间复杂度分析
T ( n ) 1 T ( n 1 ) 1 1 T ( n 2 ) ( n )
注意: 默认A[1…n]是非降序。如果是非升序,上述算法还对么? 如果不对,该怎么修改?
4
.
排列问题
已知集合R={r1, r2,..., rn},且集合中没有相同的元素。 请设计一个算法生成集合R 中n 个元素的全排列。
划分为j个子集
可以有j种选择
1 23
i-1

划分为j-1个子集
F(i, j) = j * F(i-1, j) + F(i-1, j1)
i
20
.
连续子序列的最大和
给定一个连续的整数序列A[1],A[2],A[3],……….,A[n]。 计算它的连续序列和的最大值。 例如: 整数数组 A={-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ; 连续序列: A[1]A[2],其和 A[1]+A[2] = -1 。 …… 连续序列: A[2]A[3]A[4]A[5] ,其和
将字符串所用的最少操作次数称为字符串请设计一个有效算法对于给定的任意两个字符串16分析假设aa的长度为m
.
练习题
令A[1…n]是一个包含n个整数的已排序数组(非降序)。给定一 个整数x。设计一个时间复杂度为O(n)的算法,来确定A中是否 存在这样两个整数,它们的和恰好等于x.
3 5 9 10 11 20 22 24 30 37
16
.
j
if i= = 0
d[i,j] id[i1 ,j1 ]
if j= = 0 if i> 0& & j> 0& & ai bj
m in{d[i,j1 ]1 ,d[i1 ,j]1 ,d[i1 ,j1 ]1 } if i> 0& & j> 0& & aibj
17
.
集合划分问题
给定一个集合X,且集合中元素互不相同。集合P由X的子集构 成。若P中的元素满足以下性质: 1. P 中的任一元素不是空集。 2. P 中的元素的并集等于 X。 3. P 中的任何两个元素的交集为空。 那么称P是X的一个划分。
请设计一个有效算法, 对于给定的任意两个字 符串 A 和 B ,计算其编辑距离 d (A,B) 。
15
.
分析
假设A=a1a2….an的长度为n, B=b1b2….bm的长度为m。 如果d[i,j]表示a1a2….ai和b1b2….bj 之间的编辑距离。
? d[i,j] ??
?
if i==0 if j==0 if i>0&&j>0&&ai bj if i>0&&j>0&&ai bj
} public static void swap(Object[] a, int i, int j) {
Object temp = a[i]; a[i] = a[ j]; a[ j] = temp; } }
7
.
整数划分问题:将正整数K表示为p个整数的和:
K=k1+k2+…+kp,其中(k1>=k2>=…>=kp) 正整数K的这种表示叫做正整数划分(partition)。
解:我们记集合X 中元素的全排列记为perm(X)。 那么(a)perm(X)表示在全排列perm(X)的每一种排列前加上前缀a 所得到的排列。 记Rj=R-{rj}, 所以,R的全排列可归纳定义如下:
当n =1 时,perm(R)=(r),其中r 是集合R 中唯一的元素; 当n >1 时,perm(R)由 (r1)perm(R1), (r2)perm(R2),…,
18
.
设计一个算法,求一个包含n个元素的集合,一共有 多少种划分?
1 23
i-1 i

用F(i,j)表示一个包含前i个元素的集合,划分为j 个子集所具有的划分数。 那么原问题的解 = F(n,1) +F(n,2)+…+F(n,n) 下面关键的问题,是怎么求F(i,j)?
19
.
1 23
i-1
i
… 选一个子集放入,
6
Return 1 + partitionNum(K,K-1);
7
If K > m && m > 1
8
Return partitionNum(K, m-1) + partitionNum(K- m, m);
子问题重复,直接上述递归,性能不高。怎么办?
12
.
动态规划
1
2
1
1
1
2
1
3
1
K4
1
5
1
6
1
m
为m的划分数(?) +最大加数不大于m-1的划分数( p(K,m-1))。 p(K-m,m)
11
.
Algorithm partitionNum(K, m)
1
If K==1 || m ==1
2
Return 1;
3
If K < m
4
Return partitionNum(K,K);
5
If K == m
A[2]+A[3]+A[4]+A[5] = 78 。 实际上,在A的所有连续子序列中,连续子序列A[2] A[3] A[4]A[5]的和是最大的。
21
.
解决方法: 用b[ j]表示 A[1]A[2]……A[ j] 的所有包含A[ j]的连续子序列的 最大和。这样,当j=n时,我们得到一个数组b[1…n]。 那么,原问题的解就是数组b[1…n]中的最大值。
4.
;
5. else if A[s] + A[t] > x
6.
;
7. else
8.
;
ห้องสมุดไป่ตู้
2
.
输入:已经排序(非降序)的整型数组A[1…n],整数x 输出:若A中存在两个整数的和恰好为,返回true; 否则返回false
1. return sumX(1,n)
Procedure:sumX(s,t) 1. if s = t or s > t 2. return false; 3. else if A[s] + A[t] = x 4. return true; 5. else if A[s] + A[t] > x 6. return sumX(s,t-1); 7. else 8. return sumX(s+1,t);
以集合X={1, 2, 3, 4}为例: P={{1, 2, 3, 4}, {}}不是X的划分,因为存在空集 P={{1, 2}, {3}}不是X的划分,因为子集的并不是原集合 P={{1, 2, 3}, {2, 4}}也不是X的划分,因为两子集的交集不是空集 P={{1, 2}, {3, 4}}符合上述三点,是X的一个划分 P={{1}, {2}, {3, 4}}符合上述三点,是X的一个划分 P={{1}, {2}, {3}, {4}}符合上述三点,是X的一个划分
• 那么当m=K时,就是问题的解。
• 例如p(6,1) =1; p(6,2)=4; p(6,3)=7; p(6,4)=9; p(6,5)=10; p(6,6) =11
9
.
6; 5+1; 4+2; 4+1+1; 3+3;3+2+1;3+1+1+1; 2+2+2;2+2+1+1;2+1+1+1+1; 1+1+1+1+1+1+1
Return p[K,m]
14
.
动态规划-编辑距离
设 A 和 B 是 2 个字符串。要用最少的字符操作将 字 符串 A 转换为字符串 B 。字符串操作包括: (1) 删除一个字符; (2) 插入一个字符; (3) 将一个字符改为另一个字符。
将字符串 A 变换为字符串 B 所用的最少操作次 数称为字符串 A 到 B 的编辑距离,记为 d (A,B) 。
22
.
No Image
2021/5/20
23
5+1;
------最大加数为5
4+2; 4+1+1;
------最大加数为4
3+3;3+2+1;3+1+1+1;
------最大加数为3
2+2+2;2+2+1+1;2+1+1+1+1; ------最大加数为2
1+1+1+1+1+1+1
------最大加数为1
• 在正整数K的所有划分中,将最大加数(k1)不大于(小 于等于)m的划分数记做p(K,m)
(rn)perm(Rn)构成。
5
.
abcde fgh i j
k
m
6
.
算法的一个Java实现如下:
public class Perm { public static void perm(Object[]
a, int k, int
m) {
if (k == m) {
for (int i = 0; i < a.length; i++) {
3
4
1
1
p(K,m)
P(K,m) = 1 + p(K,K-1)) 当 m=K
P(K,m) = p(K-m,m) + P(K,m-1) 当 K>m>1
5 1
p(K,K)
13
.
Algorithm partitionNum(K,m)
1
For i = 1 to K
2
p[i,1] = 1; p[1,i] = 1;
------最大加数为6 ------最大加数为5 ------最大加数为4 ------最大加数为3 m ------最大加数为2
------最大加数为1
p(K, m)
,if (m1) ,if (m K) ,if (m K) ,if(1 m K)
10
.
那么,可以按照如下关系来建立p(K,m)的递归关系式: (1):当m=1时(最大加数不大于1的时候), p(K,1)=1只有1种划分形式,
相关文档
最新文档