实验一DDA画线算法

实验一DDA画线算法
实验一DDA画线算法

实验一 DDA 画线算法

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

初步了解Tc 下画图基本程序结构。

初步了解DDA 画线算法的思想和基本方法。

四、实验内容

DDA 画线算法画一段直线 1.算法思路

1.算法描述:设直线方程为:b mx

y +=,

对于直线,其数值微分是 )

()1()

()1(i x i x i y i y x y m -+-+=??=

,由上式得,y(i+1)=y(i)+m(x(i+1)-x(i)),于是知,使x(i)增1,即x(i+1)=x(i)+1时,y(i+1)=y(i)+m,为画线精确,应使相邻的画出点的坐标值相差最大值为1,这样可以得到画线段的数值微分分析器(Digital Differential Analyzer,简称DDA ),算法如下:

2.C 程序代码

#include #include #include

void DDALine(int x1,int y1,int x2,int y2,int color) { double dx,dy,e,x,y,i; dx=x2-x1; dy=y2-y1; e=(fabs(dx)>fabs(dy))?fabs(dx):fabs(dy); dx/=e; dy/=e; x=x1; y=y1; for(i=1;i<=e;i++) {putpixel((int)(x+0.5),(int)(y+0.5),color);

x+=dx; y+=dy; } }

void main()

{ int driver=DETECT; int gmode; int x1,y1,x2,y2,color; printf("please input x1,y1,y1,y2,color\n"); scanf("%d,%d,%d,%d,%d",&x1,&y1,&x2,&y2,&color); initgraph(&driver,&gmode,""); DDALine(x1,y1,x2,y2,color); getch(); closegraph(); }

实验二 Bresenham 画线算法

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

掌握中点画线算法的思想和基本方法

四、实验内容

用Bresenham 画线算法画直线,并完善算法功能,使之适应更广 1.算法思路

假定直线段的斜率0≤m≤ 1,且x2>x1,

122)1(2)1()1()1()1(2121-+

-+=--+-+=-+=-++=-=b y x m d d b x m y y y d y b x m y y d i i i i i i i i 若差为正,即21d d ≥,下一个象素应取)1,1(++i i y x ;若为负,即21d d <,下一个象素应取),1(i i

y x +。引入新的判别量pi

其中)12(2;;1

212-?+?=-=?-=?b x y c y y y x x x ,又因为11+=+i i x x ,所以有 )(2211i

i i i y y x y p p -?-?=-++ 0≥i p 应取11+i i y y =+,此时

)(21x y p p i

i ?-?+=+

pi<0,应取i i y y =+1,此时y p p i i ?

+=+21

2.C 程序代码

#include #include #include

void BresenhamLine(int x1,int y1,int x2,int y2,int color) { int x,y,dx,dy,p; x=x1; y=y1; dx=x2-x1; dy=y2-y1; p=2*dy-dx; for(x=1;x<=x2;x++) { putpixel(x,y,color); if(p>=0) {y++; p+=2*(dy-dx); } else {p+=2*dy; } } }

void main()

{int driver=DETECT; int gmode;

int x1,y1,x2,y2,color;

printf("please input x1,y1,x2,y2,color");

scanf("%d,%d,%d,%d,%d",&x1,&y1,&x2,&y2,&color); initgraph(&driver,&gmode,""); BresenhamLine(x1,y1,x2,y2,color); getch();

closegraph(); }

实验三 中点画圆算法

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

掌握中点画圆算法的基本思想

编写中点画圆的基本函数并尽量完善

四、实验内容

中点画圆算法画圆 1.算法描述:

构造函数2

22),(R y x y x F -+=

对于圆上的点,有F(x,y)=0;对于圆外的点,有F(x,y)>0;对于圆内的点,有F(x,y)<0。

设M 的坐标为:M(xi +1,yi-0.5),构造判别式:

2

22)5.0()1()5.0,1()(R y x y x F M F d i

i i i --++=-+==, 当d<0时,下一点取P 1; 当d>=0时,下一点取P 2。

当d<0时,下一点取P 1,再下一个点的判别式:

32 )5.0()2( )5.0,2(222++=--++=-+='i

i

i i

i x d R y x y x F d 当d>=0时,下一点取P 2,再下一个点的判别式:

5)(2 )5.1()2( )5.1,2(222+-+=--++=-+='i

i i

i i

i y x d R y x y x F d 判别式的初值:R R R R F d -=--+=-=2.1 )5.0(1)5.0,1(2

20

2. 源程序:

#include

#include #include

void MidpointCircle(int x0,int y0,int R) {

int x,y; double d; x=0; y=R;

d=1.25-R; while(x

{ d+=x+x+3; x++;} else

{d+=(x-y)+(x-y)+5; x++; y--;}

putpixel(x0+x,y0+y,RED); putpixel(x0+y,y0+x,RED); putpixel(x0+y,y0-x,RED); putpixel(x0+x,y0-y,RED); putpixel(x0-x,y0-y,RED); putpixel(x0-y,y0-x,RED); putpixel(x0-y,y0+x,RED); putpixel(x0-x,y0+y,RED); } }

main()

{int driver=DETECT,mode; initgraph(&driver,&mode,""); MidpointCircle(200,200,100); getch();

closegraph(); }

1.

实验四 Bresenham 画圆算法

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

掌握Bresenham 画圆算法的基本思想

编写Bresenham 算法画圆的基本函数并尽量完善

四、实验内容

Bresenham 画圆算法画圆,并改造函数,使之能画整圆。 1.算法思路

先求(0,R)

取11+

=+i i x x ,圆周上y 的变化小于1,若第i 步是),(i i y x ,那么第i+1步只能是H (Xi+1,Yi )和D(Xi+1,Yi+1)点中的一个,

H 和D 点离圆心距离的平方差

令判别量

D

H i d d p -= 当Pi<0时,下一点应选H 点,11-=+i i y y , 10)(41+-+=+i

i i i y x p p 。 当Pi>=0时,下一点应选D 点。

i i y y =+1,641++=+i

i i x p p 。 2.源程序:

#include #include #include

void BresenhamCirle(int R) {

int x,y,p; x=0; y=R; p=3-2*R;

for(;x<=y;x++)

{putpixel(x+200,y+100,3); putpixel(x+200,-y+100,3); putpixel(y+200,x+100,3);

putpixel(-y+200,x+100,3); putpixel(-x+200,y+100,3); putpixel(-x+200,-y+100,3); putpixel(-y+200,x+100,3); putpixel(-y+200,-x+100,3); if(p>=0) { p+=4*(x-y)+10; y--; } else {

p+=4*x+6; } } } void main()

{int driver=DETECT,gmode; initgraph(&driver,&gmode,""); BresenhamCirle(150); getch();

closegraph(); }

实验五 正方形旋转

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

掌握图形的旋转变换数学原理 掌握一般图形旋转的基本算法

四、实验内容

画一个正方形,并实现45度旋转,进一步可以使之动起来. 1算法思路

旋转变换:

)

