算法分析第二次作业答案(卜东波)

算法第二次作业答案
这里我们归约要做的主要步骤就是,
1.把NPC的input转化到NP-hard的input,即每一个NPC的input,实际上都是一个NP-hard
的input。
2.把NP-hard的output转化到NPC的output上来,说明给我一个NP-hard的output,我
就能给你一个NPC的output。
注意:以上的两个转化都要在polynomial的时间内完成。

第1题:
证明如下:

(1)给定图G1和图G2中的一个子图G3,显然能在多项式时间内
验证G1和G3是否同构,故subgraph-isomorphism问题是NP问题。
(2)已知clique问题是NP完全,现给出一个算法使clique问题变
换成subgraph-isomorphism问题。算法如下:
a) 令图H为团问题中K个顶点组成的完全图
b) 令图G1为图H的同构图
则由上述算法可知图G有一个规模为k的clique当且仅当在图G中
存在与G1同构的子图H。因上述算法是多项式时间的,所以clique
问题可以规约成subgraph-isomorphism问题。
综合(1)(2)知subgraph-isomorphism问题为NP完全问题。

第2题:
例 用3SAT证明ILP是NP-hard的。即 3SAT <= ILP
还是首先找映射,这个映射不涉及图的东西,应该比较容易构造和理解。
还是拿上面那个3SAT的例子说事。对于 每个clause,我们都对应于ILP中的一个
constraint,比如 E中有4个变量,X1,X2,X3 和X4, 我们的ILP中也有同样的这4个
变量,并且我们要求他们都是只能取0 或 1。对于一个clause,如(X1 V ~X2 V ~X3) ,我
们对应的constraint是 “X1 + (1-X2)+(1-X3)>=1”,很显然了,ILP中的变量选0
对应于3SAT中的变量选false,ILP中的变量选1对应于3SAT中的变量选true,这样我们
就映射好了。
很显然,这两个问题的input/output的转换trival的不行了。如果一个clause满足了,
对应的那个ILP中的constraint肯定也满足了;反之依然。偷个懒~O(∩_∩)O~
证毕。
最后将所有约束条件写成矩阵形式AX<=b,则将3SAT归约为了ILP

第3题:
(1)给定set-partition问题S的一个解A,可以在多项式时间内
验证xAyBxy(其中B=S-A)是否成立,所以set-partition问题为

NP问题。
(2)已知subset-sum问题为NP完全问题(subset-sum问题描述为:
给定一个整数集合S={X1,X2,„Xn}和一个整数t,则是否存在一个非
空子集,使得子集中的数字和为t),现定义一个算法使subset-sum
问题变换成set-partition问题。算法如下:

①已知整数集合S和整数t,给出r=2t-xSx
②定义整数集合S’,使得S’=Sr
③返回S’
上述变换后可知S中有一个子集和为t的子集当且仅当集合S’能
set-partition。又因上述转换算法是多项式时间的,因此subset-sum
问题可以规约成set-partition问题。
综合(1)(2)可知set-partition问题为NP完全问题。

第4题:
第6题:
证明:
(1) 对于给定的n/2个顶点集V’,对每一对顶点',uvV,通过检查
边(u,v)是否属于E,就可以在多项式时间O(n2)内完成对V
’
是否是团的验证,则证明Half-Clique是NP问题。
(2) 已知Clique问题为NPC问题,对一个Clique问题,通
过以下算法构造G’:
1) 在G上添加n个顶点,并在这n个顶点中选取n-k个顶点,
进行两两互联
2) 将这n-k个顶点同G中的每一个顶点连接起来。
3) 返回一个2n个顶点的图'G
变换后显然有G中有一个K个顶点组成的团当且仅当'G中有由
n(G中的K个顶点加两两互联的n-k个顶点)个顶点组成的团。
显然转换算法可以在多项式时间内完成,故有

综上可知,Half-Clique问题为NPC问题。

合集下载

