搜档网
当前位置:搜档网 › (完整word版)计算机算法与设计分析实验报告

(完整word版)计算机算法与设计分析实验报告

(完整word版)计算机算法与设计分析实验报告
(完整word版)计算机算法与设计分析实验报告

计算机算法与设计分析

班级:

姓名:

学号:

目录

实验一分治与递归 (1)

1、基本递归算法 (1)

2、棋盘覆盖问题 (2)

3、二分搜索 (3)

4、实验小结 (5)

实验二动态规划算法 (5)

1、最长公共子序列问题 (5)

2、最大子段和问题 (7)

3、实验小结 (8)

实验三贪心算法 (8)

1、多机调度问题 (8)

2、用贪心算法求解最小生成树 (10)

3、实验小结 (12)

实验四回溯算法和分支限界法 (12)

1、符号三角形问题 (12)

2、0—1背包问题 (14)

3、实验小结 (18)

实验一分治与递归(4学时)

一、实验目的与要求

1、熟悉C/C++语言的集成开发环境;

2、通过本实验加深对递归过程的理解

二、实验内容:

掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。

三、实验题

任意输入一个整数,输出结果能够用递归方法实现整数的划分。

#include

using namespace std;

int main()

{

int a,b,c;

int q(int n,int m);

cout<<"请输入整数及大于最大加数的数"<

cin>>a>>b;

c=q(a,b);

cout<<"所需要的划分数为:"<

return 0;

}

int q(int n,int m)