()1cos sin sin cos (1000cos sin 0sin cos )1()1(θθ

θθθθθ

θ

θ

pR y x y x y x y x p =+-=?????

????

?-=''='

式中,θ是图形以坐标原点为旋转中心的旋转角度。

本程序实现相对于任意一点(x0,y0)作变换,可以先平移到原点,相对于原点作变换后,再平移回去。相对于任意一点(x0,y0)的旋转变换矩阵如下:

T(-x0,-y0)R(θ).T(x0,y0)

=

100cos sin0100

010sin cos0010

001001001

x y x y

θθ

θθ

??????

?????

--

?????

?????

--

??????1.=

cos sin0

sin cos0 0(1cos)0sin0(1cos)0sin1

x y y x

θθ

θθ

θθθθ?? ?--

? ?-+--

??2.C程序代码

#include

#include

void main()

{

int i,j,s,k;

float cx;

float

a[4][3]={{400,200,1},{300,200,1},{300,300,1},{400,300,1}}; float pingyi[3][3]={{1,0,0},{0,1,0},{-125,-125,1}};

float rpingyi[3][3]={{1,0,0},{0,1,0},{125,125,1}};

float zhuan[3][3]={{0,0,0},{0,0,0},{0,0,1}};

float axb[4][3];

float zaxb[4][3];

float rp[4][3];

int gdriver=DETECT,gmade;

initgraph(&gdriver,&gmade,"");

line(a[0][0],a[0][1],a[1][0],a[1][1]);

line(a[1][0],a[1][1],a[2][0],a[2][1]);

line(a[2][0],a[2][1],a[3][0],a[3][1]);

line(a[3][0],a[3][1],a[0][0],a[0][1]);

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

{

for(j=0;j<3;j++)

{

s=0;

for(k=0;k<3;k++)

{

s=s+a[i][k]*pingyi[k][j];

}

axb[i][j]=s;

}

}

line(axb[0][0],axb[0][1],axb[1][0],axb[1][1]); line(axb[1][0],axb[1][1],axb[2][0],axb[2][1]); line(axb[2][0],axb[2][1],axb[3][0],axb[3][1]); line(axb[3][0],axb[3][1],axb[0][0],axb[0][1]);

cx=(sqrt(2))/2.0;

zhuan[0][0]=cx;

zhuan[0][1]=cx;

zhuan[1][0]=-cx;

zhuan[1][1]=cx;

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

{

for(j=0;j<3;j++)

{

s=0;

for(k=0;k<3;k++)

{

s=s+axb[i][k]*zhuan[k][j];

}

zaxb[i][j]=s;

}

}

line(zaxb[0][0],zaxb[0][1],zaxb[1][0],zaxb[1][1]); line(zaxb[1][0],zaxb[1][1],zaxb[2][0],zaxb[2][1]); line(zaxb[2][0],zaxb[2][1],zaxb[3][0],zaxb[3][1]); line(zaxb[3][0],zaxb[3][1],zaxb[0][0],zaxb[0][1]); for(i=0;i<4;i++)

{

for(j=0;j<3;j++)

{

s=0;

for(k=0;k<3;k++)

{

s=s+zaxb[i][j]*rpingyi[k][j];

}

rp[i][j]=s;

}

}

line(rp[0][0],rp[0][1],rp[1][0],rp[1][1]);

line(rp[1][0],rp[1][1],rp[2][0],rp[2][1]);

line(rp[2][0],rp[2][1],rp[3][0],rp[3][1]);

line(rp[3][0],rp[3][1],rp[0][0],rp[0][1]);

getch();

closegraph();

}

实验六直线段裁剪算法

一、实验学时:4

二、实验类型:验证性实验

三、实验要求和目的

掌握直线段裁剪算法的一般思想方法.

四、实验内容

画几条线段,利用裁剪算法实现特定的裁剪,并验证算法的正确性

1算法思路

P52

第一步:编码。设直线段的两个端点为P1(x1,y1)和P2(x2,y2),根据编码规则,可以求出P1和P2所在的代码c1和c2;

第二步:判别。根据c1和c2的具体值,可以有三种情况:

1) c1=c2=0,这表明两端点全在窗口内,则整个直线也在窗口内,应该保留;