算法设计与分析习题答案1-6章

算法设计与分析习题答案1-6章

习题11.图论诞生于七桥问题。

出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。

七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图1.7是这条河以及河上的两个岛和七座桥的草图。

请将该问题的数据模型抽象出来,并判断此问题是否有解。

七桥问题属于一笔画问题。

输入:一个起点 输出:相同的点 1, 一次步行2, 经过七座桥,且每次只经历过一次 3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。

另一类是只有二个奇点的图形。

2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。

请用伪代码描述这个版本的欧几里德算法 1.r=m-n2.循环直到r=0 2.1 m=n 2.2 n=r 2.3 r=m-n 3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。

要求分别给出伪代码和C ++描述。

//采用分治法//对数组先进行快速排序 //在依次比较相邻的差 #include <iostream> using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。

算法设计技巧与分析(沙特版) 第1_2章课后习题参考解答

算法设计技巧与分析(沙特版) 第1_2章课后习题参考解答

lim
n
2n 3log100 n ,所以,2n+3log100n=(n)。 2 n
3 3 nlogn 3n 7n3 1000 7 ,所以,7n +1000nlog n+3n =(n ). 3 n
lim
n
lim
n
n
3n1.5 n1.5 logn ,所以,3n1.5+n1.5log n=(n1.5log n). 1 n1.5 logn
3
g(n) 100n +2n+100 10n+log log n 10nlog log n log n 5
n 2 2
f=O(g) False True False True False
f=(g) True True True False True
f=(g) False True False False False
2n 100n n! ,所以,2n+100n+ n!=(n!). 1 n!
lim
1.16 解答: (a) 算法执行元素比较运算的最小次数是 n-1。当输入 A[1..n] 已经有非减次序时该算法执 行元素比较运算次数达到这个最小值。 (b) 算法执行元素比较运算的最大次数是(n-1)+( n-2)+…+ 2+1=n(n-1)/2。当输入 A[1..n] 已有递减次序时该算法执行元素比较运算次数达到这个最大值。 (c) 算法执行元素赋值运算的最小次数是 0。 当输入 A[1..n] 已经有非减次序时该算法执行元 素赋值运算次数达到这个最小值。 (d) 算法执行元素赋值运算的最大次数是 3[(n-1)+( n-2)+…+ 2+1]=3n(n-1)/2。当输入 A[1..n] 已有递减次序时该算法执行元素赋值运算次数达到这个最大值。 (e) 使用记号 O 和 ,算法 BUBBLESORT 的运行时间分别表示为(n2)和(n)。 (f) 该算法的运行时间不能使用记号来表示,这是因为算法的运行时间范围为 n 的一次方 到二次方。 2.16 解答: (a) 一方面,∑j=1n jlog j≤∑j=1n nlog n≤n 2 log n, 另一方面,∑j=1n jlog j≥∑j= n/2 n n/2log n/2 ≥n/2 n/2log n/2 ≥(n-1)n/4·log(n/2)。 n 因此,∑j=1 jlog j= (n 2logn)。 (b)令 f(x)=x log x (x≥1)。由于 f(x) 是增函数,故有 ∑j=1n jlog j≤∫1n+1 x log xdx≤(2(n+1)2 ln(n+1)-(n+1)2+1) / (4ln2); 同时, ∑j=1n jlog j=∑j=2n jlog j≥∫1n x log xdx≥(2n2 lnn-n2+1) / (4ln2)。 因此,∑j=1n jlog j= (n 2lnn)= (n 2logn)。 2.18 解答: (a) 特征方程为 x=3。

算法分析与设计重点课后习题答案

算法分析与设计重点课后习题答案

习题13.设计算法求数组中相差最小的两个元素(称为最接近数)的差。

要求分别给出伪代码和C++描述。

//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。

计算机算法分析―习题课2(第五章)

计算机算法分析―习题课2(第五章)