{

if ((n<1)||(m<1)) return 0;

if ((n==1)||(m==1)) return 1;

if (n

if (n==m) return q(n,m-1)+1;

return q(n,m-1)+q(n-m,m);

}

实验结果:

结果分析:

实验时入得数据为:所要划分的整数是7,他的划分的最大加数的值不得大于7,根据实际其划分的情况为15种,因而可知其程序的运行结果是正确的。

一、实验目的与要求

1、掌握棋盘覆盖问题的算法;

2、初步掌握分治算法

二、实验题:

盘覆盖问题:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

三、程序代码:

#include

using namespace std;

int tile=0; //全局变量,表示特殊格的号

int board[1000][1000];

int main()

{

int tr, tc, dr, dc, size;

int tile=0; //全局变量,表示特殊格的号

void chessBoard(int tr, int tc, int dr, int dc, int size);

cout<<"输入数据"<

cin>>tr>>tc>>dr>>dc>>size;

cout<

chessBoard(tr, tc, dr, dc, size);

for(int i=1;i<=size;i++)

{

for(int j=1;j<=size;j++)

cout<

cout<

}

return 0;

}

void chessBoard(int tr, int tc, int dr, int dc, int size)//左上角行号、列号,特殊格的行号、列号棋盘大小

{

if (size == 1)

return; //???????tiao chu

int t = ++tile, // L型骨牌号??????

s = size/2; // 分割棋盘// 覆盖左上角子棋盘

if (dr < tr + s && dc < tc + s)// 特殊方格在此棋盘中

chessBoard(tr, tc, dr, dc, s);

else

{// 此棋盘中无特殊方格

// 用t 号L型骨牌覆盖右下角

board[tr + s - 1][tc + s - 1] = t;

// 覆盖其余方格

chessBoard(tr, tc, tr+s-1, tc+s-1, s);

}// 覆盖右上角子棋盘

if (dr < tr + s && dc >= tc + s) // 特殊方格在此棋盘中chessBoard(tr, tc+s, dr, dc, s);

else

{// 此棋盘中无特殊方格// 用t 号L型骨牌覆盖左下角

board[tr + s - 1][tc + s] = t; // 覆盖其余方格

chessBoard(tr, tc+s, tr+s-1, tc+s, s);

}// 覆盖左下角子棋盘

if (dr >= tr + s && dc < tc + s)

// 特殊方格在此棋盘中

chessBoard(tr+s, tc, dr, dc, s);

else

{// 用t 号L型骨牌覆盖右上角

board[tr + s][tc + s - 1] = t;// 覆盖其余方格

chessBoard(tr+s, tc, tr+s, tc+s-1, s);

}// 覆盖右下角子棋盘

if (dr >= tr + s && dc >= tc + s) // 特殊方格在此棋盘中chessBoard(tr+s, tc+s, dr, dc, s);

else

{// 用t 号L型骨牌覆盖左上角

board[tr + s][tc + s] = t;// 覆盖其余方格

chessBoard(tr+s, tc+s, tr+s, tc+s, s);

}

}

试验运行结果

一、实验目的与要求

1、熟悉二分搜索算法;

2、初步掌握分治算法;

二、实验题

1、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I 和j相同,均为x在数组中的位置。

三、程序代码:

#include

using namespace std;

int main()

{

int const length=100;

int n,x;

int a[length];

cout<<"依次输入数组的长度,数组内容,要查找的数"<

cin>>n; //输入数组的长度

for(int i=0;i

cin>>a[i];

cin>>x;

void BinarySearch(int a[],int n,int x);

BinarySearch(a, n, x);

return 0;

}

void BinarySearch(int a[],int n,int x) //n:数组长度,i,j分别表示下标

{

int i,j,mid=0,left=0;

int right=n-1;

while(left=0)

{

int mid=(left+right)/2;

if(x==a[mid])

{

i=j=mid;

break;

}

if(x>a[mid])

left=mid+1;

else

right=mid-1;

}

if ((i==j)&&(i>=0))

cout<<"所找的数据在数组中下标为:"<

else

{

i=right;

j=left;

cout<<"所找的数据不在数组中,其前后下标为:"<

}

}

如上图所示数组的长度为5,其内容依次为1 2 3 4 5,所要找的数据位3,他的下表正好是2,结果是正确的

如上图数组的长度为7,输入的数组是1 3 4 6 7 8 9,所要查找的数字式5,它不在数组中,其前后的下表分别为2,3 结果是正确的。

实验小结:

第一个实验自己做了出来,然而第二个实验卡了很久,对棋盘覆盖问题上课听懂了但是应用到实际上就有点问题了,最后还是在同学的帮助下完成的!后面的这个提高题也是查考同学的,虽然自己没能做出来,但是感觉还是应该去学习!

实验二动态规划算法

一、实验目的与要求

1、熟悉最长公共子序列问题的算法;

2、初步掌握动态规划算法;

二、实验题

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。

三、实验程序

#include

using namespace std;

int fun(char *x)

{

char *y=x;

while(*y++){};

return y-x-1;

}

void LCSLength(char *x ,char *y,int m,int n, int **c, int **b) {

int i ,j;

for (i = 1; i <= m; i++) c[i][0] = 0;

for (i = 1; i <= n; i++) c[0][i] = 0;

for (i = 1; i <= m; i++)

for (j = 1; j <= n; j++)

{if (x[i]==y[j])

{c[i][j]=c[i-1][j-1]+1;

b[i][j]=1;

}

else if (c[i-1][j]>=c[i][j-1])

{

c[i][j]=c[i-1][j];

b[i][j]=2;

}

else

{ c[i][j]=c[i][j-1];

b[i][j]=3;

}

}

}

void LCS(int i ,int j, char *x ,int **b)

{

if (i ==0 || j==0) return;

if (b[i][j]== 1)

{

LCS(i-1,j-1,x,b);

printf("%c",x[i]);

}

else if (b[i][j]== 2)

LCS(i-1,j,x,b);

else LCS(i,j-1,x,b);

}

int main()

{

char x[50],y[50];

int m,n;

int **c =new int*[50],**b =new int*[50];

for(int i=0;i<50;i++)

{

c[i] =new int[50];

b[i] =new int[50];

}

//int c[50][50],b[50][50];

cout<<"请输入第一组字符串:";

cin>>x;

cout<<"请输入第二组字符串:";

cin>>y;

m=fun(x);

n=fun(y);

LCSLength(x,y,m,n,c,b);

LCS(m,n,x,b);

cout<

return 0;

}

四、运行结果

一、实验目的与要求

1、熟悉最长最大字段和问题的算法;

2、进一步掌握动态规划算法;

二、实验题

若给定n个整数组成的序列a1,a2,a3,……a n,求该序列形如a i+a i+1+……+a n的最大值。

三、程序清单

#include

using namespace std;

int MaxSum(int n,int *a,int &besti,int &bestj)

{

int sum=0;

for(int i=0;i

{

int thissum=0;

for(int j=i;j<=n;j++)

{

thissum+=a[j];

if(thissum>sum)

{

sum=thissum;

besti=i;

bestj=j;

}

}

}

return sum;

}

int main()

{

int *a=new int[50];

int x,n,besti,bestj;

cout<<"请输入字符串的个数:";

cin>>n;

cout<<"请输入字符串中的每个数字:" ;

for(int i=0;i

{

cin>>a[i];

}

x=MaxSum(n,a,besti,bestj);

cout<<"最大子段和为:"<<"起始位置:"<

return 0;

}

四、运行结果

实验小结

第一个求公共子序列感觉和递归查询差不多,然后再查询第二列进行对比!最大子段和感觉就像求整列的和!

实验三贪心算法(2学时)

一、实验目的与要求

1、熟悉多机调度问题的算法;

2、初步掌握贪心算法;

二、实验题

要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。

三、实验程序

#include

using namespace std;

typedef struct Job

{

int ID;//作业号

int time;//作业所花费的时间

}Job;

Job J[10];

typedef struct JobNode //作业链表的节点

{

int ID;

int time;

JobNode *next;

}JobNode,*pJobNode;

typedef struct Header //链表的表头,不同的机器??

{

int s; //表示其最大的容量

pJobNode next;

}Header,*pHeader; //

int l=1;

int main()

{

//Job J[10];

Header M[10];

int m,n; //机器的个数

cout<<"请输入数据作业的个数与机器的个数"<

cin>>n>>m;

cout<<"请输入所有的任务的相关数据"<

for(int i=1;i<=m;i++)

M[i].s=0; //表示其最大容量

for( l=1;l<=n;l++)//所有的任务作业

cin>>J[l].ID>>J[l].time;

int SelectMin(Header* M,int m);//SelectMin(M,m);

for(l=1;l<=n;l++)

cout<<"第"<

<<"M"<

return 0;

}

int SelectMin(Header* M,int m) //有几台机器,就创建几个链表

{

int k=1;

for(int i=1;i<=m;i++)

{

if(M[i].s<=M[1].s) //最小的加入,s标识时间的和值

k=i;

}

M[k].s+=J[l].time;

return k; //k是标识第几台机器加入作业

}

五、实验结果

一、实验要求与目的

1、熟悉贪心算法的基本原理与适用范围。

2、使用贪心算法编程,求解最小生成树问题。

二、实验内容

1、任选一种贪心算法(Prim或Kruskal),求解最小生成树。对算法进行描述和复杂性分析。编程实现,并给出测试实例

三、实验程序

#include

using namespace std;

int const inf=100;

int main()

{

int n=6;

cout<<"所给图的最小生成树一次选定的边是表示为:"<

int c[7][7]=

{

{inf,inf,inf,inf,inf,inf,inf},

{inf,inf,6,1,5,inf,inf},

{inf,inf,inf,5,inf,3,inf},

{inf,1 , 5,inf,5,6,4},

{inf,5,inf,5,inf,inf,2},

{inf,inf,3,6,inf,inf,6},

{inf,inf,inf,4,2,6,inf}

};

//c[1][2]=6;c[1][4]=5;c[1][3]=1;c[2][3]=5;c[3][4]=5;c[2][5]=3;c[2][6]=2;

//c[3][5]=6;c[3][6]=4;c[5][6]=6;

c[2][1]=6;c[4][1]=5;c[3][1]=1;c[3][2]=5;c[4][3]=5;c[5][2]=3;c[6][2]=2;

//c[5][3]=6;c[6][3]=4;c[6][5]=6;

void prim(int n,int c[7][7]);

prim(n,c);

return 0;

}

void prim(int n,int c[7][7])

{

int lowcost[7];

int closet[7];

bool s[10];

s[1]=true;

for(int i=2;i<=n;i++)

{

lowcost[i]=c[1][i];

closet[i]=1;

s[i]=false;

}

int j=1;

for(i=1;i

{

int min=inf;

int j=1;

for(int k=2;k<=n;k++)

if((lowcost[k]0))

{

min=lowcost[k];

j=k;

}

cout<"<

s[j]=true;

for(k=2;k<=n;k++)

if((c[j][k]

{

lowcost[k]=c[j][k];

closet[k]=j;

}

}

}

四、实验结果

五、实验小结

贪心算法上课老师讲的时候也能听懂,讲的例子也能明白,但是在实际调度时遇到了不小的麻烦!最后在老师和同学的帮助下完成了!尽管自己没有做出来,但是对贪心算法的实际操作有了更一步的把握!

实验四回溯算法和分支限界法(2学时)

一、实验目的与要求

1、掌握符号三角形问题的算法;

2、初步掌握回溯算法;

二、实验题图

下面都是“-”。下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相三、实验程序

#include

using namespace std;

typedef unsigned char uchar;

int sum; uchar** p; //符号存储空间;//表示满足要求的三角形个数

char ch[2]={'+','-'}; int n; //第一行符号总数

int half; int count; //用来计算‘-’的个数

void BackTrace(int t)

{

if (t>n)

{

sum++;

cout<<"第"<

for (int i=1;i<=n;i++)

{

for (int j=1;j

cout<<" ";

for (j=1;j<=n-i+1;j++)

cout<

cout<

}

}

else

{

for (int i=0;i<=1;i++)

{

p[1][t]=i; //确定第一行第t个的值;

count+=i; //用来计算‘-’的个数;

for (int j=2;j<=t;j++)

{

p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2]; //第一行大于等于2时确定后面从第2行开始增加的一

count+=p[j][t-j+1]; //列中符号,计算‘-’个数;

}

if (count <= half && (t*(t+1)/2-count) <= half) //约束条件;

{

BackTrace(t+1);

}

for (j=2;j<=t;j++) //回溯,判断另一种符号情况;

{

count-=p[j][t-j+1];

}

count-=p[1][t];

}

}

}

int main()

{

cout<<"请输入第一行符号的个数:";

cin>>n;

count=0;

sum=0;

half=n*(n+1)/2;

if (half%2==0)

{

half=half/2;

p=new uchar* [n+1];

for (int i=0;i<=n;i++)

{

p[i]=new uchar[n+1];

memset(p[i],0,sizeof(uchar)*(n+1));

}

BackTrace(1);

for (i=0;i<=n;i++)

{

delete[] p[i];

}

delete[] p;

cout<<"满足要求的三角形符号共有:"<

}

else

{

cout<<"不存在这样的三角形符号!";

}

return 0;

}

五、实验结果

一、实验目的与要求

1、掌握0—1背包问题的回溯算法;

2、进一步掌握回溯算法;

二、实验题:

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

三、实验程序

#include

using namespace std;

class Knap

{

friend int Knapsack(int p[],int w[],int c,int n );

public:

void print()

{

for(int m=1;m<=n;m++)

{

cout<

}

cout<

};

private:

int Bound(int i);

void Backtrack(int i);

int c;//背包容量

int n; //物品数

int *w;//物品重量数组

int *p;//物品价值数组

int cw;//当前重量

int cp;//当前价值

int bestp;//当前最优值

int *bestx;//当前最优解

int *x;//当前解

};

int Knap::Bound(int i)

{

//计算上界

int cleft=c-cw;//剩余容量

int b=cp;

//以物品单位重量价值递减序装入物品

while(i<=n&&w[i]<=cleft)

{

cleft-=w[i];

b+=p[i];

i++;

}

//装满背包

if(i<=n)

b+=p[i]/w[i]*cleft;

return b;

}

void Knap::Backtrack(int i)

{

if(i>n)

{

if(bestp

{

for(int j=1;j<=n;j++)

bestx[j]=x[j];

bestp=cp;

}

return;

}

if(cw+w[i]<=c) //搜索左子树

{ x[i]=1;

cw+=w[i];

cp+=p[i];

Backtrack(i+1);

cw-=w[i];

cp-=p[i];

}

if(Bound(i+1)>bestp)//搜索右子树

{

x[i]=0;

Backtrack(i+1);

}

}

class Object

{

friend int Knapsack(int p[],int w[],int c,int n); public:

int operator<=(Object a)const

{

return (d>=a.d);

}

private:

int ID;

float d;

};

int Knapsack(int p[],int w[],int c,int n)

{

//为Knap::Backtrack初始化

int W=0;

int P=0;

int i=1;

Object *Q=new Object[n];

for(i=1;i<=n;i++)

{

Q[i-1].ID=i;

Q[i-1].d=1.0*p[i]/w[i];

P+=p[i];

W+=w[i];

}

if(W<=c)

return P;//装入所有物品

//依物品单位重量排序

float f;

for( i=0;i

for(int j=i;j

{

if(Q[i].d

{

f=Q[i].d;

Q[i].d=Q[j].d;

Q[j].d=f;

}

}

Knap K;

K.p = new int[n+1];

K.w = new int[n+1];

K.x = new int[n+1];

K.bestx = new int[n+1];

K.x[0]=0;

K.bestx[0]=0;

for( i=1;i<=n;i++)

{

K.p[i]=p[Q[i-1].ID];

K.w[i]=w[Q[i-1].ID];

}

K.cp=0;K.cw=0;

K.c=c;K.n=n;

K.bestp=0;//回溯搜索

K.Backtrack(1);K.print();

delete [] Q;delete [] K.w;

delete [] K.p;

return K.bestp;

}

void main()

{

int *p;int *w; int c=0;int n=0;int i=0;

cout<<"请输入背包个数:"<

cin>>n;

p=new int[n+1];

w=new int[n+1];

p[0]=0;w[0]=0;

cout<<"请输入各背包的价值:"<

for(i=1;i<=n;i++)

cin>>p[i];

cout<<"请输入各背包的重量:"<

for(i=1;i<=n;i++)

cin>>w[i];

cout<<"请输入背包容量:"<

cin>>c;

cout<

}

四、实验结果

实验小结:

符号三角形问题以前在学C++时,自己做出来过这种图形,不过没有这么多,而且算法也不一样!原打算上周交的,最近在复习软件工程就一直没有弄这个!0-1背包问题也学了好多,但是学的不是很深,感觉有点看不透!最后感谢老师和同学的帮助及指导!!

算法设计与分析(作业三)

算法设计与分析实验报告 学院信息科学与技术学院 专业班级软件工程3班 学号 20122668 姓名王建君 指导教师尹治本 2014年10月

实验四 矩阵相乘次序 一、问题提出 用动态规划算法解矩阵连乘问题。给定n 个矩阵{A 1,A 2,…,A n },其中A i 与A i+1是可乘的,i=1,2,…,n-1。要算出这n 个矩阵的连乘积A 1A 2…A n 。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。完全加括号的矩阵连乘积可递归地定义为: (1)单个矩阵是完全加括号的; (2)矩阵连乘积A 是完全加括号的,则A 可表示为2个完全加括号的矩阵连乘积B 和C 的乘积并加括号,即A=(BC)。 例如,矩阵连乘积A 1A 2A 3A 4有5种不同的完全加括号的方式:(A 1(A 2(A 3A 4))),(A 1((A 2A 3)A 4)),((A 1A 2)(A 3A 4)),((A 1(A 2A 3))A 4),(((A 1A 2)A 3)A 4)。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。若A 是一个p ×q 矩阵,B 是一个q ×r 矩阵,则计算其乘积C=AB 的标准算法中,需要进行pqr 次数乘。 (3)为了说明在计算矩阵连乘积时,加括号方式对整个计算量的影响,先考察3个矩阵{A 1,A 2,A 3}连乘的情况。设这三个矩阵的维数分别为10×100,100×5,5×50。加括号的方式只有两种:((A 1A 2)A 3),(A 1(A 2A 3)),第一种方式需要的数乘次数为10×100×5+10×5×50=7500,第二种方式需要的数乘次数为100×5×50+10×100×50=75000。第二种加括号方式的计算量时第一种方式计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大的影响。于是,自然提出矩阵连乘积的最优计算次序问题,即对于给定的相继n 个矩阵{A 1,A 2,…,A n }(其中矩阵Ai 的维数为p i-1×p i ,i =1,2,…,n ),如何确定计算矩阵连乘积A 1A 2…A n 的计算次序(完全加括号方式),使得依此次序计算矩阵连乘积需要的数乘次数最少。 二、求解思路 本实验采用动态规划算法解矩阵连乘积的最优计算次序问题。本实验的算法思路是: 1)计算最优值算法MatrixChain():建立两张表(即程序中的**m 和**s ,利用二维指针存放),一张表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵…、直到n 个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n 个矩阵相乘的最小运算量;另一张表存储最优断开位置。 2)输出矩阵结合方式算法Traceback():矩阵结合即是给矩阵加括号,打印出矩阵结合方式,由递归过程Traceback()完成。分三种情况: (1)只有一个矩阵,则只需打印出A1; (2)有两个矩阵,则需打印出(A1A2); (3)对于矩阵数目大于2,则应该调用递归过程Traceback()两次,构造出最优加括号方式。 三、算法复杂度 该算法时间复杂度最高为)(n 3 O 。 四、实验源代码

《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案 一.选择题 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。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、最优子结构性质 20. 矩阵连乘问题的算法可由( B )设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 21. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

计算机组成原理试题及答案

A .(7CD )16 B. ( 7D0)16 C. (7E0)16 D. 3. 下列数中最大的数是 _______ 。 A .(10011001) 2 B. (227) 8 C. (98)16 4. ____ 表示法主要用于表示浮点数中的阶码。 A. 原码 B. 补码 C. 反码 D. 移码 5. 在小型或微型计算机里,普遍采用的字符编码是 A. BCD 码 B. 16 进制 C. 格雷码 6. 下列有关运算器的描述中, ______ 是正确的 A. 只做算术运算,不做逻辑运算 B. C. 能暂时存放运算结果 D. 7. EPROM 是指 ____ 。 A. 读写存储器 B. C. 可编程的只读存储器 D. 8. Intel80486 是 32位微处理器, Pentium 是A.16 B.32 C.48 D.64 9 .设]X ]补=1.XXX 3X 4,当满足 _________ ■寸,X > -1/2 成立。 A. X 1必须为1,X 2X 3X 4至少有一个为1 B. X 1必须为1 , X 2X 3X 4任意 C. X 1必须为0, X 2X 3X 4至少有一个为1 D. X 1必须为0, X 2X 3X 4任意 10. CPU 主要包括 _____ 。 A.控制器 B. 控制器、运算器、cache C.运算器和主存 D.控制器、ALU 和主存 11. 信息只用一条传输线 ,且采用脉冲传输的方式称为 _________ 。 A. 串行传输 B. 并行传输 C. 并串行传输 D. 分时传输 12. 以下四种类型指令中,执行时间最长的是 _________ 。 A. RR 型 B. RS 型 C. SS 型 D. 程序控制指令 13. 下列 _____ 属于应用软件。 A. 操作系统 B. 编译系统 C. 连接程序 D. 文本处理 14. 在主存和CPU 之间增加cache 存储器的目的是 _____ 。 A. 增加内存容量 B. 提高内存可靠性 C.解决CPU 和主存之间的速度匹配问题 D. 增加内存容量,同时加快存取速 度 15. 某单片机的系统程序,不允许用户在执行时改变,则可以选用 ____________ 作为存储芯 片。 A. SRAM B. 闪速存储器 C. cache D. 辅助存储器 16. 设变址寄存器为X ,形式地址为D, (X )表示寄存器X 的内容,这种寻址方式的有 效地址为 ______ 。 A. EA=(X)+D B. EA=(X)+(D) C.EA=((X)+D) D. EA=((X)+(D)) 17. 在指令的地址字段中,直接指出操作数本身的寻址方式,称为 ___________ 。 A. 隐含寻址 B. 立即寻址 C. 寄存器寻址 D. 直接寻址 18. 下述 I/O 控制方式中,主要由程序实现的是 ________ 。 7F0)16 D. ( 152)10 o D. ASC H 码 只做加法 既做算术运算,又做逻辑运算 只读存储器 光擦除可编程的只读存储器 位微处理器。

算法分析与设计作业及参考答案样本

《算法分析与设计》作业( 一) 本课程作业由两部分组成。第一部分为”客观题部分”, 由 15个选择题组成, 每题1分, 共15分。第二部分为”主观题部分”, 由简答题和论述题组成, 共15分。作业总分30分, 将作为平时成 绩记入课程总成绩。 客观题部分: 一、选择题( 每题1分, 共15题) 1、递归算法: ( C ) A、直接调用自身 B、间接调用自身 C、直接或间接 调用自身 D、不调用自身 2、分治法的基本思想是将一个规模为n的问题分解为k个规模 较小的字问题, 这些子问题: ( D ) A、相互独立 B、与原问题相同 C、相互依赖 D、相互独立且与原问题相同 3、备忘录方法的递归方式是: ( C ) A、自顶向下 B、自底向上 C、和动态规划算法相同 D、非递归的 4、回溯法的求解目标是找出解空间中满足约束条件的: ( A )

A、所有解 B、一些解 C、极大解 D、极小解 5、贪心算法和动态规划算法共有特点是: ( A ) A、最优子结构 B、重叠子问题 C、贪心选择 D、 形函数 6、哈夫曼编码是: ( B) A、定长编码 B、变长编码 C、随机编码 D、定 长或变长编码 7、多机调度的贪心策略是: ( A) A、最长处理时间作业优先 B、最短处理时间作业优 先 C、随机调度 D、最优调度 8、程序能够不满足如下性质: ( D ) A、零个或多个外部输入 B、至少一个输出 C、指令的确定性 D、指令的有限性 9、用分治法设计出的程序一般是: ( A ) A、递归算法 B、动态规划算法

C、贪心算法 D、回溯法 10、采用动态规划算法分解得到的子问题: ( C ) A、相互独立 B、与原问题相同 C、相互依赖 D、相互独立且与原问题相同 11、回溯法搜索解空间的方法是: ( A ) A、深度优先 B、广度优先 C、最小耗费优先 D、随机搜索 12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策 有可能导致算法: ( C ) A、所需时间变化 B、一定找到解 C、找不到所需的解 D、性能变差 13、贪心算法能得到: ( C ) A、全局最优解 B、 0-1背包问题的解 C、背包问题的 解 D、无解 14、能求解单源最短路径问题的算法是: ( A ) A、分支限界法 B、动态规划 C、线形规划 D、蒙特卡罗算法 15、快速排序算法和线性时间选择算法的随机化版本是:

计算机算法设计与分析

算法设计与分析 实 验 报 告 班级: 姓名: 学号: (备注:共给出5个参考实验案例,根据学号尾数做对应的实验,即如尾号为1,则模仿案例实验123;尾号2,则模仿案例实验234;尾号3,即345;尾号4,同1.)

目录 实验一分治与递归 (1) 1、基本递归算法 (1) 2、棋盘覆盖问题 (2) 3、二分搜索 (3) 4、实验小结 (5) 实验二动态规划算法 (5) 1、最长公共子序列问题 (5) 2、最大子段和问题 (7) 3、实验小结 (8) 实验三贪心算法 (8) 1、多机调度问题 (8) 2、用贪心算法求解最小生成树 (10) 3、实验小结 (12) 实验四回溯算法和分支限界法 (12) 1、符号三角形问题 (12) 2、0—1背包问题 (14) 3、实验小结 (18) 实验五多种排序算法效率比较 1、算法:起泡排序、选择排序、插入排序、shell排序,归并排序、快速排序等 (19) 2、实验小结 (18)

P art1:课程设计过程 设计选题--→题目分析---→系统设计--→系统实现--→结果分析---→撰写报告 P art2:课程设计撰写的主要规范 1.题目分析:主要阐述学生对题目的分析结果,包括题目描述、 分析得出的有关模型、相关定义及假设; 2.总体设计:系统的基本组成部分,各部分所完成的功能及相互 关系; 3.数据结构设计:主要功能模块所需的数据结构,集中在逻辑设 计上; 4.算法设计:在数据结构基础上,完成算法设计; 5.物理实现:主要有数据结构的物理存储,算法的物理实现,系 统相关的实现。具体在重要结果的截图,测试案例的结果数据,核心算法的实现结果等; 6.结果分析:对第五步的分析,包括定性分析和定量分析,正确 性分析,功能结构分析,复杂性分析等; 7.结论:学生需对自己的课程设计进行总结,给出评价,并写出 设计体会; 8.附录:带有注释的源代码,系统使用说明等; 9.参考文献:列出在撰写过程中所需要用到的参考文献。

北京理工大学《数据结构与算法设计》实验报告实验一

《数据结构与算法设计》 实验报告 ——实验一 学院: 班级: 学号: 姓名:

一、实验目的 1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC环境,加强编程、调试的练习; 3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作; 4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的 结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到 第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点 的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出 了这个环表的全部结点为止。 三、程序设计 1、概要设计 为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。 (1)、单向环表的抽象数据类型定义为: ADT Joseph{ 数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={ |ai∈D,i=1,2,……,n} 基本操作: create(&L,n) 操作结果:构造一个有n个结点的单向环表L。 show(L) 初始条件:单向环表L已存在。 操作结果:按顺序在屏幕上输出L的数据元素。 Josephf( L,m,s,n) 初始条件:单向环表L已存在, s>0,n>0,s

计算机组成原理试题及答案

二、填空题 1 字符信息是符号数据,属于处理(非数值)领域的问题,国际上采用的字符系统是七单位的(ASCII)码。P23 2 按IEEE754标准,一个32位浮点数由符号位S(1位)、阶码E(8位)、尾数M(23位)三个域组成。其中阶码E的值等于指数的真值(e)加上一个固定的偏移值(127)。P17 3 双端口存储器和多模块交叉存储器属于并行存储器结构,其中前者采用(空间)并行技术,后者采用(时间)并行技术。P86 4 衡量总线性能的重要指标是(总线带宽),它定义为总线本身所能达到的最高传输速率,单位是(MB/s)。P185 5 在计算机术语中,将ALU控制器和()存储器合在一起称为()。 6 数的真值变成机器码可采用原码表示法,反码表示法,(补码)表示法,(移码)表示法。P19-P21 7 广泛使用的(SRAM)和(DRAM)都是半导体随机读写存储器。前者的速度比后者快,但集成度不如后者高。P67 8 反映主存速度指标的三个术语是存取时间、(存储周期)和(存储器带宽)。P67 9 形成指令地址的方法称为指令寻址,通常是(顺序)寻址,遇到转移指令时(跳跃)寻址。P112 10 CPU从(主存中)取出一条指令并执行这条指令的时间和称为(指令周期)。 11 定点32位字长的字,采用2的补码形式表示时,一个字所能表示

的整数范围是(-2的31次方到2的31次方减1 )。P20 12 IEEE754标准规定的64位浮点数格式中,符号位为1位,阶码为11位,尾数为52位,则它能表示的最大规格化正数为(+[1+(1-2 )]×2 )。 13 浮点加、减法运算的步骤是(0操作处理)、(比较阶码大小并完成对阶)、(尾数进行加或减运算)、(结果规格化并进行舍入处理)、(溢出处理)。P54 14 某计算机字长32位,其存储容量为64MB,若按字编址,它的存储系统的地址线至少需要(14)条。64×1024KB=2048KB(寻址范32围)=2048×8(化为字的形式)=214 15一个组相联映射的Cache,有128块,每组4块,主存共有16384块,每块64个字,则主存地址共(20)位,其中主存字块标记应为(9)位,组地址应为(5)位,Cache地址共(13)位。 16 CPU存取出一条指令并执行该指令的时间叫(指令周期),它通常包含若干个(CPU周期),而后者又包含若干个(时钟周期)。P131 17 计算机系统的层次结构从下至上可分为五级,即微程序设计级(或逻辑电路级)、一般机器级、操作系统级、(汇编语言)级、(高级语言)级。P13 18十进制数在计算机内有两种表示形式:(字符串)形式和(压缩的十进制数串)形式。前者主要用在非数值计算的应用领域,后者用于直接完成十进制数的算术运算。P19 19一个定点数由符号位和数值域两部分组成。按小数点位置不同,

最新算法分析与设计作业(一)及参考答案讲课讲稿

《算法分析与设计》作业(一) 本课程作业由两部分组成。第一部分为“客观题部分”,由15个选择题组成,每题1分,共15分。第二部分为“主观题部分”,由简答题和论述题组成,共15分。作业总分30分,将作为平时成绩记入课程总成绩。 客观题部分: 一、选择题(每题1分,共15题) 1、递归算法:(C ) A、直接调用自身 B、间接调用自身 C、直接或间接调用自身 D、不调用自身 2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题,这些子问题:(D ) A、相互独立 B、与原问题相同 C、相互依赖 D、相互独立且与原问题相同 3、备忘录方法的递归方式是:(C ) A、自顶向下 B、自底向上 C、和动态规划算法相同 D、非递归的 4、回溯法的求解目标是找出解空间中满足约束条件的:(A ) A、所有解 B、一些解 C、极大解 D、极小解 5、贪心算法和动态规划算法共有特点是:( A ) A、最优子结构 B、重叠子问题 C、贪心选择 D、形函数 6、哈夫曼编码是:(B) A、定长编码 B、变长编码 C、随机编码 D、定长或变长编码 7、多机调度的贪心策略是:(A) A、最长处理时间作业优先 B、最短处理时间作业优先 C、随机调度 D、最优调度 8、程序可以不满足如下性质:(D ) A、零个或多个外部输入 B、至少一个输出 C、指令的确定性 D、指令的有限性 9、用分治法设计出的程序一般是:(A ) A、递归算法 B、动态规划算法

C、贪心算法 D、回溯法 10、采用动态规划算法分解得到的子问题:( C ) A、相互独立 B、与原问题相同 C、相互依赖 D、相互独立且与原问题相同 11、回溯法搜索解空间的方法是:(A ) A、深度优先 B、广度优先 C、最小耗费优先 D、随机搜索 12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法:( C ) A、所需时间变化 B、一定找到解 C、找不到所需的解 D、性能变差 13、贪心算法能得到:(C ) A、全局最优解 B、0-1背包问题的解 C、背包问题的解 D、无解 14、能求解单源最短路径问题的算法是:(A ) A、分支限界法 B、动态规划 C、线形规划 D、蒙特卡罗算法 15、快速排序算法和线性时间选择算法的随机化版本是:( A ) A、舍伍德算法 B、蒙特卡罗算法 C、拉斯维加斯算法 D、数值随机化算法 主观题部分: 二、写出下列程序的答案(每题2.5分,共2题) 1、请写出批处理作业调度的回溯算法。 #include #include using namespace std; class Flowing { friend int Flow(int ** ,int ,int []); private: //int Bound(int i); void Backtrack(int t); int **M;// int *x;//当前解

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网1101 姓名:黄振亮 学号:20113379 2013年11月

目录 作业1 0-1背包问题的动态规划算法 (7) 1.1算法应用背景 (3) 1.2算法原理 (3) 1.3算法描述 (4) 1.4程序实现及程序截图 (4) 1.4.1程序源码 (4) 1.4.2程序截图 (5) 1.5学习或程序调试心得 (6) 作业2 0-1背包问题的回溯算法 (7) 2.1算法应用背景 (3) 2.2算法原理 (3) 2.3算法描述 (4) 2.4程序实现及程序截图 (4) 2.4.1程序源码 (4) 2.4.2程序截图 (5) 2.5学习或程序调试心得 (6) 作业3循环赛日程表的分治算法 (7) 3.1算法应用背景 (3) 3.2算法原理 (3) 3.3算法描述 (4) 3.4程序实现及程序截图 (4)

3.4.1程序源码 (4) 3.4.2程序截图 (5) 3.5学习或程序调试心得 (6) 作业4活动安排的贪心算法 (7) 4.1算法应用背景 (3) 4.2算法原理 (3) 4.3算法描述 (4) 4.4程序实现及程序截图 (4) 4.4.1程序源码 (4) 4.4.2程序截图 (5) 4.5学习或程序调试心得 (6)

作业1 0-1背包问题的动态规划算法 1.1算法应用背景 从计算复杂性来看,背包问题是一个NP难解问题。半个世纪以来,该问题一直是算法与复杂性研究的热点之一。另外,背包问题在信息加密、预算控制、项目选择、材料切割、货物装载、网络信息安全等应用中具有重要的价值。如果能够解决这个问题那么则具有很高的经济价值和决策价值,在上述领域可以获得最大的价值。本文从动态规划角度给出一种解决背包问题的算法。 1.2算法原理 1.2.1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi ∈{0,1}, ?∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 1.2.2、最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有 ∑vizi > ∑viyi (i=2,…,n) 且 w1y1+ ∑wizi<= c 因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n) 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。 1.2.3、递推关系:

计算机组成原理练习题-答案

一、填空题 1.对存储器的要求是速度快,_容量大_____,_价位低_____。为了解决这方面的矛盾,计算机采用多级存储体系结构。 2.指令系统是表征一台计算机__性能__的重要因素,它的____格式__和___功能___不仅直接影响到机器的硬件结构而且也影响到系统软件。 3.CPU中至少有如下六类寄存器__指令____寄存器,__程序_计数器,_地址__寄存器,通用寄存器,状态条件寄存器,缓冲寄存器。 4.完成一条指令一般分为取指周期和执行周期,前者完成取指令和分析指令操作,后者完成执行指令操作。 5.常见的数据传送类指令的功能可实现寄存器和寄存器之间,或寄存器和存储器之间的数据传送。 6.微指令格式可分为垂直型和水平型两类,其中垂直型微指令用较长的微程序结构换取较短的微指令结构。 7.对于一条隐含寻址的算术运算指令,其指令字中不明确给出操作数的地址,其中一个操作数通常隐含在累加器中 8.设浮点数阶码为8位(含1位阶符),尾数为24位(含1位数符),则32位二进制补码浮点规格化数对应的十进制真值范围是:最大正数为 2^127(1-2^-23) ,最小正数为 2^-129 ,最大负数为 2^-128(-2^-1-2^-23) ,最小负数为 -2^127 。 9.某小数定点机,字长8位(含1位符号位),当机器数分别采用原码、补码和反码时,其对应的真值范围分别是 -127/128 ~+127/128 -1 ~+127/128 -127/128 ~+127/128 (均用十进制表示)。 10.在DMA方式中,CPU和DMA控制器通常采用三种方法来分时使用主存,它们是停止CPU访问主存、周期挪用和DMA和CPU交替访问主存。 11.设 n = 8 (不包括符号位),则原码一位乘需做 8 次移位和最多 8 次加法,补码Booth算法需做 8 次移位和最多 9 次加法。 12.设浮点数阶码为8位(含1位阶符),尾数为24位(含1位数符),则32位二进制补码浮点规格化数对应的十进制真值范围是:最大正数为,最小正数为,最大负数为,最小负数为。 13.一个总线传输周期包括申请分配阶段、寻址阶段、传输阶段和结束阶段四个阶段。 14.CPU采用同步控制方式时,控制器使用机器周期和节拍组成的多极时序系统。

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

计算机组成原理典型例题讲解

分析设计计算: 1.CPU结构如图1所示,其中有一个累加寄存器AC,一个状态条件寄存器,各部分之间的连线表示数据通路,箭头表示信息传送方向。 (1)标明图中四个寄存器的名称。 (2)简述指令从主存取到控制器的数据通路。 (3)简述数据在运算器和主存之间进行存/ 取访问的数据通路。 图1 解: (1)a为数据缓冲寄存器DR ,b为指令寄存器IR ,c为主存地址寄存器,d为程序计数器PC。 (2)主存M →缓冲寄存器DR →指令寄存器IR →操作控制器。 (3)存贮器读:M →缓冲寄存器DR →ALU →AC 存贮器写:AC →缓冲寄存器DR →M

2. 某机器中,配有一个ROM芯片,地址空间0000H—3FFFH。现在再用几个16K×8的芯片构成一个32K×8的RAM区域,使其地址空间为8000H—FFFFH。假设此RAM芯片有/CS和/WE信号控制端。CPU地址总线为A15—A0,数据总线为D7—D0,控制信号为R//W,MREQ(存储器请求),当且仅当MREQ 和R//W同时有效时,CPU才能对有存储器进行读(或写)。 (1)满足已知条件的存储器,画出地址码方案。 (2)画出此CPU与上述ROM芯片和RAM芯片的连接图。 解:存储器地址空间分布如图1所示,分三组,每组16K×8位。 由此可得存储器方案要点如下: (1)用两片16K*8 RAM芯片位进行串联连接,构成32K*8的RAM区域。片内地址:A0——A13,片选地址为:A14——A15; (2)译码使用2 :4 译码器; (3)用/MREQ 作为2 :4译码器使能控制端,该信号低电平(有效)时,译码器工作。 (4)CPU的R / /W信号与RAM的/WE端连接,当R // W = 1时存储器执行读操作,当R // W = 0时,存储器执行写操作。如图1 0000 3FFF 8000

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

《算法分析与设计》作业参考答案 作业一 一、名词解释: 1.递归算法:直接或间接地调用自身的算法称为递归算法。 2.程序:程序是算法用某种程序设计语言的具体实现。 二、简答题: 1.算法需要满足哪些性质?简述之。 答:算法是若干指令的有穷序列,满足性质: (1)输入:有零个或多个外部量作为算法的输入。(2)输出:算法产生至少一个量作为输出。 (3)确定性:组成算法的每条指令清晰、无歧义。 (4)有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。 2.简要分析分治法能解决的问题具有的特征。 答:分析分治法能解决的问题主要具有如下特征: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 3.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。 答:将递归算法转化为非递归算法的方法主要有: (1)采用一个用户定义的栈来模拟系统的递归调用工作栈。该方法通用性强,但本质上还是递归, 只不过人工做了本来由编译器做的事情,优化效果不明显。(2)用递推来实现递归函数。 (3)通过Cooper 变换、反演变换能将一些递归转化为尾递归,从而迭代求出结果。 后两种方法在时空复杂度上均有较大改善,但其适用范围有限。 三、算法编写及算法应用分析题: 1.冒泡排序算法的基本运算如下: for i ←1 to n-1 do for j ←1 to n-i do if a[j]

计算机算法设计与分析期末考试复习题

1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 5. 回溯法解TSP问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 9. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、实现最长公共子序列利用的算法是( B )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法11.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( B )。 A、重叠子问题 B、最优子结构性质 C、贪心选择性质 D、定义最优解14.广度优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.背包问题的贪心算法所需的计算时间为( B )。

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

计算机组成原理试题

计算机组成原理试题(A) 教学中心名称考点成绩 专业、班级姓名学号 一、填空题(每空1分,共10分) 1.计算机中的信息可分为两类,它们是信息和信息。 2.第二代电子数字计算机所用的基本器件是。 3.设X=-9/16,[X]补= 。 4.运算器中的核心部件是。 5.浮点表示法中,阶码决定浮点数的,尾数决定浮点数的。 6.CPU中PC的主要功能是。 7.按照信息的传送格式,接口可分为和两大类。 二、选择题(每小题2分,共20分) 1. 某主存储器按字节编址,地址线数目为16,这个存储器的容量为 . A 16K×16位B.32K×8位、C.64K ×8位 2.采用DMA方式传送数据时,每传送一个数据就要占用的时间。 A一个指令周期B.一个存储周期C.一个机器周期 3. Cache是。 A.主存的一部分 B.为扩大存储容量而设置的 C.为提高存储系统的速度而设置的 4.操作控制器的功能是。 A产生操作控制信号,以解释并执行指令 B、产生时序信号C.对指令泽码 5.中断响应时,保存PC并更新PC的内容,主要是为了. A.提高处理机的速度 B.能进入中断处理程字并能正确返回原程序 C.便于编制中断处理程序 6.计算机辅助设计是指。 A.CAD B.CAI C.CAT 7.某机字长32位,内存容量为4MW,若按字节编址,其寻址范围为. A.0~4M B。0~16M C.0~32M 8.在磁盘存储器中,与转速无关的技术指标是。 A.存储密度B.平均等待时间C.数据传输率 9.设指令中的形式地址为以相对寻址时,操作数的有效地址E=. A.(D)B.(PC)+D C.(R)+D

10.计算机中,执行部件接控制部件的命令所作的不可再分的操作称为. A.微命令B.微操作C操作 三.判断改错题(每小题2分,共10分。正确,在括号内打√;错误,则打×并更正) 1.磁盘存储器是一种随机存取存储器。() 2.零地址指令就是没有操作数的指令。() 3.时序发生器是控制器的主要部件之一。() 4.设X=10110110,采奇校验时,其校验位C=1。() 5.中断处理过程中,保存现场必须在中断服务之后进行。() 四.简答题(每小题10分,共40分) 1.CPU由哪些主要部件组成?说明各部件的作用。 2.试述高速缓冲存储器的基本设计思想和特点。 3.主机与外部设备间为什么要设置接口? 4.为什么说取指令是公操作?在取指令阶段,CPU主要完成哪些操作? 五.计算题(共10 分) 1.设X=0.0101,Y=-0.1101,用双符号补码计算X+Y=?和X-Y=?并判断其结果是否溢出。(5分) 2. 设X=8C3E(H),Y=B6DF(H),Z=54D2(H)。求X∧Y⊕Z=? (5分) 七.设计题(10分) 某机字长16 位,主存按字编址,容量为8MW,请用如下RAM芯片为该机设计一个主存。 A A0 07 1.地址线和数据线各有多少根? 2.共用多少这种芯片? 3.画出其组成框图,并正确标出各信号线。

相关主题