算法第四版习题答案

合集下载

计算机科学导论(第4版)习题答案-第5、6章

计算机科学导论(第4版)习题答案-第5、6章

第5章算法与复杂性习题一、选择题1. B2. D3. C4. A5. B6. B7. D8.B9.C 10.A11.A 12.C 13.A 14.A二、简答题1.什么是算法,算法的特性有哪些?答:“算法(Algorithm)是一组明确的、可以执行的步骤的有序集合,它在有限的时间内终止并产生结果”。

算法的特性有:(1) 有穷性(可终止性):一个算法必须在有限个操作步骤内以及合理的有限时间内执行完成。

(2) 确定性:算法中的每一个操作步骤都必须有明确的含义,不允许存在二义性。

(3) 有效性(可执行性):算法中描述的操作步骤都是可执行的,并能最终得到确定的结果。

(4) 输入及输出:一个算法应该有零个或多个输入数据、有1个或多个输出数据。

2.什么是算法的时间复杂度和空间复杂度,如何表示?答:时间复杂度是与求解问题规模、算法输入相关的函数,该函数表示算法运行所花费的时间。

记为,T(n),其中,n代表求解问题的规模。

算法的空间复杂度(Space complexity)度量算法的空间复杂性、即执行算法的程序在计算机中运行所占用空间的大小。

简单讲,空间复杂度也是与求解问题规模、算法输入相关的函数。

记为,S(n),其中,n代表求解问题的规模。

时间复杂度和空间复杂度同样,引入符号“O”来表示T(n)、S(n)与求解问题规模n之间的数量级关系。

3.用图示法表示语言处理的过程。

答:语言处理的过程如图所示:4.简述算法设计的策略。

答:作为实现计算机程序实现时解决问题的方法,算法研究的内容是解决问题的方法,而不是计算机程序的本身。

一个优秀的算法可以运行在比较慢的计算机上,但一个劣质的算法在一台性能很强的计算机上也不一定能满足应用的需要,因此,在计算机程序设计中,算法设计往往处于核心地位。

要想充分理解算法并有效地应用于实际问题,关键是对算法的分析。

通常可以利用实验对比分析、数学方法来分析算法。

实验对比分析很简单,两个算法相互比较,它们都能解决同一问题,在相同环境下,一般就会认为哪个算法的速度快这个算法性能更好。

算法(第四版)C#习题题解——1.3.49用6个栈实现一个O(1)队列

算法(第四版)C#习题题解——1.3.49用6个栈实现一个O(1)队列

算法(第四版)C#习题题解——1.3.49⽤6个栈实现⼀个O(1)队列因为这个解法有点复杂,因此单独开⼀贴介绍。

那么这⾥就使⽤六个栈来解决这个问题。

这个算法来⾃于。

原⽂⾥⽤的是 Pure Lisp,不过语法很简单,还是很容易看懂的。

先导知识——⽤两个栈模拟⼀个队列如何使⽤两个栈来模拟⼀个队列操作?这是⼀道很经典的题⽬,答案也有很多种,这⾥只介绍之后会⽤到的⼀种⽅法。

⾸先我们有两个栈,H 和 T,分别⽤作出队和⼊队⽤。

这样,⼊队操作等同于向 T 添加元素,T 的⼊栈操作只需要 O(1) 时间。

如果 H 不为空,出队操作等同于 H 弹栈,H 的弹栈操作也只需要 O(1) 时间。

但如果 H 为空,则需要将 T 中的元素依次弹出并压⼊到 H 中,这是⼀个 O(n) 的操作。

显然,这种⽅式中,出队操作的最坏时间复杂度是 O(n),并不满⾜题⽬要求。

分摊 O(n)那么,怎么解决这个问题呢?⼀个很⾃然的想法是,如果在栈 H 变为空之前,我们就能逐步将栈 T 的内容弹出并压⼊到另⼀个栈 H' 中,等到栈 H 为空时,直接交换 H 和 H' 即可。