ERT’=[fj1lj1+fj2(lj1+lj2)+…+fjk(lj1+lj2+…+ljk)+ …+fjn(lj1+lj2+…+ljn)]/ ∑ f ,从前向后考察最优 从前向后考察最优 解中的程序,不妨设程序j 解中的程序,不妨设程序 k是第一个与其相 邻的程序jk+1存在关系 f jk / l jk < f jk +1 / l jk +1 , 邻的程序 则交换程序j 和程序j 则交换程序 k和程序 k+1,得到的期望检索 时间记为ERT’’,容易证明 时间记为 ,容易证明ERT’’ ≤ERT’, , 显然ERT’’也是最优解,将原来的最优解中 也是最优解, 显然 也是最优解 所有这样类似于反序对的程序互换位置, 所有这样类似于反序对的程序互换位置,得 到的解不比原来的最优解差, 到的解不比原来的最优解差,所以最终变换 后得到的解也是最优解,而最终的解恰是程 后得到的解也是最优解, 序按fi/li的非增次序来存放得到的顺序 的非增次序来存放得到的顺序。 序按 的非增次序来存放得到的顺序。命 题得证。 题得证。
P121-2. .
按照wi的非降次序输入时 得到(w5, w7, 的非降次序输入时, ③ 按照 的非降次序输入时 , 得到 w1, w2, w6, w3, w4)=(1,1,2,3,4,5,7), 相应的 , (p5, p7, p1, p2, p6, p3, p4)=(6,3,10,5,18,15,7), ) , 则 FW(I) 的 解 为 ( 1,1,4/5,0,1,1,1 ) , 并 且 FW(I)=54,所以 ,所以FO(I)/ FW(I)=83/81.
计算机算法分析—习题课 计算机算法分析 习题课

第二次作业答案

第二次作业答案

第二次作业答案第二章参考答案一、名词解释(略)二、填空题1、结点起始终端序号位置前趋后趋2、()ф3、前趋前趋后趋后趋4、线性5、线性长度表长6、空表7、初始化INITLATE(L)求表长LENGTH(L)读表长GET(L,i)定位LOCATE(L,X)插入INSERT(L,X,i)删除DELETE(L,i)8、逻辑结构中相邻的结点在存储结构中仍相邻9、b+(i-1)x k.10、L.data[j]=L.data[j-1]11、n O(n) n/2 O(n)12、L.data[j-2]=l.data[j-1]13、n-1 o(n) (n-1)/2 O(n)14、i=1 i≦/doc/a17c0c16866fb84ae45c8d0e.html st15、O(n) O(1)16、/doc/a17c0c16866fb84ae45c8d0e.html st L.data[i-1]17、单链表循环链表双链表18、指针19,单链表20、头结点表结点21、首结点尾结点任何信息、特殊标志表长22、头结点头结点23、t=malloc(size) t->next=NULL24、p=haed p=p->next25、(p->next!=NULL)&&(j<i)< bdsfid="89" p=""></i)<>26、(p->next!=NULL)&&(p->data!=x)27、(p!=NULL)&&(p->next!=NULL) p->next28、mailloc(size) p->next29、insert_lklist(head,x,I) I++ n(n-1)/2 O(n2)30、p=q p->next=NULL O(n)31、单向循环链表(简称循环链表)双向循环链表(简称双链表)32、NULL 头结点33、双链表34、字符数组赋值35、空ф非空字符36、长度相同子主 37、非紧缩紧缩38、结点大小不属于字符集的特殊符号三、单项选择题1、②2、①3、①4、②5、①6、②7、③8、③9、④10、②11、④12、③13、⑤14、④15、③16、①17、②18、③19、④20、④21、④22、223、②24、③25、④26、②27、③28、④29、①30、④31、②32、②33、④34、④35、③36、③37、②38、③39、②40、①41、④四、简答及应用1、线性表的数据元素的类型为datatype,则在语言上可用下述类型定义来描述顺序表:const maxsize=顺序表的容量;typedef struct{ datatype data[maxsize]int last;}sqlist;sqlist L;数据域data是一个一维数组,线性表的第1,2……,n个元素分别存放在此数组的第0,1,……,last-1个分量中,数据域last表示线性表当前的长度,而last-1是线性表的终端结点在顺序表中的位置。