2) c1&&c2!=0,表明两端点必定同处于某一边界的同一外侧,则整个直线全在窗口外,应该舍弃;

如不属于上面两种请况,表明直线有一部分在窗口内,又可以分为以下三种情况:

(1) 一个端点在内,一个端点在外;

(2) 两个端点均在外,但直线段中部跨越窗口;

(3) 两端点都在外,且直线段也在外。

第三步: 求交。对不能确定取舍的直线段,求其与窗口边界及其延长线的交点,从而将直线段分割。求交点时,可以有针对性地与某一确定边界求交。在交点处把线段分为两段。把其中一段完全在窗口外,舍弃之。

第四步:对剩下的线段重复以上各步,可以验证,至多重复到第三遍的判断为止,这时剩下的直线段或者全在窗口内,或者全在窗口外,从而完成了对直线段的裁剪。

2.C程序代码

#include

#include

#define x1 150

#define xr 180

#define yt 180

#define yb 150

void Cohen_Sutherland(double x0,double y0,double x2,double y2) {

int c,c1,c2;

double x,y;

c1=makecode(x0,y0);

c2=makecode(x2,y2);

while(c1!==1)

{

if(c1&c2==1)

return;

c=c1;

if(c==0)

c=c2;

if(c&1==1)

{

y=y0+(y2-y0)*(x1-x0)/(x2-x0);

x=x1;

}

else

if(c&2)

{

y=y0+(y2-y0)*(x1-x0)/(x2-x0);

x=xr;

}

else

if(c&4)

{

y=y0+(y2-y0)*(x1-x0)/(x2-x0);

y=yb;

}

else

if(c&8)

{

y=y0+(y2-y0)*(x1-x0)/(x2-x0);

y=yt;

}

if(c==c1)

{

x0=x;

y0=y;

c1=makecode(x,y);

}

else

{

x2=x;

y2=y;

c2=makecode(x,y);

}

}

line(x0,y0,x2,y2);

}

int makecode(double x,double y) {

int c=0;

if(x

c=1;

else

if(x>x1)

c=1;

else

if(x>xr)

c=2;

if(y

c=c+4;

else

if(y>yt)

{

c=c+8;

}

return c;

}

void main()

{

int driver=DETCET;

int mode;

initgraph(&driver,&mode,""); Cohen_Sutherland(75,75,200,200); getch();

closegraph();

}

实验七 两条线段求交算法

一、实验学时:2 二、实验类型:验证性实验 三、实验要求和目的

掌握线段求交的一般思想方法. 实现线段求交算法

四、实验内容

求两条线段的交点,并是函数适应性更广 1.算法思路

1)计算行列式:))(())((a

b d

c

d c a b y y x x y y x x -----←? 若行列式=0,则两线段重合或平行,无交点,算法结束; 2)计算交点参数:

?-----←/)))(())(((a

c d c d c a c y y x x y y x x λ

若10><λ

λ或,则无交点,算法结束

3)计算交点

)(),(a

b a a b a y y y y x x x x -+←-+←λ

λ

2.C 程序代码

2.源程序:

#include #include void main() {

int xa,ya,xb,yb,xc,yc,xd,yd,x,y,color; double t1,t2,deater; int driver=DETECT; int gmode;

initgraph(&driver,&gmode,""); scanf("%d",&xa); scanf("%d",&ya); scanf("%d",&xb); scanf("%d",&yb); scanf("%d",&xc); scanf("%d",&yc); scanf("%d",&xd); scanf("%d",&yd);

line(xa,ya,xb,yb); line(xc,yc,xd,yd);

deater=-(xb-xa)*(yd-yc)+(xd-xc)*(yb-ya); if(deater==0) {

printf("zhi xian ping xing"); }else {

t1=((xc-xa)*(yc-yd)-(xc-xd)*(yc-ya))/deater; t2=((xb-xa)*(yc-ya)-(xc-xa)*(yb-ya))/deater; if(0

x=xa+t1*(xb-xa); y=ya+t1*(yb-ya); putpixel(x,y,4);

printf("%d,%d",x,y); }else {

printf("liang xian bu hui xiang jiao"); } }

getch();

closegraph(); }

实验八 点对简单多边形的包含

一、实验学时:2

二、实验类型:验证性实验 三、实验要求和目的

掌握包含判断一般思想方法.

实现点对简单多边形(五边形,自己定义顶点坐标)

四、实验内容

编程实现点对五边形的包含检查算法。 1.算法思路

首先通过给出点的坐标画出五边形,然后: 1)[准备] n

