计算机算法分析与设计(第四版)习题算法分析部分详解(实验4)

合集下载

算法设计与分析习题答案

算法设计与分析习题答案

算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。

以下是一些典型的算法设计与分析习题及其答案。

习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。

答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。

这个过程会不断重复,直到找到目标值或搜索范围为空。

```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。

答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。

```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。

《算法分析与设计》实验问题详解

《算法分析与设计》实验问题详解

《算法分析与设计》实验问题详解1.算法实验(1)算法与程序(2)实验中应考虑的问题a)算法:多种方案b)程序:核心程序与相关程序(包括主控程序)c)数据:数据特征、数据量、数据获取方式结果数据文件操作d)运行时间e)多方案对比:数据与比较(3)实验正确性与完备性(4)实验方案设计(5)程序设计(6)实验实例:百钱买百鸡问题基本算法实验设计与实验方案PROGRAM 百钱买百鸡()Integer M=100Integer x, y, z, n, kInteger t1, t2t1←gettime()For k←1 to M do //控制重复次数//n←0For x←0 to 100 doFor y←0 to 100 doFor z←0 to 100 doIf 5*x + 3*y + z/3 = 100 and x + y + z = 100Thenn←n+1print(n, x, y, z)endifrepeatrepeatrepeatrepeatt2←gettime()print((t2 - t1)/M) //取计算平均值,消除噪声//END.实验程序2.文件操作(1)文件类型:文本文件与二进制文件(2)写文件(3)查看文件内容(4)读数据与读文件(5)文件操作程序例写文件程序例/*写文件.cpp*/#include <stdio.h>#include <process.h>FILE *stream;int i = 10 ;double fp = 1.5 ;char *s = "this is a string" ;char c = '\n' ;void main(){stream = fopen( "test1.txt" , "w" ) ;fprintf( stream, "%s%c" , s , c ) ;fprintf( stream, "%d\n" , i ) ;fprintf( stream, "%f\n" , fp ) ;fclose( stream );}写随机数据到文件/*写随机数据到文件.cpp*/#include <stdio.h>#include <stdlib.h>#include <process.h>#include <time.h>#define maxline 1000FILE *stream;void main(){int i , j ;int rd;printf( "请输入一个随机种子:" );i = scanf("%d", &rd ) ;srand( rd );stream = fopen( "test2.txt" , "w" ) ;for ( i=1; i<=maxline; i++ ) {for ( j=1; j<=10; j++)fprintf( stream, "%6d " , rand() ) ;fprintf( stream, "\n " ) ;}fclose( stream );}读文件/*读文件数据.cpp*/#include <stdio.h>#include <stdlib.h>#include <process.h>FILE *stream;void main(){int i , j ;int a ;stream = fopen( "test2.txt" , "r" ) ;for ( i=1; i<=10; i++ ) {for ( j=1; j<=10; j++) {fscanf( stream, "%d " , &a ) ;printf( "%d ",a);}printf( "\n " ) ;}fclose( stream );}3.实验数据设计与准备(2)实验数据设计:正常数据,边界数据,异常数据(3)实验数据准备:人工设计随机函数与随机生成(4)数据准备程序和数据文件4.实验数据的输入与输出(1)数据输入从键盘输入从文件输入(2)数据输出输出到屏幕输出到文件5.机器时钟与运行时间获取(1)机器时钟(2)计算时间(3)误差和精度(4)计算时间获取(5)噪声消除6.实验报告(1)报告基本样式(2)报告内容(3)实验报告要求(4)写作技巧附录一实验报告样式《算法分析与设计》实验报告实验X XXXXXX姓名XXX 学号1234567890 班级xxxx班时间地点同组人指导教师实验目的1、2、3、实验内容1、2、3、实验环境硬件:软件:实验前准备1、算法设计2、程序设计3、数据准备实验步骤1、2、……….实验结果及其分析1、程序运行现象观察2、实验中的问题及解决方法3、程序运行结果4、时空分布图5、运行结果分析6、实际结果与预测对比分析……….。

计算机算法设计与研究(王晓东第4版)第4章

计算机算法设计与研究(王晓东第4版)第4章

School of Computer and Communication Engineer
2
找零问题
问题描述: 假设有顾客在超市购买物品价值 2.5 元, 支 付一张 20 元人民币, 请给出找零方案, 要求找给顾客的 零钱的数目最少?
• 10 元一张, 5 元一张, 1 元二张, 5 角一张.
• 共计5张.
n 元 0-1 向量 (x1, x2, . . . , xn), xi ∈ {0, 1}, 1 ≤ i ≤ n,
使得
n i=1
wixi