(陈慧南 第3版)算法设计与分析——第2章课后习题答案

(陈慧南 第3版)算法设计与分析——第2章课后习题答案

因此 T (n) (n 2 ) (3) a 28, b 3, f n cn3
nlogb a nlog3 28 n3.033 ,则 f (n) c n 2 (nlogb a - ) ,其中可取 =0.04 。符合主定理
的情况 1 ,因此 T (n) (n3.033 )
21 21 当 n n0 时, f n g n ,所以 f n = g n 2 2
(2) f n n 2 logn , g n n log 2 n
2 当 n 4 时, f n n 2 logn n 2 , g n n log 2 n n 。因此可取 n0 4, c 1 ,当
g n
(1) f n 20n logn , g n n+ log 3 n
f n 20n logn 21n , g n n+ log 3 当 n 3 时, logn n log3 n 2n n 因此
因此可取 n0 3, c
f n g n ,所以 f n = g n
2-12 将下列时间函数按增长率的非递减次序排列
3 2
n
, log n , log 2 n , n log n , n ! , log(log(n)) , 2 n , n1 log n , n 2
答: n1 log n
f ( n ) ( n m )
证明:
f (n) am nm am1nm1 a1n a0 F (n) am n m am1 n m1
a1 n a0
由 F (n) 单调性易知,存在 nt 0 ,使得 F (n) 取 n 1 ,且 nt0 nt , F (nt0 ) 0 ,则 当 n nt0 时, F (n) 0 即: f (n) am n m am1 n m1

《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案一、简要回答下列问题:1.算法重要特性是什么?1.确定性、可行性、输入、输出、有穷性2.2.算法分析的目的是什么?2.分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法。

3.3.算法的时间复杂性与问题的什么因素相关?3. 算法的时间复杂性与问题的规模相关,是问题大小n的函数。

4.算法的渐进时间复杂性的含义?4.当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。

时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。

5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?5. 最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输入实例下的算法所耗时间。

最坏情况下的时间复杂性取的输入实例中最大的时间复杂度:W(n) = max{ T(n,I) } , I∈Dn平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和:A(n) =∑P(I)T(n,I) I∈Dn6.简述二分检索(折半查找)算法的基本过程。

6. 设输入是一个按非降次序排列的元素表A[i:j] 和x,选取A[(i+j)/2]与x比较,如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]<x,则A[i:(i+j)/2-1]找x,否则在A[ (i+j)/2+1:j] 找x。

上述过程被反复递归调用。

7.背包问题的目标函数和贪心算法最优化量度相同吗?7. 不相同。

目标函数:获得最大利润。

最优量度:最大利润/重量比。

8.采用回溯法求解的问题,其解如何表示?有什么规定?8. 问题的解可以表示为n元组:(x1,x2,……x n),x i∈S i, S i为有穷集合,x i∈S i, (x1,x2,……x n)具备完备性,即(x1,x2,……x n)是合理的,则(x1,x2,……x i)(i<n)一定合理。

2020年算法分析设计习题答案