x =0x ,n y =0y ,m=-1;i=0;

2)[排除必不相交的情形]若下列条件有一个成立,则到4。

①p i x x <并且1p i x x <+; ○

2 p i x x ≥并且;1p i x x ≥+ ○

3 p i y y <并且1p i y y <+; 3)[计算交点]11()()/()i p i i i i i y y x x y y x x ++=+---,分两种情况: ○

1若y=p y ,则点P 在多边形的边界上,算法结束; ○

2若y

最后,从要判断的点,向下画直线,便于观察点在多边形内部,外部还是在边界上,并且同时输出英文句子,若再边界上则输出point p is on the edge of graph 若再内部则输出point p is on the edge of graph ,否则输出Point p is in the graph 。

1.C 程序代码

main() {

int xx[10],yy[10],m,i,x0,y0,n,y; n=4; x0=600; y0=400;

printf("please put the points\n"); for(i=0;i

scanf("%d %d",&xx[i],&yy[i]); } m=-1;

for(i=0;i

if(x0>xx[i]&&x0>=xx[i+1]||x0=yy[i]&&y0>=yy[i+1]) {

y=yy[i]+(x0-xx[i])*(yy[i+1]-yy[i])/(xx[i+1]-xx[i]); if(y==y0)

printf("it is in the bound\n"); else {

if(y

}

if(m==-1)

{

printf("p is out of the duo bian xing \n");

}

if(m==1)

{

printf("p is in the duo bian xing \n");

}

getch();

}

实验九 Bezier曲线

一、实验学时:4

二、实验类型:验证性实验

三、实验要求和目的

掌握Bezier曲线的一般性质

实现Bezier曲线的描绘

四、实验内容

实现Bezier曲线的画线算法

1.算法描述:首先给定四个初始点,由公式可以得到计算n次Bezier曲线上控制点在

t时的值P(t),可以归结为两个n-1次Bezier曲线在t时的线性组合。t每增加一个步长,由递推计算关系可以得到一个对应的P(t)值,依次画出点(t,P(t)),则可以得到曲线

2.源程序:

#include

#include

void bezier(int degree, int npoints,double coeff1[],double coeff2[])

{

double t,delt;

int i;

delt=1.0/(double)npoints;

t=0.0;

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

{

decas(degree,coeff1,coeff2,t);

t+=delt;

}

}

decas(int degree,double coeff1[],double coeff2[],double t)

{

int r,i;

double *coeffa,coeffa10,coeffa20;

double coeffa1[5],coeffa2[5];

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

coeffa1[i]=coeff1[i];

coeffa2[i]=coeff2[i];

for(r=1;r<=degree;r++)

{

for(i=0;i<=degree-r;r++)

{coeffa1[i]=coeffa1[i]+t*(coeffa1[i+1]-coeffa1[i]);

coeffa2[i]=coeffa2[i]+t*(coeffa2[i+1]-coeffa2[i]);}

}

coeffa10=coeffa1[0];coeffa20=coeffa2[0];

/*transform(coeffa10,coeffa20,BLUE); */

}

main()

{int degree,i,npoints;

double coeff1[4]={10,50,100,120},coeff2[4]={10,100,100,10};

int driver=DETECT,mode;

initgraph(&driver,&mode,"");

degree=3;npoints=10000;

bezier(degree,npoints,coeff1,coeff2);

line(10+200,340-10,200+50,340-100);

line(50+200,340-100,200+100,340-100);

line(100+200,340-100,200+120,340-10);

getch();

closegraph();

}

实验十分形Julia集合算法

一、实验学时:2

二、实验类型:验证性实验

三、实验要求和目的

掌握Julia等分形集合的基本性质

实现Julia集合的绘制

四、实验内容

写函数实现Julia集合的功能,并修改参数观察不同参数下Julia集合的图形差别

1.算法描述:选定复平面区域(xmin,ymin)—>(xmax,ymax),为其赋值,给定一个阀值

M=100,且给定p,q,K的初值。dx=(xmax-xmin)/(a-1),dy=(ymax-ymin)/(b-1).

为x0,y0赋初值,x0=xmin+dx*nx ,y0=ymin+dy*ny,依次遍历(nx,ny),k<—0;

x[k+1]=x[k]*x[k]-y[k]*y[k]+p;

y[k+1]=2*x[k]*y[k]+q;

r=x[k+1]*x[k+1]+y[k+1]*y[k+1];

若r>M,选择颜色k;

k=K,选择颜色0,返回1;

若r<=M,且k

对点(nx,ny)着色k,对下一点返回1。

2.源程序:

#include "stdio.h"

#include "graphics.h"

main()

{

int driver=DETECT ,mode;

int x0=-1.5,y0=-1.5,x1=1.5,y1=1.5,

M=100 ,k,K=500,i,j,a,b;

float xx,yy,dx,dy,xx0,yy0,r,p=0.5,q=0.5,x11,y11;

initgraph(&driver,&mode,"");

a=getmaxx();b=getmaxy();

dx=(float)(x1-x0)/(a-1);dy=(float)(y1-y0)/(b-1);

for(i=0;i

for(j=0;j

{

xx0=x0+i*dx;

yy0=y0+j*dy;

k=0;

for(;k

{

x11=xx0;y11=yy0;

xx=x11*x11-y11*y11+p;

yy=2*x11*y11+q;

xx0=xx;yy0=yy;

r=xx0*xx0+yy0*yy0;

if(r>M)

{

putpixel(i,j,k); break;

}

if(k==K-1)

{k=0;

putpixel(i,j,k); break;

}

}

}

getch();

closegraph();

}

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

算法设计与分析实验报告 贪心算法 班级: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

算法设计实验3

实验三:动态规划法 【实验目的】 应用动态规划算法思想求解矩阵连乘的顺序问题。 【实验要求】 应用动态规划算法的最优子结构性质和子问题重叠性质求解此问题。分析动态规划算法的基本思想,应用动态规划策略写出算法及相应的程序,求解此题。要读懂读透A[i,j], A[1,n]=A[1,k] ×A[k+1,n],m[i][j],s[i][j]各式所表达的含义并正确加以应用。m[i][j]的递归定义: 0 (i=j ) m[i][j]= min{m[i][k]+m[k+1][j]+n i-1n k n j (i #include class MatrixChain { public: MatrixChain(int mSize); //创建二维数组m和s,一维数组p,并初始化

算法分析与设计实验指导书

《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。 上机实验一般应包括以下几个步骤: (1)、准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机。(2)、上机输入和调试自己所编的程序。一人一组,独立上机调试,上机时出现的问题,最好独立解决。 (3)、上机结束后,整理出实验报告。 实验报告应包括: 1)问题分析 2)算法描述 3)运行结果、 4)算法性能分析。 实验一 实验名称:贪心算法应用及设计 实验学时:6学时 实验类型:验证 实验目的: 1.理解贪心算法的基本思想 2.掌握利用贪心算法求解问题的求解步骤 实验容 1.活动选择问题(2学时) 问题描述: 设有11个会议等待安排,用贪心法找出满足目标要求的会议集合,这些会议按结束时间的非减序排列如下表。 实验实现提示: 1)数据结构设计: 将会议开始时间存储在数组B中,结束时间存储在数组E中,数组下标为会议的代码。结果存储在数组A中,其元素A[i]==true,表示会议i被选中。 2)算法: void GreedySelect(int n, struct time B[], struct time E[], bool A[]) { int i,j;

A[1]=true; j=1; i=2; while( i<=n) if (B[i]>=E[j]) { A[i]=true; j=i;} else A[i]=false; } 思考题:证明所得的解是最优解? 2.单源点最短路径问题。(2学时) 问题描述 如图所示的有向带权图中,求源点0到其余顶点的最短路径及最短路径长度。并对算法进行性能分析。 实现提示 1)数据结构设计: 将图存储在邻接矩阵C中,结点个数为n,源点编号为u, 源点u到其余顶点的最短路径长度存储在dist[],最短路径存储在p[]。 2) 算法 void Dijkstra(int C[n][n], int n,int u,float dist[],int p[]) { bool s[n]; for( int i=1; i<=n; i++) { dist[i]=C[u][i]; s[i]=false; if (dist[i]=∞) p[i]=-1; else p[i]=u; } p[u]=-1; s[u]=true; for( i=1; i<=n; i++) { int temp= ∞; int t=u; for( int j=1;j<=n;j++)

算法实验报告

实验一分治与递归算法的应用 一、实验目的 1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。 2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。 3.学会利用分治算法解决实际问题。 二 . 实验内容 金块问题 老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。 三.问题分析: 一般思路:假设袋中有n 个金块。可以用函数M a x(程序 1 - 3 1)通过n-1次比较找到最重的金块。找到最重的金块后, 可以从余下的n-1个金块中用类似法通过n-2次比较找出最轻的金块。这样,比较的总次数为2n-3。

分治法:当n很小时,比如说,n≤2,识别出最重和最轻的金块,一次比较就足够了。当n 较大时(n>2),第一步,把这袋金块平分成两个小袋A和B。第二步,分别找出在A和B中最重和最轻的金块。设A中最重和最轻的金块分别为HA 与LA,以此类推,B中最重和最轻的金块分别为HB 和LB。第三步,通过比较HA 和HB,可以找到所有金块中最重的;通过比较LA 和LB,可以找到所有金块中最轻的。在第二步中,若n>2,则递归地应用分而治之方法 程序设计 据上述步骤,可以得出程序1 4 - 1的非递归代码。该程序用于寻找到数组w [ 0 : n - 1 ]中的最小数和最大数,若n < 1,则程序返回f a l s e,否则返回t r u e。 当n≥1时,程序1 4 - 1给M i n和M a x置初值以使w [ M i n ]是最小的重量,w [ M a x ]为最大的重量。 首先处理n≤1的情况。若n>1且为奇数,第一个重量w [ 0 ]将成为最小值和最大值的候选值,因此将有偶,数个重量值w [ 1 : n - 1 ]参与f o r循环。当n 是偶数时,首先将两个重量值放在for 循环外进行比较,较小和较大的重量值分别置为Min和Max,因此也有偶数个重量值w[2:n-1]参与for循环。 在for 循环中,外层if 通过比较确定( w [ i ] , w [ i + 1 ] )中的较大和较小者。此工作与前面提到的分而治之算法步骤中的2) 相对应,而内层的i f负责找出较小重量值和较大重量值中的最小值和最大值,

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

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

一、实验目的 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. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程; 2. 掌握简单问题的算法设计与分析,能设计比较高效的算法; 3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力; 二.实验内容 (一)相等元素问题 1.问题描述先排序函数,再查找函数。 #define size 100 Typedef strat { Int Array[size] Int listlength }List List a; Main() { 1、输入 2、排序 3、查找 4、输出 } 元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少? 2. 测试数据 输入: 9 71 25 64 38 52 5 31 19 45 26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33 15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91 输出:No Yes No 3. 设计与实现的提示 算法最坏情况和平均情况的时间复杂性是衡量算法优劣的重要指标,算法设计要求尽可能设计比较高效的算法。 (二) 整数集合分解(选做) 1.问题描述

设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。 2. 测试数据 输入: 68 25 34 16 2 37 3 95 76 57 21 13 4 78 29 6 17 39 51 20 43 12 28 3 48 59 14 32 47 51 42 61 9 24 52 78 65 2 37 78 51 73 29 7 26 95 37 2 输出: 2 3 4 6 12 13 16 17 20 21 25 29 34 37 39 43 51 57 68 76 78 95 2 2 3 7 9 1 4 24 26 28 29 32 37 37 42 47 48 51 51 52 59 61 62 65 73 78 95 3. 设计与实现的提示 本题可以有多种方法。算法时间复杂性是选取算法的重要依据。输出的两个新整数集合要求按照从小到大排序后输出。该排序步骤对算法时间复杂性的影响在此不计。

实验二 银行家算法

实验四银行家算法 一、实验目的 1.理解死锁避免相关内容; 2.掌握银行家算法主要流程; 3.掌握安全性检查流程。 操作系统中的死锁避免部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 二、实验设备 PC机、windows 操作系统、VC++6.0 三、实验要求 本实验要求3学时完成。 1.设计多个资源(≥3); 2.设计多个进程(≥3); 3.设计银行家算法相关的数据结构; 4.动态进行资源申请、分配、安全性检测并给出分配结果。 5.撰写实验报告,并在实验报告中画出银行家算法和和安全性检查算法流程图。 四、预备知识 死锁避免定义:在系统运行过程中,对进程发出的每一个资源申请进行动态检查,并根据检查结果决定是否分配资源:若分配后系统可能发生死锁,则不予分配,否则予以分配。 由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。 1 系统安全状态 1)安全状态 所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{ P1 ,P2 …Pn}就是安全序列。如果存在

