计算机算法设计与分析第4版王晓东电子
- 格式:pptx
- 大小:370.59 KB
- 文档页数:30
习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
第一章作业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)。
习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
汽车加油问题1. 问题描述一辆汽车加油满后可行驶n千米,旅途中有若干加油站(不包含汽车的出发点)。
假如在出发时已加满油,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少,并给出加油的地点。
证明算法能产生一个最优解。
算法设计:对于给定的n和k个加油站位置,计算最少加油次数。
2. 算法流程分析设汽车加满油后可行驶n千米,且除了出发点和目的地,旅途中有k个加油站。
把目的地假设为最后一个加油站,有k个加油站。
令数组x存储加油站间距,x[i]表示第i-1个加油站到第i 个加油站之间的距离。
x[0]即出发地到0号加油站的距离。
x[k-1]是第k-2个加油站到第k-1个加油站即终点的距离。
判断s加上x[i]后是否超出n,若超出则必定在i-1处加了油a[i-1]=true ,sum加1表示加油次数加一,且加油后里程从0开始计算,从i-1到达到i处里程为x[i]。
i++进入下一轮,即判断下一个加油站是否能到达。
3. 算法正确性证明通过几组实例证明合法的输入可以得到正确的输出。
实例见附录第2部分。
4. 算法复杂度分析O(n)5.参考文献[1] 王晓东编著,计算机算法设计与分析(第4版)。
北京:电子工业出版社,2012.26.附录(1)可执行代码如下:#include<iostream>using namespace std;int main(){int j,n,k,x[10],c=0,m=0;bool a[10];cout<<"请输入汽车加满油后可行驶的距离(km): ";cin>>n;cout<<"请输入旅途中所经过的加油站个数:";cin>>k;cout<<"请输入每两个相邻加油站之间的距离:"<<endl;for(int i=0;i<=k;i++)cin>>x[i];for(i=0;i<=k;i++)a[i]=false;for(j=0;j<=k;j++){m+=x[j];if(m+x[j+1]>=7){a[j+1]=true;m=0;}}cout<<"在第";for(int s=0;s<=k;s++)if(a[s]==true){c++;cout<<s<<" ";}cout<<"个加油站加油了。
《算法设计与分析》实验教学大纲实验学时:32 实验个数:7 实验学分:1课程性质:适用专业:计算机科学与技术、软件工程教材及参考书:1.《计算机算法设计与分析》,王晓东,北京:电子工业出版社,2005年2.《算法与数据结构》,傅清祥等著,北京:电子工业出版社,20033.《计算机算法导引—设计与分析》,卢开澄著,北京:清华大学出版社,2001 大纲执笔人:刘芳大纲审定人:郭涛一、实验课的性质与任务算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非数值计算的常用算法。
课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针对所给的问题设计和实现高效算法的基本能力。
二、实验课程目的与要求计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的目的。
通过完成课程实验,使学生达到如下要求:1.熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧以及如何根据实际问题设计一个有效的算法。
2.能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言(C,VC++等)编程实现。
三、实验内容安排:实验一算法设计基础(验证型、设计型实验4学时)1.实验目的(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求(1)认真填写实验报告,附加源代码(主要代码)和运行记录;(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析。
3.实验内容:(1)统计数字问题(P8)#include "stdafx.h"#include <iostream>#include <conio.h>#include <string>using namespace std;void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");getch();exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int Page;int Num[10] = {0,0,0,0,0,0,0,0,0,0};string Data;int jishu = 0;read_information(Data);Page = atoi(Data.c_str());cout<<"计算中.\n"<<jishu<<"%"<<endl;;for(int i=1; i<=Page; i++){char sz[10];itoa(i, sz, 10);for(int j=0; sz[j]!='\0'; j++){Num[sz[j]-48]++;}if((int)i/Page*100>jishu){jishu = i/Page*100;cout<<jishu<<"%"<<endl;}}cout<<endl;string answer = "";for (i=0; i<10; i++){char tmp[10];char sz[2];itoa(Num[i], tmp, 10);itoa(i, sz, 10);answer = answer + sz[0];answer = answer + ":";for(int j=0; j<10 && tmp[j]!='\0'; j++){answer = answer + tmp[j];}answer = answer + '\n';}save_information(answer);system("pause");return 0;}字典序问题(P8)(2)最多约数问题(P9)#include "stdafx.h"#include <iostream>#include <string>using namespace std;int yueshuNum(int x){int num = 0;for(int i=1; i<=x; i++){if(x%i == 0){num++;}}return num;}void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int start, end;int Num=0, flag = 1;string data;read_information(data);char tmpstart[10];char tmpend[10];for(int j=0; data[j]!='\0';j++){if(data[j] == ' '){flag = j + 1;}else if(flag == 1){tmpstart[j] = data[j];}else{tmpend[j-flag] = data[j];}}start = atoi(tmpstart);end = atoi(tmpend);for(int i=start; i<=end; i++){int num = yueshuNum(i);if(num > Num){Num = num;}}char answerchar[10];string answer = "";itoa(Num, answerchar, 10);for(i=0; i<10 && answerchar[i]!='\0'; i++){answer = answer + answerchar[i];}save_information(answer);return 0;}(3)最大间隙问题(P10)(4)设计算法求解fibonacci数列的第110项的值,并统计和分析算法的时间性能。
算法设计与分析课程设计教学大纲课程编码:090151145 周/学分:2周/4学分一、大纲使用说明本大纲根据信息与计算科学专业2017—2020版教学计划制订(一)适用专业信息与计算科学专业(二)课程设计性质必修课(三)主要先修课程和后续课程1.先修课程:C语言程序设计2.后续课程:大数据算法二、课程设计目的及基本要求本课程设计是信息与计算科学专业的重要实践性课程,隶属于《算法设计与分析》课程的一个重要部分,是课程结束后进行的一次全面的综合练习。
设计一个高效的程序不仅需要编程小技巧,更需要合理的数据结构和清晰高效的算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。
算法设计与分析正是一门面向设计,且处于计算机学科核心地位的教育课程。
通过对计算机算法系统的学习与研究,掌握算法设计的主要方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定坚实的理论基础,对每一位从事计算机系统结构、系统软件和应用软件研究与开发的科技工作者都是非常重要和必不可少的。
设计目的如下:1.加深对常用算法以及计算复杂性的基本概念、基本原理和方法的理解。
2. 加强对分治法、动态规划、贪心法、回溯法、分支限界法设计策略的理解和实际运用能力的培养,能理论与实际相结合。
3. 能运用已有的算法分析的方法较准确地对算法进行分析,具有一定的分析能力;增强学生的科学实验素质。
要求学生具有理论联系实际和实事求是的科学作风、严肃认真的工作态度。
4. 能运用已有的算法设计技术来设计实际问题的有效算法,具有较强的设计能力和一定的创新能力。
注重创新实践、突出个性发展,努力培养面向软件行业的高素质应用型人才。
为了使学生从课程设计中尽可能取得比较大的收获,对课程设计题目分成二类,一类为基础训练题目,学生从中学习到程序设计的常用算法。
另一类为综合题目,学生从这两类型题目中各选择部分完成。
基本要求:要求学生做好预习,掌握设计过程中涉及到的算法,按设计流程编程,上机调试通过,验证结果并进行分析、完成论文。