第3章 动态规划
2. 石子合并问题 问题描述: 在一个圆形操场的四周摆放着n堆石子. 现在要将石子有次序地合并 成一堆. 规定每次只能选相邻的2堆石子合并成一堆, 并将新的一堆石子数记为 该次合并的得分. 试设计一个算法, 计算出将n堆石子合并成一堆的最小得分和 最大得分. 算法设计: 对于给定n堆石子, 计算合并成一堆的最小得分和最大得分. 数据输入: 由文件input.txt提供输入数据. 文件的第1行是正整数n, 1n100, 表 示有n堆石子. 第2行有n个数, 分别表示n堆石子的个数. 结果输出: 将计算结果输出到文件output.txt, 文件第1行是最小得分, 第2行是最 大得分.
第五章 回溯
运动员最佳配对问题
问题描述: 羽毛球队有男女运动员各n人. 给定2个nn矩阵P和Q. P[i][j]是男运 动员i与女运动员j配混合双打的男运动员竞赛优势; Q[i][j]是女运动员i与男运 动员j配混合双打的女运动员竞赛优势. 由于技术配合和心理状态等各种因素 影响, P[i][j]不一定等于Q[j][i]. 男运动员i和女运动员j配对的竞赛优势是 P[i][j]*Q[j][i]. 设计一个算法, 计算男女运动员最佳配对法, 使得各组男女双方 竞赛优势的总和达到最大.
8.
若m[i,j]>t, 则m[i,j]=t; s[i,j]=k;
第3章 动态规划
再讨论圆周上的石子合并问题, 子结构[i:j]稍作修改 • 定义m[i][len]为合并第i堆到第i+len-1堆石子能得到的最少分数 • 当i+len-1>n时, 指跨过第n堆到第(i+len-1)%n堆,
仅sum函数需要修改
第2章 分治
2-8 设n个不同的整数排好序后存于T[1:n]中. 若存在一个下标i, 1 i n, 使得T[i]=i. 设计一个有效算法找到这个下标. 要求算 法在最坏情况下的计算时间O(log n).

算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。

频率计数是指计算机执行程序中的某一条语句的执行次数。

多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。

指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。

2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。

3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。

4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。

5. 解:①n=11; ②n=12; ③n=982; ④n=39。

第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。

2. 解:通过分治算法的一般设计步骤进行说明。

3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。

《算法分析与设计》作业答案

《算法分析与设计》作业1、考虑,10≤≤i x 而不是x i ∈{0,1}的连续背包问题。

一种可行的贪婪策略是:按价值密度非递减的顺序检查物品,若剩余容量能容下正在考察的物品,将其装入;否则,往背包内装如此物品的一部分。

(a) 对于n=3,w=[100,10,10],p=[20,15,15],以及c=105,上述装入法获得结果是什么?(b)证明这种贪婪算法总能获得最优解。

(c) 用伪代码描述此算法。

答:(a )利用贪婪算法,按价值密度考察的背包为w2,w3,w1;背包w2和w3重20,还可以容纳85,由于10≤≤i x ,背包w1还可以装入x1=0.85,则背包内物品总价值为15+15+20*0.85=47.(b )假设已按价值密度排好序,考察w1,w2,……,wi ,……,对应的价值为p1,p2,……,pi,……如果装到pi-1再装pi 时,恰好要取xi 个wi 。

(,10≤≤i x ) 因为比它价值密度大的都已装载完,所以此时获得的为最优解。

(c )算法描述如下: template <class T>int ContainerLoading( int x[], T w[], T c, int n ) {int *t = new int[n+1]; IndirectSort(w, t, n); for( int i=1; i<=n; i++) x[i] = 0;for(i=1; i<=n && w[t[i]]<=c; i++){ x[t[i]] = 1; c += w[t[i]]; } delete []t; }2、证明当且仅当二分图没有覆盖时,下述算法找不到覆盖。

m=0; //当前覆盖的大小对于A中的所有i,New[i]=Degree[i]对于B中的所有i,Cov[i]=falsewhile(对于A中的某些i,New[i]>0) {设v是具有最大的New[i]的顶点;C[m++]=v;for(所有邻接于v的顶点j) {If(!Cov[j]) {Cov[j] = true;对于所有邻接于j的顶点,使其New[k]减1}}}if (有些顶点未被覆盖) 失败else 找到一个覆盖2)给出一个具有覆盖的二分图,使得上述算法找不到最小覆盖。

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