这样一个安全序列,则系统是安全的。 并非所有的不安全状态都会转为死锁状态,但当系统进入不安全状态后,便有可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。所以避免死锁的实质:系统在进行资源分配时,如何使系统不进入不安全状态。 2)安全状态之例 假设系统有三个进程,共有12台磁带机。各进程的最大需求和T0时刻已分配情况如下表: 答:T0时刻是安全的,因为存在安全序列:P2 →P1→ P3 不安全序列:P1→… P3→… P2→P3→P1 3)由安全状态向不安全状态的转换 如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。例如,在T0时刻以后,P3又请求1台磁带机,若此时系统把剩余3台中的1台分配给P3,则系统便进入不安全状态。因为,此时也无法再找到一个安全序列,例如,把其余的2台分配给P2,这样,在P2完成后只能释放出4台,既不能满足P1尚需5台的要求,也不能满足P3尚需6台的要求,致使它们都无法推进到完成,彼此都在等待对方释放资源,即陷入僵局,结果导致死锁。 2 利用银行家算法避免死锁 1)银行家算法中的数据结构 ①可利用资源向量Available。 这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网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、递推关系:

算法分析与设计实验报告

算法设计与分析 学院:计算机科学与技术 学号:129074106 姓名:张淼淼 2014 11 14