假设⽬前的队列状态是这样,有三个元素等待出队,还有三个元素等待⼊队。

现在依次让三个元素出队,与此同时我们让栈 T 中的元素依次进⼊ H' 中。

每⼀次出队都执⾏两个操作,元素出队和元素复制(Pop & Push),时间复杂度 O(1) + O(1) + O(1) = O(1)。

第⼀次操作(出队)第⼆次操作(出队)第三次操作(出队)现在栈 H 和栈 T 都为空,下⼀次出队操作时,我们直接交换栈 H 和栈 H'(由于是交换引⽤,因此时间复杂度仍为 O(1))。

之后再进⾏出队操作。

这就是这个算法基本想法,在栈 H 变为空之前,分步将栈 T 中的内容分步复制到另⼀个栈中。

当栈 H 为空时直接⽤准备好的栈 H' 替代 H,保证时间复杂度为常数。

计算方法习题集及答案第四版

计算方法习题集及答案第四版
位)。
解:
y次迭代公式
k
0
1
2
3
3.5
3.64
3.63
3.63
6. 试证用牛顿法求方程在[1,3]内的根是线性收敛的。 解:

y次迭代公式 故
从而 ,时, 故, 故牛顿迭代公式是线性收敛的 7. 应用牛顿法于方程, 导出求立方根的迭代公式,并讨论其收敛
性。
解:
相应的牛顿迭代公式为 迭代函数,, 则,
习题1.1
1. 什么叫数值方法?数值方法的基本思想及其优劣的评价标准如 何?
数值方法是利用计算机求解数学问题近似解的方法 2. 试证明 及
证明: (1)令
即 又 即 ⑵ 设,不妨设, 令 即对任意非零,有 下面证明存在向量,使得, 设,取向量。其中。 显然且任意分量为, 故有即证。 3. 古代数学家祖冲之曾以作为圆周率的近似值,问此近似值具有
解: (1)迭代公式,公式收敛
k
0
1
2
3
0
(2),, 局部收敛 k0 1 2 3
0.25
0.25098 0.25098
456789
1.5 1.322 1.421 1.367 1.397 1.380 1.390 1.384 1.387 1.386
2. 方程在附近有根,把方程写成三种不同的等价形式:
(1),对应迭代公式;
9
10
11
12
13
14
15
16
1.4650 1.46593 1.4653 1.46572 1.46548 1.46563 1.465534 1.465595
迭代公式(2):
k
0
1
2
3

算法 第四版 习题 答案

算法 第四版 习题 答案

1.1.1 给出以下表达式的值:a. ( 0 + 15 ) / 2b. 2.0e-6 * 100000000.1c. true && false || true && true答案:a.7,b.200.0000002 c.ture1.1.2 给出以下表达式的类型和值:a. (1 + 2.236)/2b. 1 + 2 + 3 + 4.0c. 4.1 >= 4d. 1 + 2 + "3"答案:a.1.618 b. 10.0 c.true d.331.1.3 编写一个程序,从命令行得到三个整数参数。

如果它们都相等则打印equal,否则打印not equal。

public class TestUqual{public static void main(String[] args){int a,b,c;a=b=c=0;StdOut.println("Please enter three numbers");a =StdIn.readInt();b=StdIn.readInt();c=StdIn.readInt();if(equals(a,b,c)==1){StdOut.print("equal");}else{StdOut.print("not equal");}}public static int equals(int a ,int b , int c){if(a==b&&b==c){return 1;}else{return 0;}}}1.1.4 下列语句各有什么问题(如果有的话)?a. if (a > b) then c = 0;b. if a > b { c = 0; }c. if (a > b) c = 0;d. if (a > b) c = 0 else b = 0;答案:a. if (a > b) c = 0; b. if (a > b) { c = 0; }1.1.5 编写一段程序,如果double 类型的变量x 和y 都严格位于0 和1 之间则打印true,否则打印false。

计算机算法设计与分析(第4版) 王晓东习题解答

计算机算法设计与分析(第4版) 王晓东习题解答

