算法设计与分析王红梅胡明习题答案Word文档格式.docx
《算法设计与分析王红梅胡明习题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法设计与分析王红梅胡明习题答案Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
2.循环直到r=0
m=n
n=r
r=m-n
3输出m
3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
编写程序,求n至少为多大时,n个“1”组成的整数能被2013整除。
#include<
iostream>
usingnamespacestd;
intmain()
{
doublevalue=0;
for(intn=1;
n<
=10000;
++n)
value=value*10+1;
if(value%2013==0)
cout<
<
"
n至少为:
endl;
break;
}
}计算n值的问题能精确求解吗?
编写程序,求解满足给定精度要求的
#include<
usingnamespacestd;
intmain()
doublea,b;
doublearctan(doublex);
圣经上说:
神6天创造天地万有,第7日安歇。
为什么是6天呢?
任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。
例如,6=1+2+3,
因此6是完美数。
神6天创造世界,暗示着该创造是完美的。
设计算法,判断给定的自然数是否是完美数
#include<
intmain()
intvalue,k=1;
cin>
>
value;
for(inti=2;
i!
=value;
++i){
while(value%i==0)
k+=i;
有4个人打算过桥,这个桥每次最多只能有两个人同时通过。
他们都在桥的某一端,并且是在晚上,过桥需要一只手电筒,而他们只有一只手电筒。
这就意味着两个人过桥后必须有一个人将手电筒带回来。
每个人走路的速度是不同的:
甲过桥要用1分钟,乙过桥要用2分钟,丙过桥要用5分钟,丁过桥要用10分钟,显然,两个人走路的速度等于其中较慢那个人的速度,问题是他们全部过桥最少要用多长时间?
由于甲过桥时间最短,那么每次传递手电的工作应有甲完成
甲每次分别带着乙丙丁过桥
例如:
第一趟:
甲,乙过桥且甲回来
第二趟:
甲,丙过桥且甲回来
甲,丁过桥一共用时19小时
9.欧几里德游戏:
开始的时候,白板上有两个不相等的正整数,两个玩家交替行动,每次行动时,当前玩家都必须在白板上写出任意两个已经出现在板上的数字的差,而且这个数字必须是新的,也就是说,和白板上的任何一个已有的数字都不相同,当一方再也写不出新数字时,他就输了。
请问,你是选择先行动还是后行动?
为什么?
一共
设最初两个数较大的为a,较小的为b两个数的最大公约数为factor。
则最终能出现的数包括:
factor,factor*2,factor*3,…,factor*(a/factor)=a.
a/factor个。
如果a/factor是奇数,就选择先行动;
否则就后行动。
习题2
1.如果Ti(n)=qf(n)),T2(n)=qg(n)),解答下列问题:
(1)证明加法定理:
Ti(n)+T2(n)=max{C(f(n)),C(g(n))};
(2)证明乘法定理:
T1(n)XT2(n)=Cf(n))xCg(n));
(3)举例说明在什么情况下应用加法定理和乘法定理
(3)比如在
for(f(n))
for(g(n))
中应该用乘法定理
如果在“讲两个数组合并成一个数组时”,应当用加法定理
2•考虑下面的算法,回答下列问题:
算法完成什么功能?
算法的基本语句是什么?
基本语句执行了多少次?
算法的时间复杂性是多少?
(2)intQ(intn)
if(n==1)
return1;
else
returnQ(n-1)+2*n-1;
(1)intStery(intn){intS=0;
for(inti=1;
i<
=n;
i++)
(1)完成的是*i1-n的平方和
基本语句S;
s+=i*i,执行了n次
时间复杂度0(n)
(2)完成的是n的平方
-1,执行了n次
基本语句:
returnQ(n-1)+2*n
3.分析以下程序段中基本语句的执行次数是多少,要求列出计算公式。
4.
(1)intT(intn)
if(n==1)
return4;
elseif(n>
1)return3*T(n-1);
}
⑵
intT(intn)
1)return2*T(n/3)+n;
Q(n)紧密?
Q(n*n)
Q(logn+n)(先进行快排,然后进行比较查找)
Q(2人n)
发明的,当他把该发明献给国王时,国
Shashi要求以这种方式给他一些
&
国际象棋是很久以前由一个印度人Shashi
王很高兴,就许诺可以给这个发明人任何他想要的奖赏。
粮食:
棋盘的第1个方格内只放1粒麦粒,第2格2粒,第3格4粒,第4格8粒,以此类推,直到64个方格全部放满。
这个奖赏的最终结果会是什么样呢?
usingnamespacestd;
longdoubleresult=1;
doublej=1;
for(inti=1;
i<
=64;
++i){j=j*2;
result+=j;
j++;
result<
endl;
return0;
1的平凡情形)。
=0
习题3
1.假设在文本"
ababcabccabccacbab"
中查找模式"
abccac"
,写出分别采用BF算法和KMP
算法的串匹配过
6/8化简为3/4。
式化简。
设计算法,将一个给定的真分数化简为最简分数形式。
例如,将#include<
intn;
数字游戏。
把数字1,2,…,9这9个数字填入以下含有加、减、乘、除的四则
运算式中,使得该等式成立。
要求9个数字均出现一次且仅出现一次,且数字1不能出现
在乘和除的一位数中(即排除运算式中一位数为
X+-
intsquare(intx){
returnx*x;
设计算法,在数组r[n]中删除所有元素值为x的元素,要求时间复杂性为Qn),空间复杂性为O
(1)。
7.设计算法,在数组r[n]中删除重复的元素,要求移动元素的次数较少并使剩余元素间的相对次序保持不变。
voiddeletere(inta[],intN)
intb[100]={0};
inti,k;
k=0;
staticintj=0;
for(i=0;
N;
i++)b[a[i]]++;
100;
if(b[i]!
=0)
if(b[i]==2)
k++;
a[j]=i;
j++;
N-k;
a[i]<
inta[]={1,2,1,3,2,4};
deletere(a,6);
return0;
设表A={ai,a2,…,an},将A拆成B和C两个表,使A中值大于等于0的元素存入表
B,值小于0的元素存入表C要求表B和C不另外设置存储空间而利用表A的空间。
荷兰国旗问题。
要求重新排列一个由字符RVVB(R代表红色,W代表白色,B代表兰色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W排在其次,B
排在最后。
为荷兰国旗问题设计一个算法,其时间性能是qn)。
设最近对问题以k维空间的形式出现,k维空间的两个点pi=(xi,X2,…,xk)和p2=(yi,
ijK
y2,…,yk)的欧几里德距离定义为:
d(p1,P2)I(yj-Xj)2。
对k维空间的最近对问题设
'
Yi1'
计蛮力算法,并分析其时间性能。
(1)x+yw4;
(2)
11.设计蛮力算法求解小规模的线性规划问题。
假设约束条件为:
x+3yw6;
(3)x>
0且y》0;
使目标函数3x+5y取得极大值。
intx,y,x0,y0;
intsummax=0,temp=0;
for(x0=0;
x0<
=4;
++x0)
for(y0=0;
(x0+y0<
=4)&
(x0+3*y0<
=6);
++y0)
temp=3*x0+5*y0;
if(temp>
=summax)
summax=temp;
x=x0;
1.1.11.1.2变位词。
给定两个单词,判断这两个单词是否是变位词。
如果两个单词的字母完全相同,只是位置有所不同,则这两个单词称为变位词。
例如,eat
和tea是变位词。
分治法的时间性能与直接计算最小问题的时间、合并子问题解的时间以及子问题的个数有关,试说明这几个参数与分治法时间复杂性之间的关系
Qn)。
2.证明:
如果分治法的合并可以在线性时间内完成,则当子问题的规模之和小于原问题的规模时,算法的时间复杂性可达到
O(N)=2*O(N/2)+x
O(N)+x=2*O(N/2)+2*x
a*O(N)+x=a*(2*O(N/2)+x)+x=2*a*O(N/2)+(a+1)*x由此可知,时间复杂度可达到O(n);
3.分治策略一定导致递归吗?
如果是,请解释原因。
如果不是,给出一个不包含递归的分治例子,并阐述这种分治和包含递归的分治的主要不同。
不一定导致递归。
如非递归的二叉树中序遍历。
这种分治方法与递归的二叉树中序遍历主要区别是:
应用了栈这个数据结构。
4.对于待排序序列(5,3,1,9),分别画出归并排序和快速排序的递归运行轨迹。
间性能。
设计分治算法,实现将数组A[n]中所有元素