1、 当问题规模100 N 时,快速排序和插入排序各需多少时间?写清机器配置,列出五种 快速排序所需时间(ms) 插入排序所需时间(ms ) 两者相差多少 N=100 0.00600 0.019000 -0.013000 N=1000 0.074000 0.724000 -0.650000 N=10000 0.032000 64.657000 -64.625000 N=100000 13.300000 50.900000 -37.600000 N=1000000 53.500000 117.700000 -64.200000 Window 7 32位 Cpu :Inter(R) Core(TM) i3-2120 cpu@3.30GHz AMD Radeon HD 6450 Graphics

程序: #include #include #include #include int a[1000000];

int b[1000000]; void QuickSort(int low ,int high) { long i,j; int x; i=low; j=high; x=a[i]; while(i=x&&i(j+1)) QuickSort(j+1,high); } void BinaryInsertSort(int length) { int low,high,mid; int i,j,m;//m为保存待插入的元素 for(i=1;i=b[mid]) low=mid+1; else high=mid-1; } for(j=i-1;j>=high+1;j--)//high为插入位置 b[j+1]=b[j];//后移元素,留出插入的空位b[high+1]=m;//将元素插入正确的位置 }

银行家算法设计实验报告

银行家算法设计实验报告

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

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

算法设计实验报告一(简单算法设计)

实验报告一 课程C++ 实验名称简单算法设计第 1 页专业_数学与应用数学_ __ 班级__ 双师一班学号105012011056 姓名陈萌 实验日期:2013 年 3 月9 日报告退发(订正、重做) 一、实验目的 1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程; 2. 掌握简单问题的算法设计与分析,能设计比较高效的算法; 3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力。 二、实验内容 (一)相等元素问题 1.问题描述 元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少? 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1767题 输入:输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出一行,若该组测试例中存在两个相等的元素则输出”Yes”,否则,输出”No”。每个测试例的输出数据用一行表示。 3. 测试数据 输入:3 10 9 71 25 64 38 52 5 31 19 45 16 26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33 20 15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91 输出:No Yes No (二) 整数集合分解 1.问题描述 设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1768题 输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n为偶数,且n<=500),表示原整数集合的长度,第二行给出这n个整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出两行,分别表示新生成的整数集合。其中,第一行是元素和比较小的整数集合,第二行是元素和比较大的整数集合,整数之间用一个空格隔开。两个测