第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。

若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。

由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。

必要性。

同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。

2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。

由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。

3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。

证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。

4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。

∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。

当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。

算法 第四版 习题 答案1.2

算法 第四版 习题 答案1.2

算法第四版习题答案1.2/** 1.2.1 编写一个Point2D的用例,从命令行接受一个整数N。

在单位正方形内生成N个随机点,然后计算两点之间的最近距离*/public class testPoint2D {public testPoint2D() {// TODO Auto-generated constructor stub}public static void drawbox(double bw, double bh){StdDraw.setPenRadius(0.005);StdDraw.setPenColor(StdDraw.RED);Interval1D xinterval = new Interval1D(0, bw);Interval1D yinterval = new Interval1D(0, bh);Interval2D box = new Interval2D(xinterval, yinterval);box.draw();}public static Point2D[] drawpoint(int N){Point2D[] p=new Point2D[N];for(int i=0;i<N;i++){double x=Math.random();double y=Math.random();p[i]=new Point2D(x, y) ;p[i].draw();}return p;}public static double findmindist(Point2D[] p){Point2D p1=p[0];Point2D p2=p[1];double mindist =p[0].distanceTo(p[1]);StdDraw.setPenRadius(0.002);StdDraw.setPenColor(StdDraw.RED);int n=p.length ;for(int i=1;i<n-1;i++)for(int j=i+1;j<n;j++){double temp=p[i].distanceTo(p[j]);if(temp<mindist){ mindist=temp;p1=p[i];p2=p[j];}}p1.drawTo(p2);StdOut.print("min dist="+mindist +p1.toString()+p2.toString());return mindist;}public static void main(String[] args) {int N=StdIn.readInt();//读取画点的数量//StdDraw.setXscale(0,1 );//StdDraw.setYscale(0,1);drawbox(1,1);//画出一个单位大小的正方形StdDraw.setPenRadius(0.01);StdDraw.setPenColor(StdDraw.BLACK);//drawpoint(N);//画出N个点double min=findmindist(drawpoint(N));}}/** 编写一个Interval1D的用例,从命令行接受一个整数N。

2020年《C语言程序设计》课后习题答案第四版谭浩强精编版

2020年《C语言程序设计》课后习题答案第四版谭浩强精编版
return 0;
}
第2章算法——程序的灵魂16
2.1什么是算法16
2.2简单的算法举例17
2.3算法的特性21
2.4怎样表示一个算法22
2.4.1用自然语言表示算法22
2.4.2用流程图表示算法22
2.4.3三种基本结构和改进的流程图26
2.4.4用N S流程图表示算法28
2.4.5用伪代码表示算法31
return 0;
}
3-7
#include <stdio.h>
int main ()
{float h,r,l,s,sq,vq,vz;
float pi=3.141526;
printf("请输入圆半径r,圆柱高h∶");
scanf("%f,%f",&r,&h); //要求输入圆半径r和圆柱高h
l=2*pi*r; //计算圆周长l
return 0;
}ቤተ መጻሕፍቲ ባይዱ
3-6
#include <stdio.h>
int main()
{char c1='C',c2='h',c3='i',c4='n',c5='a';
c1=c1+4;
c2=c2+4;
c3=c3+4;
c4=c4+4;
c5=c5+4;
printf("passwor is %c%c%c%c%c\n",c1,c2,c3,c4,c5);
m=log10(p/(p-d*r))/log10(1+r);
printf("m=%6.2f\n",m);

C程序设计(第四版)(谭浩强)完整版_课后习题答案解析

C程序设计(第四版)(谭浩强)完整版_课后习题答案解析

C程序设计(第四版)(谭浩强)第一章课后习题答案P006 1.1 向屏幕输出文字.#include<stdio.h>//预编译. 代码均调试成功,若有失误大多不是代码问题.自已找找.int main(){printf("Welcome to \n");return 0; //与int main对应,为了程序可移植性,建议全用int main + return 0;.}P008 1.2 求两个数的和.#include<stdio.h>int main(){int a,b,sum;a=5;b=4;sum=a+b;printf("The sum is %d .\n",sum);return 0;}P008 1.3 调用函数比较两个数的大小.#include<stdio.h>int main(){int max(int x,int y); //被调用函数在主函数后面,用前先声明.int a,b,c;scanf("%d,%d",&a,&b); //输入时要按格式来,此处的逗号,用空格会发生错误.c=max(a,b); //a,b作为实参传入被调用函数中.printf("The max is %d .\n",c);return 0;}int max(int x,int y) //定义了两个形参.{int z; //z属于局部变量,可与主函数中相同名字.if (x>y)z=x;elsez=y;return(z); //z作为整个程序的出口值,赋给主函数中的c.}P015 0.6 三个数的大小.(数字0表示课后练习题)#include<stdio.h>int main(){int a,b,c,d; //d是用于存储最大值的.int max(int x , int y , int z); //测试可知,在VS2008中,可以不预先声明.printf("Please input 3 numbers :\n");scanf("%d %d %d",&a,&b,&c);d=max(a,b,c); //调用函数中有三个形参,这里需要传入三个实参,才可运算.printf("The max is :%d .\n",d); // d可以换成max(a,b,c).}int max(int x , int y , int z){int m;if (x>y && x>z) //求三者之大的一种方法.m=x;if (y>x && y>z)m=y;if (z>y && z>x)m=z;return (m); //返回值m给主函数中的d.}C程序设计(第四版)(谭浩强)第2章课后习题答案算法——程序的灵魂P017 2.1 计算机1-5相乘的积.#include<stdio.h>int main(){int i,s=1; //在执行数值操作前一定要先有个初值.for(i=1;i<6;i++) //这里是到6.{s=s*i; //相乘}printf("The sum is %d .\n",s);return 0;}#include<stdio.h> //作出要求:换成1到11间奇数相乘.int main(){int i,s=1; //在执行数值操作前一定要先有个初值.for(i=1;i<12;i++) //这里是到,但题目要求的是取单数.也可以是i=i+2{if(i%2!=0) //i对取模,值为非为奇数;为则为偶数.s=s*i;elsecontinue; //跳过这个for循环的这一次,执行下一次.}printf("The sum is %d .\n",s);return 0;}P019 2.2 按要求输出80分以上的学生信息.暂时没法做.年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。

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

}
int N)
编写一个静态方法 lg() ,接受一个整型参数 N,返回不大于 log2 N 的最大整数。不
要使用 Math 库。
public static int lga(int N,int M) { int a=0; while(N>=M)
{ N=N/M; a++;
} return a; }
1.1.15 编写一个静态方法 histogram() ,接受一个整型数组 a[] 和一个整数 M 为参数并
{
String s = exR2(n-3) + n + exR2(n-2) + n;
if (n <= 0) return "";
return s;
}
答:这段代码中的基础情况永远不会被访问。调用
exR2(3) 会产生调用 exR2(0) 、 exR2(-3)
和exR2(-6) ,循环往复直到发生 StackOverflowError 。可以修改为:
答案: a. b b. 197 c. e
1.1.9 编写一段代码,将一个正整数 N 用二进制表示并转换为一个 String 类型的值 s。
解答: Java 有一个内置方法 Integer.toBinaryString(N)
专门完成这个任务,但该题的目
的就是给出这个方法的其他实现方法。
下面就是一个特别简洁的答案:
} 1.1.14
for ( int j=0;j<a[0].
length ;j++)
{
b[j][i]=a[i][j];
}
}
return b;
}
public static int [][] RandomInitial(
int [][] a,
{
StdOut. println ( " 初始化二维数组 :" );
答案: a. 3.00009 b.499500 c. 10000
1.1.8 下列语句会打印出什么结果?给出解释。
a. System.out.println('b');
b. System.out.println('b' + 'c');
c. System.out.println((char) ('a' + 4));
void main(String[] args)
{
int a,b,c;
a=b=c=0;
StdOut. println ( "Please enter three numbers"
a =StdIn.
readInt ();
b=StdIn.
readInt ();
c=StdIn.
readInt ();
} 1.1.4
} public {
}
if ( equals (a,b,c)==1) {
StdOut. print ( "equal" ); } else {
StdOut. print ( "not equal" ); }
static int equals( int a , int b , int c)
if (a==b&&b==c) { return 1; } else { return 0; }
1.1.13 编写一段代码,打印出一个 M 行 N 列的二维数组的转置(交换行和列)。
public class Migrate {
public }
Migrate() { // TODOAuto-generated constructor stub
public static void main(String[] args) {
double x;
double y;
x=StdIn.readDouble();
y=StdIn.readDouble(); StdOut. print ( compare(x)&& compare(y) );
}
public static boolean
compare(double x)
{
If(x>0&&x<1)
返回一个大小为 M的数组,其中第 i 个元素的值为整数 i 在参数数组中出现的次数。如果 a[]
中的值均在 0到 M-1之间,返回数组中所有元素之和应该和
public
static {
}
int [] histogram(
int [] a, int M)
int [] b= new int [M]; int n=0; int m=0; for ( int i=0;i<M;i++) {
}
public {
} public {
static void TestPrint( boolean [][] a)
for ( int i=0;i<a. length ;i++)// 打印行号 StdOut. print ( " " +i); StdOut. println ( " " ); for ( int i=0;i<10;i++) { StdOut. print (i); for ( int j=0;j<10;j++) { if (a[i][j]) StdOut. print ( "*" +" " ); else StdOut. print ( " " +" " ); } StdOut. println ( " " ); }
static boolean [][] RandomInitial(
boolean [][] a)
for ( int i=0;i<a. length ;i++) {
for ( int j=0;j<a. length ;j++) { if (StdRandom. bernoulli
(0.1))
a[i][j]= true ; else
MigratePrint (b); // 输出转置二维数组
}
public static void MigratePrint(
int [][] a)
{
StdOut. println ( " 输出转置二维数组 :" );
for ( int i=0;i<a. length ;i++)
{
for ( int j=0;j<a[0].
String s = "";
for (int n = N; n > 0; n /= 2)
s = (n % 2) + s;
1.1.10 下面这段代码有什么问题?
int[] a;
for (int i = 0; i < 10; i++)
a[i] = i * i;
解答:它没有用 new 为 a[] 分配内存。这段代码会产生一个 variable a might not have
b. 1 + 2 + 3 + 4.0
c. 4.1 >= 4
d. 1 + 2 + "3"
答案: a.1.6序,从命令行得到三个整数参数。如果它们都相等则打印
打印 not equal 。
public {
class TestUqual
public static
public
static void main(String[] args) {
// TODOAuto-generated method stub
boolean [][] a =
new boolean [10][10];
a=RandomInitial (a);// 随机初始化 TestPrint (a);// 打印数组
1.1.7 分别给出以下代码段打印出的值:
a. double t = 9.0;
while (Math.abs(t - 9.0/t) > .001)
t = (9.0/t + t) / 2.0;
StdOut.printf("%.5f\n", t);
b. int sum = 0;
for (int i = 1; i < 1000; i++)
1.1.1 给出以下表达式的值:
a. ( 0 + 15 ) / 2
b. 2.0e-6 * 100000000.1
c. true && false || true && true
答案: a.7,b.200.0000002 c.ture
1.1.2 给出以下表达式的类型和值:
a. (1 + 2.236)/2
been initialized
的编译错误。
1.1.11 编写一段代码,打印出一个二维布尔数组的内容。其中,使用
* 表示真,空格表
示假。打印出行号和列号。 public class Test {
public }
Test() { // TODOAuto-generated constructor stub
returen ture;
else
return false;
}
} 1.1.6 下面这段程序会打印出什么?
int f = 0;
int g = 1;
for (int i = 0; i <= 15; i++)
相关文档
最新文档