c,
而且,Байду номын сангаас
n i=1
vixi
达到最大.
School of Computer and Communication Engineer
11
背包问题贪心算法基本步骤
• 首先计算每种物品单位重量的价值 vi/wi, 然后依贪心 选择策略, 将尽可能多的单位重量价值最高的物品装 入背包
School of Computer and Communication Engineer
19
Fun Time
考虑如下活动集合 S:
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 子集 {a3, a9, a11} 为一相容活动集合 • 计算最大相容活动集合?
5
贪心算法产生最优解的条件
• 贪心选择性 • 最优子结构
School of Computer and Communication Engineer
6
贪心选择性质
定义 1. 若一个优化问题的全局最优解可以通过局部最 优选择得到, 则该问题称为具有贪心选择性.

《计算机算法-设计与分析导论》课后习题答案共39页word资料

《计算机算法-设计与分析导论》课后习题答案共39页word资料

4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort 的算法。

它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max ,然后将该元素同未排序序列中的最后一个元素交换。

这时,max 元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max 已经不在未排序序列之中了。

重复上述过程直到完成整个序列的排序。

(a) 写出Maxsort 算法。

其中待排序序列为E ,含有n 个元素,脚标为范围为0,,1n -K 。

void Maxsort(Element[] E) { int maxID = 0;for (int i=E.length; i>1; i--) { for (int j=0; j<i; j++) {if (E[j] > E[maxID]) maxID = k; E[i] <--> E[maxID];(b) 说明在最坏情况下和平均情况下上述算法的比较次数。

最坏情况同平均情况是相同的都是11(1)()2n i n n C n i -=-==∑。

4.2:在以下的几个练习中我们研究一种叫做“冒泡排序”的排序算法。

该算法通过连续几遍浏览序列实现。

排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。

也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位置;以此类推。

(a)起泡排序的最坏情况为逆序输入,比较次数为11(1)()2n i n n C n i -=-==∑。

(b) 最好情况为已排序,需要(n-1)次比较。

4.3: (a)归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k 时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k 个元素进行比较,当k 元素大于k-1元素时,它为k 个元素中最大的,命题成立;当k 元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。

计算机算法设计与分析(第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、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( A )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法4. 回溯法解旅行售货员问题时的解空间树是( A )。

A、子集树B、排列树C、深度优先生成树D、广度优先生成树5.下列算法中通常以自底向上的方式求解最优解的是( B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法6、衡量一个算法好坏的标准是( C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短7、以下不可以使用分治法求解的是( D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题8. 实现循环赛日程表利用的算法是( A )。

A、分治策略B、动态规划法C、贪心法D、回溯法9.下面不是分支界限法搜索方式的是( D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先10.下列算法中通常以深度优先方式系统搜索问题解的是( D )。

A、备忘录法B、动态规划法C、贪心法D、回溯法11.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法12.哈夫曼编码的贪心算法所需的计算时间为( B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)13.分支限界法解最大团问题时,活结点表的组织形式是( B )。

A、最小堆B、最大堆C、栈D、数组14.最长公共子序列算法利用的算法是( B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法15.实现棋盘覆盖算法利用的算法是( A )。

A、分治法B、动态规划法C、贪心法D、回溯法16.下面是贪心算法的基本要素的是( C )。

A、重叠子问题B、构造最优解C、贪心选择性质D、定义最优解17.回溯法的效率不依赖于下列哪些因素( D )A.满足显约束的值的个数B. 计算约束函数的时间C.计算限界函数的时间D. 确定解空间的时间18.下面哪种函数是回溯法中为避免无效搜索采取的策略( B )A.递归函数 B.剪枝函数 C。

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章
• f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n));
• (2)反身性: • f(n)= (f(n)); • f(n)= O(f(n)); • f(n)= (f(n)). • (3)对称性: • f(n)= (g(n)) g(n)= (f(n)) . • (4)互对称性: • f(n)= O(g(n)) g(n)= (f(n)) ;
算法(Algorithm)
• 算法是指解决问题的一种方法或一个过程。 • 算法是若干指令的有穷序列,满足性质: • (1)输入:有外部提供的量作为算法的输入。 • (2)输出:算法产生至少一个量作为输出。 • (3)确定性:组成算法的每条指令是清晰,无歧义的。 • (4)有限性:算法中每条指令的执行次数是有限的,执
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
• Tavg(n) = p(I)T(I) siz(eI)n
问题求解problemsolving证明正确性分析算法设计程序理解问题精确解或近似解选择数据结构算法设计策略设计算法算法复杂性分析算法复杂性算法所需要的计算机资源其中n是问题的规模输入大小
计算机算法设计与分析(第4版)
王晓东 编著 电子工业出版社
第1章 算法概述
学习要点: • 理解算法的概念。 • 理解什么是程序,程序与算法的区别和内在联系。 • 掌握算法的计算复杂性概念。 • 掌握算法渐近复杂性的数学表述。 • 掌握用C++语言描述算法的方法。
• 规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明:

计算机算法设计与分析第四版课后答案

计算机算法设计与分析第四版课后答案

计算机算法设计与分析第四版课后答案【篇一:计算机算法分析与设计(第四版)习题算法分析部分详解(实验六)】//6-1、6-6项目vc++6.0测试通过//6-15项目vc2005测试通过//6-1 最小长度电路板排列问题//头文件stdafx.h// stdafx.h : include file for standard system include files,// or project specific include files that are used frequently, but // are changed infrequently//#pragma once#define win32_lean_and_mean // exclude rarely-used stuff from windows headers #include stdio.h#include tchar.h// todo: reference additional headers your program requires here// sy61.cpp : defines the entry point for the console application.////description://分支限界法 6_1 最小长度电路板排列问题//#include my.h#include stdafx.h#include iostream#include queueusing namespace std;int n,m;//#include outofbounds.h//定义节点类class boardnode{friend int fifoboards(int **,int ,int,int *);//非类成员,可以访问私有成员的函数,最优序列查找public:operator int() const{return cd;}//返回常数 cdint len();public:int *x,s,cd,*low,*high;//x表示当前节点的电路板排列,s表示当前节点排列好的电路板的数//表示当前节点的最大长度,low,high分别表当前节点表示每一个连接块的第一个,和最后一个电路板//的位置};//编写类的len()函数,求出当前节点的连接块长度的最大值int boardnode::len(){int tmp=0;for(int k=1;k=m;k++)if(low[k]=n high[k]0 tmphigh[k]-low[k])tmp=high[k]-low[k];return tmp;}int fifioboards(int **b,int n,int m,int *bestx)//n为电路板的数量,m为连接块的数量 {// int bestd;queueboardnode q;//声明boardnode类的节点队列qboardnode e;e.x=new int[n+1];//为数组指针x分配n+1个动态空间,存储当前的排列e.s=0;//最初时,排列好的电路板的数目为0e.cd=0;e.low=new int[m+1];//存储每个连接块的第一个电路板的位置e.high=new int[m+1];//存储每个连接块的最后一个电路板的位置 for(int i=1;i=m;i++){e.high[i]=0;//初始化开始时的每个连接块的最后一个电路板的位置为0,表示连接块i还没有电路板放入e.x的排列中e.low[i]=n+1;//初始化开始时的每个连接块的第一个电路板的位置为n+1,表示连接块i还没有电路板放入e.x的排列中}for(i=1;i=n;i++)e.x[i]=i;//初始化e.x的排列为1,2,3.....nint bestd=n+1;//最优距离bestx=0;//记录当前最优排列do{if(e.s==n-1)//当已排列了n-1个时{//判断是否改变每个连接块的最后一个电路板的位置for(int j=1;j=m;j++)if(b[e.x[n]][j] ne.high[j])e.high[j]=n;int ld=e.len();//存储当前节点的各连接块长度中的最大长度//如果当前的最大长度小于了n+1if(ldbestd){delete[] bestx;bestx=e.x;bestd=ld;//最优距离}else delete[] e.x;//删除分配给e.x的数组空间delete[] e.low;//删除分配给e.low的数组空间delete[] e.high;//删除分配给e.high的数组空间}else{int curr=e.s+1;//rr记录现在应该排列第几个电路板for(int i=e.s+1;i=n;i++)//处理扩展节点下一层所有子节点{boardnode n;n.low=new int[m+1];//与if中的意思相同n.high=new int[m+1];for(int j=1;j=m;j++){n.low[j]=e.low[j];//将e.low[]中的值赋给n.low[]n.high[j]=e.high[j];if(b[e.x[i]][j]){if(currn.low[j])n.low[j]=curr;//若当前节点连接块j的第一个电路板的位置比现在正在排列的电路板的位置还小if(currn.high[j])n.high[j]=curr;}}n.cd=n.len();//如果,当前节点的最大长度小于了最优长度则:if(n.cdbestd){n.x=new int[n+1];n.s=e.s+1;for(int j=1;j=n;j++)n.x[j]=e.x[j];n.x[n.s]=e.x[i];//交换位置n.x[i]=e.x[n.s];//交换位置q.push(n);//将节点n加入队列中}else{delete[] n.low;delete[] n.high;}//printf(%d,bestd);}delete[] e.x;//当前扩展节点所有子节点均考虑,变成死结点} //try{if(!q.empty()){e=q.front(); //取队列首节点作为扩展节点q.pop();}else return bestd;//}//catch(outofbounds)//{//return bestd;//}//printf(finish);}while(!q.empty());return bestd;return 1;}//测试void main(){//scanf(%d%d,n,m);cinnm;int **b=new int*[n+1];for (int t=0; t=n; t++)b[t] = new int[m+1];for(int i=1;i=n;i++)for(int j=1;j=m;j++)cinb[i][j];//scanf(%d,b[i][j]);int *bestx=new int[n+1];int bestd=0;bestd=fifioboards(b,n,m,bestx);printf(%d\n,bestd);for(i=1;i=n;i++){coutbestx[i] ;}coutendl;}//6-6 经典n皇后问题//description:经典n皇后问题广度优先建议n=14解空间为子集树 //参考答案说排列树是不正确的,本例打印n*n棋盘的所有解,即放置方法 #include iostream#include fstream#include algorithm#include functional#include queueusing namespace std;//本例子直接输入棋盘大小,不用文件//ifstream in(input.txt); //请在项目文件夹下新建一个input.txt//ofstream out(output.txt);class node{public:node(int n){t = 0;this-n = n;loc = new int[n + 1];for (int i = 0; i= n; ++i){loc[i] = 0;}}node(const node other){this-t = other.t;this-n = other.n;this-loc = new int [n + 1];for (int i = 0; i = n; ++i){this-loc[i] = other.loc[i];}}int t;//已放置t个皇后【篇二:计算机算法分析与设计(第四版)习题算法分析部分详解(实验二)】>实验内容:算法实现问题2-1、2-5、2-7//2-1 众数问题思路1:先排序,然后再统计,时间复杂度较高。

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

实验四贪心算法
//实验内容:算法实现题4-1、4-6、4-9
// 4-1 会场安排问题
//按照任务的开始结束时间从小到大排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; //iostream后面就可以不加.h
typedef struct node
{
int data;//时间值
int flag;//1表示开始时间,0表示结束时间
}Node;
bool compare(Node n1, Node n2)
{
return n1.data<n2.data;//升序排列
}
int maxrepeat(vector<Node> v)//最大重叠数
{
int curr=0, sum=0;
vector<Node>::iterator it=v.begin();
for(; it<=v.end(); it++)
{
if((*it).flag)
{
curr++;
if(curr>sum)
sum=curr; //curr动态变化,sum记录最大值}
else
curr--;
}
return sum;
}
void main()
{
int i, n;
vector<Node> v;
cin>>n;
Node t;
for(i=1;i<=2*n; i++)
{
cin>>t.data;
t.flag=i%2;
v.push_back(t);
}
sort(v.begin(),v.end(),compare);
cout<<maxrepeat(v)<<endl;
}
//4-6 最优服务次序问题
//贪心策略:最短服务时间优先
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int * x;
double greedy( vector<int> v,int n){ int i=1;
x[0]=0;
vector<int>::iterator it=v.begin();
for(; it<=v.end(); it++) {
x[i]=x[i-1]+(*it);
i++;
}
double sum=0;
for(i=1;i<=n;i++){
sum +=x[i];
}
return sum/n;
}
void main()
{
int i, n;
vector<int> v;
int t;
cin>>n;
x = new int[n+1];
for(i=1;i<=n; i++) //输入数据
{
cin>>t;
v.push_back(t);
}
sort(v.begin(),v.end());
cout<<greedy(v,n)<<endl;
}
//4-9 汽车加油问题
//贪心选择性质:最远加油站优先
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; //iostream后面就可以不加.h
int greedy(vector<int> v,int n){
int sum=0,k = v.size();
for(int i=0;i<k;i++){
if (v[i]>n) {
cout<<"no solution!"<<endl;
return -1;
}
}
for(int j =0,s=0;j<k;j++){
s += v[j];
if (s>n) { //不超过加满油行驶公里数的最远距离sum++;s=v[j];
}
}
return sum;
}
void main()
{
int i, n,k;
vector<int> v;
cin>>n; //加满油行驶公里数
cin>>k; //加油站数
int t;
for(i=1;i<=k+1; i++)
{
cin>>t;
v.push_back(t);
}
cout<<greedy(v,n)<<endl;
}。

相关文档
最新文档