《算法分析与设计》实验指导书

《计算机算法设计与分析》实验指导书(第一版)

前言 计算机算法分析与设计是面向设计的,它是计算机科学的核心。无论是计算机系统、系统软件和解决计算机的各种应用问题都可归结为算法的设计。通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的算法描述:分治法、贪心法、动态规划、回溯法、分枝限界等算法,并掌握算法分析的方法,从而把学生的分析问题和解决问题能力提高到理论的高度。 前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。 开发环境不限,本书采用C/C++语言的集成开发环境等。 实验完成后书写实验报告,包含实验问题、基本思想、关键算法流程图、测试数据及运行结果(截图)、调试心得和源程序。 总实验学时为16学时。

目录 预备实验验证算法的方法 (4) 实验目的: (4) 实验课时: (4) 实验原理: (4) 实验题目: (6) 基本题: (6) 提高题: (6) 实验一递归与分治 (7) 实验目的: (7) 实验课时: (7) 实验原理: (7) 实验题目: (7) 基本题: (7) 提高题: (8) 思考问题: (8) 实验二动态规划算法 (9) 实验目的: (9) 实验课时: (9) 实验原理: (9) 实验题目: (9) 基本题: (9) 提高题: (10) 思考问题: (10) 实验三贪心选择算法 (11) 实验目的: (11) 实验课时: (11) 实验原理: (11) 实验题目: (11) 基本题: (11) 提高题: (12) 思考问题: (12) 实验四回溯算法 (13) 实验目的: (13) 实验课时: (13) 实验原理: (13) 实验题目: (14) 基本题: (14) 提高题: (14) 思考问题: (14)

实验二(贪心算法)

华东师范大学计算机科学技术系上机实践报告 课程名称:算法设计与分析年级:05上机实践成绩: 指导教师:柳银萍姓名:张翡翡 上机实践名称:贪心算法学号:10052130119上机实践日期:2007-4-10 上机实践编号:NO.2组号:上机实践时间:10:00-11:30 一、目的 了解熟悉掌握贪心算法实质并学会灵活运用,从而解决生活中一些实际问题。 二、内容与设计思想 1.超市的自动柜员机(POS)要找给顾客各种数值的现金,表面上看,这是一个很简单的任务,但交给机器办就不简单了。你作为一个计算机专家,要求写一个程序来对付这个“简单”的问题。 你的自动柜员机有以下的币种:100元,50元,20元,10元,5元,2元,1元。你可以假设每种钱币的数量是无限的。现在有一笔交易,需要找个客户m元,请你设计一个算法,使得找给顾客的钱币张数最少。 要求: 输入:第一行仅有一个整数n(0

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

实验报告 (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]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

算法分析与设计实验指导书

《算法分析与设计》实验指导书 《算法分析与设计》课程是计算机专业的一门必修课程。开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。 《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。 《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到: (1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出 现的情况提前作出思考和分析。 (2)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分 析。 (3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。 (4)实验课程不迟到。如有事不能出席,所缺实验一般不补。 《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交电子的实验报告。

实验一算法实现一 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对分治法、贪心算法的理解。 二、实验内容: 掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。 三、实验题 1. 【伪造硬币问题】给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的 任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。试用分治法的思想写出解决问题的算法,并计算其时间复杂度。 2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。售 货员希望用数目最少的硬币找给小孩。假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。给出一种找零钱的贪心算法。 a)实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 整理出实验报告。 四、实验程序 五、实验结果 六、实验分析

算法实验报告二

算法设计与分析实验 学院:信息工程 专业:计算机科学与技术

算法实验报告二排序问题求解 一、实验目的: 1)以排序(分类)问题为例,掌握分治法的基本设计策略。 2)熟练掌握一般插入排序算法的实现; 3)熟练掌握快速排序算法的实现; 4) 理解常见的算法经验分析方法; 二、实验要求: 1.生成实验数据. 要求:编写一个函数datagenetare,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。这些数作为后面算法的实验数据。 2.实现直接插入排序算法. 3.实现快速排序算法. 三、实验主要步骤: #include #include #include #include #define RAND_MAX 10000 #define Max 1000 int I_Change_count = 0; //插入排序比较计数器 int I_Move_count = 0; //插入排序移动计数器 int S_Change_count =0; //选择排序比较计数器 int S_Move_count = 0; //选择排序移动计数器 int Q_Change_count = 0; //快速排序比较计数器 int Q_Move_count = 0; //快速排序移动计数器 void main() { long num; long Array[Max],Brray[Max],Crray[Max];//分别用来保存随机数作为两个排序的对象int A_Length; int Low = 0; int High; time_t t; void InsertSort(long Array[],int A_Length); //void SelectSort(long Brray[],int A_Length); void QuickSort(long Crray[],int Low,int High);

算法与设计实验报告

算法与分析实验报告软件工程专业 安徽工业大学 指导老师:许精明

实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 一:实验目的 1:掌握动态规划算法的基本思想,学会用其解决实际问题。 2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。 二:实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 实验一:杨辉三角

问题分析: ①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 ②第n行数之和为2^n。 ③下一行每个数字等于上一行的左右两个数字之和。 算法设计及相关源代码: public void yanghui(int n) { int[] a = new int[n]; if(n==1){ System.out.println(1); }else if(n==2) { System.out.print(1 + " " +1); }else{ a[1]=1; System.out.println(a[1]); a[2]=1;

System.out.println(a[1]+" "+a[2]); for(int i=3;i<=n;i++){ a[1]=a[i]=1; for(int j=i-1;j>1;j--){ a[j]=a[j]+a[j-1]; } for(int j=1;j<=i;j++){ System.out.print(a[j]+" "); } System.out.println(); } } } 实验结果:n=10 实验二:0-1背包问题 问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就 j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j

算法设计与分析实验报告

算法设计与分析实验报告 教师: 学号: 姓名:

实验一:串匹配问题 实验目的:(1) 深刻理解并掌握蛮力法的设计思想; (2) 提高应用蛮力法设计算法的技能; (3) 理解这样一个观点: 用蛮力法设计的算法, 一般来说, 经过适度的努力后, 都可以对算法的第一个版本进行一定程度的改良, 改进其时间性能。 三、实验要求:( 1) 实现BF 算法; (2 ) 实现BF 算法的改进算法: KMP 算法和BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析, 并设计实验程序验证 分析结果。 #include "stdio.h" #include "conio.h" #include //BF算法 int BF(char s[],char t[]) { int i; int a; int b; int m,n; m=strlen(s); //主串长度 n=strlen(t); //子串长度 printf("\n*****BF*****算法\n"); for(i=0;i

实验二 FFT算法的MATLAB实现

班级:学号:姓名 实验二FFT算法的MATLAB实现 (一)实验目的: (1)掌握用matlab进行FFT在数字信号处理中的高效率应用。 (2)学习用FFT对连续信号和时域离散信号进行谱分析。 (二)实验内容及运行结果: 题1:若x(n)=cos(nπ/6)是一个N=12的有限序列,利用MATLAB计算它的DFT 并进行IDFT变换同时将原图与IDFT变换后的图形进行对比。当求解IFFT变换中,采样点数少于12时,会产生什么问题。 程序代码: N=12; n=0:11; Xn=cos(n*pi/6); k=0:11; nk=n'*k; WN=exp(-j*2*pi/N) WNnk=WN.^nk XK=Xn*WNnk; figure(1) stem(Xn) figure(2) stem(abs(XK)) 运行结果:

IFFT变换中,当采样点数少于12时图像如下图显示:

分析:由图像可以看出,当采样点数小于12时,x(n)的频谱不变,周期为6,而XK 的频谱图发生改变。 题2:对以下序列进行谱分析 132()()103()8470x n R n n n x n n n =+≤≤?? =-≤≤??? 其他n 选择FFT 的变换区间N 为8和16点两种情况进行频谱分析,分别打印其幅频特 性曲线并进行对比、分析和讨论。 ㈠ 程序代码: x=ones(1,3);nx=0:2; x1k8=fft(x,8); F=(0:length(x1k8)-1)'*2/length(x1k8); %进行对应的频率转换 stem(f,abs(x1k8));%8点FFT title('8点FFTx_1(n)'); xlabel('w/pi'); ylabel('幅度'); N=8时:

相关文档
最新文档