算法上机实验报告

算法上机实验报告
算法上机实验报告

课程实验报告课程名称:算法设计与分析

专业班级:信息安全1303

学号:U201315182

姓名:刘立鹏

指导教师:王多强

报告日期:2015-6-16

计算机科学与技术学院

目录

目录 (2)

实验一最近点对问题 (1)

1.1实验内容与要求 (1)

1.2算法设计 (1)

1.3 实验结果与分析 (2)

1.4编程技术与方法 (3)

1.5 源程序及注释 (3)

实验二大整数乘法 (8)

2.1实验内容与要求 (8)

2.2算法设计 (9)

2.3 实验结果与分析 (12)

2.4编程技术与方法 (12)

2.5 源程序及注释 (12)

实验三单源点 (14)

3.1实验内容与要求 (14)

3.2算法设计 (14)

3.3 实验结果与分析 (14)

3.4编程技术与方法 (16)

3.5 源程序及注释 (16)

实验四最优二分检索树 (19)

4.1实验内容与要求 (19)

4.2算法设计 (19)

4.3实验结果与分析 (20)

4.4源程序及注释 (22)

五、实验心得与体会 (25)

六、参考书目 (27)

实验一 最近点对问题

1.1 实验内容与要求

已知平面上分布着点集P 中的n 个点p 1,p 2,...p n ,点i 的坐标记为(x i ,y i ),1≤i≤n 。两点之间的距离取其欧式距离,记为22

)()(),(j i j i j i y y x x p p d -+-=

问题:找出一对距离最近的点。

注:允许两个点位于同一个位置,此时两点之间的距离为0 要求:用分治法实现最近点对的问题。

1.2 算法设计

(1)首先将所有的点按照x 坐标排序。排序过程需要O(nlogn)的时间,不会从整体上增加时间复杂度的数量级。

(2)划分:由于点已经按x 坐标排序,所以空间上可以“想象” 画一条垂线,作为分割线,将平面上的点集分成左、右两半P L 和P R 。

如下图所示:

d L

d C

d

R

分割线

P L P R

记, d L:P L中的最近点对距离;

d R:P R中的最近点对距离;

d C:跨越分割线的最近点对距离。

则,最近的一对点或者在P L中,或者在P R中,或者一个在P L中而另一个在P R中(跨越分割线)。

设点按它们的y坐标排序,如果p i和某个p j的y坐标相差大于δ,那么这样的p i可以终止计算,继续处理p i+1。算法描述如下:

for i=1 to numPointsInStrip do

for j=i+1 to numPointsInStrip do

if p i and p j's y-coordinates differ by more than δ

break;

else if dist(p i,p j)<δ

δ = dist(p i,p j);

1.3 实验结果与分析

实验数据:(1)点对数目:6

(2)点对坐标:(1,3)(2,5)(3,12)(5,8)(6,9)(7,15)

运行结果:

如图显示的是最近点对<5.00,8.00><6.00,9.00>的距离为1.41

1.4编程技术与方法

纵观整个过程,首先要对X坐标排序时间为O(NlogN),这是分治之前的预处理。然后问题分成了N/2规模,然后用Q(N)的复杂度得到中间的最近点对,然后可以在常数时间内得到最终的点对与最近值。So。。。T(N)=2T(N/2)+O(N),可以得到该算法的时间为O(NlogN),在用分治法之前首先对Y坐标进行冒泡排序,将左右|d|范围里的点按Y值排序,然后依次从每个点出发做水平线,并在其之上d的距离做水平线,这样得到了一个2d*d 的矩形,显然,在此矩形之外的点无需开率啦,可以证明,矩形内最多容下8个点(包括自己本身)。所以意味着在排好序的Y坐标点中,只需要考虑其后的7个点就行了,此外已有人证明了事实上只需要考虑其后的4个点就行啦。可见,这些的时间复杂度最多Q (N)。

1.5 源程序及注释

#include

#include

#include

#define MAXLEN 200

int init(float *x,float *y,int *ind)

{

int n,i;

while(1==scanf("%d",&n))

{

if(n > 1) break;

printf("n invalid!\n");

}

for(i=0;i

{

scanf("%f%f",x+i,y+i);

ind[i]=i;

}

return n;

}

void pre_sort(float *x,float *y,int *ind,int n)

{//must finish in O(nlogn) but here using normorl sort method //bubble sort

int i,j;

int tmp;

float tmp_y,tmp_x;

for(i=0;i

for(j=n-1;j > i;j--)

if(x[j-1] > x[j])

{

//swap x

tmp_x=x[j-1];

x[j-1]=x[j];

x[j]=tmp_x;

//swap y

tmp_y=y[j-1];

y[j-1]=y[j];

y[j]=tmp_y;

//swap ind no need now!

/*tmp=ind[j-1];

ind[j-1]=ind[j];

ind[j]=tmp;*/

}

for(i=0;i

for(j=n-1;j > i;j--)

if(y[j-1] > y[j])

{

//swap y

tmp_y=y[j-1];

y[j-1]=y[j];

y[j]=tmp_y;

//swap ind

tmp=ind[j-1];

ind[j-1]=ind[j];

ind[j]=tmp;

}

}

float get_pair_len(float x1,float y1,float x2,float y2)

{

return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

}

void find_closest_pair(int st,int ed,float *x,float *y,int *ind,float *closest,float *x1,float *y1,float *x2,float *y2)

{//key code

if(ed-st == 1){//only 2 point

*closest=get_pair_len(x[ind[0]],y[0],x[ind[1]],y[1]);

*x1=x[ind[0]];

*y1=y[0];

*x2=x[ind[1]];

*y2=y[1];

}

else if(ed-st ==2)

{//only 3 point

float len;

*closest=get_pair_len(x[ind[0]],y[0],x[ind[1]],y[1]);

*x1=x[ind[0]];

*y1=y[0];

*x2=x[ind[1]];

*y2=y[1];

len=get_pair_len(x[ind[0]],y[0],x[ind[2]],y[2]);

if(len < *closest){

*closest=len;

*x1=x[ind[0]];

*y1=y[0];

*x2=x[ind[2]];

*y2=y[2];

}

len=get_pair_len(x[ind[1]],y[1],x[ind[2]],y[2]);

if(len < *closest){

*closest=len;

*x1=x[ind[1]];

*y1=y[1];

*x2=x[ind[2]];

*y2=y[2];

}

}else{//at least 4 points

int i,cl,cr,ct;

int mid;

float t_c1,t_c2;

float t_c1_x1,t_c1_y1,t_c1_x2,t_c1_y2;

float t_c2_x1,t_c2_y1,t_c2_x2,t_c2_y2;

float *yl,*yr,*yct;

int *indl,*indr,*indct;

mid=(st+ed)/2;

yl=(float*)malloc((mid-st+1)*sizeof(float));

indl=(int*)malloc((mid-st+1)*sizeof(int));

yr=(float*)malloc((ed-mid)*sizeof(float));

indr=(int*)malloc((ed-mid)*sizeof(int));

if(!yl || !yr || !indl || !indr) exit(-2);//non enough mm

for(i=0,cl=0,cr=0;i<=ed-st;i++)

{//store new order y&ind

if(ind[i] <= mid){

yl[cl]=y[i];

indl[cl]=ind[i];

cl++;

}

else{

yr[cr]=y[i];

indr[cr]=ind[i];

cr++;

}

}

//divided

find_closest_pair(st,mid,x,yl,indl,&t_c1,&t_c1_x1,&t_c1_y1,&t_c1_x2,&t_c1_y2);

find_closest_pair(mid+1,ed,x,yr,indr,&t_c2,&t_c2_x1,&t_c2_y1,&t_c2_x2,&t_c2_y2);

if(t_c1 < t_c2){

*closest=t_c1;

*x1=t_c1_x1;

*y1=t_c1_y1;

*x2=t_c1_x2;

*y2=t_c1_y2;

}

else{

*closest=t_c2;

*x1=t_c2_x1;

*y1=t_c2_y1;

*x2=t_c2_x2;

*y2=t_c2_y2;

}//get the closest pair between the two part(L&R)

int v,ve;

float closest_tmp;

float part_line=(x[mid]+x[mid+1])/2.0;

yct=(float*)malloc((ed-st+1)*sizeof(float));

indct=(int*)malloc((ed-st+1)*sizeof(int));

//get all the y in the rect

for(i=0,ct=0;i<=ed-st;i++)

if(x[ind[i]]>part_line-*closest && x[ind[i]]

yct[ct]=y[i];

indct[ct]=ind[i];

ct++;

}

//check followed the 4 points

if(ct > 1){

for(i=0;i< ct-1;i++){

ve=(i+4 < ct-1 ? i+4:ct-1);

v=i+1;

while(v<=ve && yct[v]-yct[i] <=*closest){

closest_tmp=get_pair_len(x[indct[i]],yct[i],x[indct[v]],yct[v]);

if(closest_tmp < *closest){

*closest=closest_tmp;

*x1=x[indct[i]];

*y1=yct[i];

*x2=x[indct[v]];

*y2=yct[v];

}

v++;

}

}

}

free(yl);

free(yr);

free(indl);

free(indr);

free(yct);

free(indct);

}

}

int main()

{

float X[MAXLEN],Y[MAXLEN];

int IND[MAXLEN],n;

n=init(X,Y,IND);

float closest,x1,y1,x2,y2;

pre_sort(X,Y,IND,n);

find_closest_pair(0,n-1,X,Y,IND,&closest,&x1,&y1,&x2,&y2);

printf("the closest value is:%-4.2f (%-4.2f,%-4.2f) (%-4.2f,%-4.2f)\n",closest,x1,y1,x2,y2);

return 0;

}

实验二大整数乘法

2.1实验内容与要求

利用分治法设计一个计算两个n位的大整数相乘的算法,要求计算时间低于O(n2)。

大整数(big integer):位数很多的整数,普通的计算机不能直

接处理,如:9834975972130802345791023498570345

显然,这样的整数普通的计算机和程序语言是无法直接表示的。

大整数运算:给定两个n位的整数I,J,

加、减法:可以用O(n)的时间计算出I+J和I-J,即使I、J是大整数;

乘法:若I、J超过普通计算机可以表示的数据范围,怎么计算IxJ?

如I = 9834975972135791023498570345

J = 3432450018098972347892345023

2.2算法设计

要求两个位数为 n的整数 A和B的乘积AxB。如果用普通的乘法的话,要用n2次乘法和n-1次加法,所以时间复杂度是O(n2)。

如果把 A分解成 A=a*10n/2+b

把B分解成B=c*10n/2+d

那么AxB=( a*10n/2+b)x(c*10n/2+d)=ac*10n+(ad+bc)*10n/2+bd = ac*10n+((a+b)(c+d)-ac-bd)*10n/2+bd

这样的话是3次乘法6次加法,当然,可以递归计算ac,bd,(a+d)(c+d)

由此可以产生下面递推公式:

T(n)=3T(n/2)+bn; n>1

T(n)=d; n=1

b d是大于 0的常量。

根据主定理 T(n)=n1.59 (1.59=log23)

算法实现:

//大整数乘法

public class Multiplication {

/**

* @param args

*/

public long mutiply(long a ,long b){

long n=getDigitsNum(a); //位数

if(n<4) return a*b;

long al=a%(int)Math.pow(10, n/2);//每个数字分成两部分 long au=a/(int)Math.pow(10, Math.ceil(n/2));

long bl=b%(int)Math.pow(10, n/2);

long bu=b/(int)Math.pow(10, Math.ceil(n/2));

long ac=mutiply(au,bu); //ac

long bd=mutiply(al,bl); //bd

long abcd=mutiply(au+al,bu+bl); //(a+b)*(c+d)

long r=ac*(long)Math.pow(10, 2*(n/2))+(abcd-acbd)*(long)Math.pow(10, n/2)+bd;

return r;

}

//计算位数,a与b的位数必须相等。时间复杂度是 O(n)

public int getDigitsNum(long a){

int i=0;

while(a>0){

i++;

a=a/10;

}

return i;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

long a=1683527,b=1528719;

long result=new Multiplication().mutiply(a, b);

System.out.println(a*b);

System.out.println(result);

}

}

2.3 实验结果与分析

实验测试数据:1111111111*1111111111

123456789*999888666555222

程序运行结果:(1)

(2)

经计算器验算,计算结果均正确说明程序具有可行性。

2.4编程技术与方法

利用分治法进行编程时往往计算量过大时就会溢出,此时采取数组的方式来存放数据,并且将其以字符串的形式存储并输出,每四位存储在一个数组中由高到低,并且将进位作为一个单独的数组在下一个高位数组中进行运算时加进去,其输出数组由高位到地位组成一个新的字符串,该字符串显示的结果就是运算的结果了!

2.5 源程序及注释

#include

#include

void a2d(int x[],char a[])

{

int i,j;

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

x[i]=0;

j=strlen(a)-1;

for(i=0;j>=0;j--,i++)

x[i]=a[j]-'0';

}

int my_len(int x[])

{

int i;

for(i=499;i>=0&&x[i]==0;i--);

return i<0?0:i;

}

void multi(int x[],int y[])

{

int sum[500]={0},i,j,k,lx=my_len(x),ly=my_len(y);

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

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

sum[i+j]+=x[i]*y[j];

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

{

sum[i+1]+=sum[i]/10;

sum[i]%=10;

x[i]=sum[i];

}

}

int main()

{

int i,x[500],y[500];

char a[500],b[500];

while(scanf("%s%s",a,b)!=EOF)

{

a2d(x,a);

a2d(y,b);

multi(x,y);

i=my_len(x);

for(;i>=0;i--)

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

puts("");

}

return 0;

}

实验三单源点

3.1实验内容与要求

给定一个带权有向图G=(V,E),其中每条边的权是非负实数,给定V中的一个定点,称为源。计算从源到所有定点的最短路长度。这里的路的长度是指路上个边权之和。这个问题称之为单源点最短路径。利用贪心算法设计一个程序来实现单源点最短距离的求取。

3.2算法设计

Dijkstra算法是解单源最短路径的一个贪心算法其基本思想是,设置顶点集合S并不断的做贪心选择来扩充这个集合。一个顶点属于S 当且仅当从源点到该顶点的最短路径长度已知。初值时,S中仅含有源,设u是G中某一个顶点,把从源到u且中间只经过S中的顶点的路径(称为特殊路径)长度用数组dist记录,Dijkstra算法每次从

V-S 中取出具有最短特殊路径长度的顶点u,将u添加到S中,同时对数组dist做必要的修改,一旦S中包含了V中所有的顶点,dist

就记录了从源到所有其他顶点的最短路径长度。

3.3 实验结果与分析

测试数据:

实验运行结果:

其中5 7表示这是一个有5个顶点7条边组成的有向带权图,

0到1的距离为100其余以此类推,输入源点0,则其单源点最短路径和距离分别为:

0-1路径为0-4-3-1距离为70

0-2路径为0-2距离为30

其余以此类推,经手动验证,说明程序具有可行性,结果正确。

3.4编程技术与方法

该实验实现的主要方法是Dijkstra算法,试验程序中主要利用数组来存储其有向带权图的邻接矩阵,利用数组来进行矩阵的一些运算。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这种思路:

假设存在G=,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。

1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;

2.更新与i直接相邻顶点的dist。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})

3.直到U=V,停止。

3.5 源程序及注释

/*Dijkstra求单源最短路径2015.6.17*/

#include

#include

#include

#define M 100

#define N 100

using namespace std;

typedef struct node

{

int matrix[N][M]; //邻接矩阵

int n; //顶点数

int e; //边数

}MGraph;

void DijkstraPath(MGraph g,int *dist,int *path,int v0) //v0表示源顶点

{

int i,j,k;

bool *visited=(bool *)malloc(sizeof(bool)*g.n);

for(i=0;i

{

if(g.matrix[v0][i]>0&&i!=v0)

{

dist[i]=g.matrix[v0][i];

path[i]=v0; //path记录最短路径上从v0到i的前一个顶点}

else

{

dist[i]=INT_MAX; //若i不与v0直接相邻,则权值置为无穷大

path[i]=-1;

}

visited[i]=false;

path[v0]=v0;

dist[v0]=0;

}

visited[v0]=true;

for(i=1;i

{

int min=INT_MAX;

int u;

for(j=0;j

{

if(visited[j]==false&&dist[j]

{

min=dist[j];

u=j;

}

}

visited[u]=true;

for(k=0;k

{

if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]

{

dist[k]=min+g.matrix[u][k];

path[k]=u;

}

}

}

}

void showPath(int *path,int v,int v0) //输出最短路径上的各个顶点{

stack s;

int u=v;

while(v!=v0)

{

s.push(v);

v=path[v];

}

s.push(v);

while(!s.empty())

{

cout<

s.pop();

}

}

int main(int argc, char *argv[])

{

int n,e; //表示输入的顶点数和边数

while(cin>>n>>e&&e!=0)

{

int i,j;

int s,t,w; //表示存在一条边s->t,权值为w

MGraph g;

int v0;

int *dist=(int *)malloc(sizeof(int)*n);

int *path=(int *)malloc(sizeof(int)*n);

for(i=0;i

for(j=0;j

g.matrix[i][j]=0;

g.n=n;

g.e=e;

for(i=0;i

{

cin>>s>>t>>w;

g.matrix[s][t]=w;

}

cin>>v0; //输入源顶点

DijkstraPath(g,dist,path,v0);

for(i=0;i

{

if(i!=v0)

计算方法上机实验报告

《计算方法》上机实验报告 班级:XXXXXX 小组成员:XXXXXXX XXXXXXX XXXXXXX XXXXXXX 任课教师:XXX 二〇一八年五月二十五日

前言 通过进行多次的上机实验,我们结合课本上的内容以及老师对我们的指导,能够较为熟练地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法和Gauss 求积公式等六种算法的原理和使用方法,并参考课本例题进行了MATLAB 程序的编写。 以下为本次上机实验报告,按照实验内容共分为六部分。 实验一: 一、实验名称及题目: Newton 迭代法 例2.7(P38):应用Newton 迭代法求 在 附近的数值解 ,并使其满足 . 二、解题思路: 设'x 是0)(=x f 的根,选取0x 作为'x 初始近似值,过点())(,00x f x 做曲线)(x f y =的切线L ,L 的方程为))((')(000x x x f x f y -+=,求出L 与x 轴交点的横坐标) (') (0001x f x f x x - =,称1x 为'x 的一次近似值,过点))(,(11x f x 做曲线)(x f y =的切线,求该切线与x 轴的横坐标) (') (1112x f x f x x - =称2x 为'x

的二次近似值,重复以上过程,得'x 的近似值序列{}n x ,把 ) (') (1n n n n x f x f x x - =+称为'x 的1+n 次近似值,这种求解方法就是牛顿迭代法。 三、Matlab 程序代码: function newton_iteration(x0,tol) syms z %定义自变量 format long %定义精度 f=z*z*z-z-1; f1=diff(f);%求导 y=subs(f,z,x0); y1=subs(f1,z,x0);%向函数中代值 x1=x0-y/y1; k=1; while abs(x1-x0)>=tol x0=x1; y=subs(f,z,x0); y1=subs(f1,z,x0); x1=x0-y/y1;k=k+1; end x=double(x1) K 四、运行结果: 实验二:

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

算法设计与分析实验报告 贪心算法 班级: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) 三背景知识 (3) 四总体设计 (4) 五详细设计……………………………………………………错误!未定义书签。 六运行结果分析 (9) 七心得体会 (13) 八参考文献 (14) 附:源代码 (15)

一、实验目的 本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。学生通过设计与实现Clock算法,能够加强对相应理论的理解,并对了解操作系统内部的基本处理原理与过程也有很多益处。利用简单的数据结构,模拟实现操作系统中的页面置换机制,通过写程序模拟实现上述三种内存页面置换算法,使学生进一步掌握内存页面置换的方法。对操作系统中内存的管理有一个实践上的认识。 1、用C语言编写OPT、FIFO、LRU三种置换算法。 2、熟悉内存分页管理策略。 3、了解页面置换的算法。 4、掌握一般常用的调度算法。 5、根据方案使算法得以模拟实现。 6、锻炼知识的运用能力和实践能力。 二、实验要求 ●设计随机页面序号产生程序,并说明随机的性能和其性能可能对算法的 影响 ●编写页面淘汰算法(FIFO、OPT、LRU) ●结果数据的显示或提取 ●结果数据的分析 几点说明: ●设计并绘制算法流程,附加说明所需的数据结构 ●如何标记时间的先后、最久的将来、最久未被使用 ●描述Clock算法的基本原理、必要的数据结构、算法执行流程图、编码实 现。 1)初始化:输入作业可占用的总页框数,初始化置空。 2)输入请求序列:输入一个作业页号访问请求序列,依次占用相应页框,直至全部占用; 3)Clock算法:当页框全部占用后,对于后续新的页号访问请求,执行Clock 算法,淘汰1个页面后装入新的页号。 4)显示当前分配淘汰序列:显示淘汰的页号序列。 三、背景知识:

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

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

一、实验目的 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

实验五-页面调度算法模拟实验报告

《计算机操作系统》实验报告 实验五:页面调度算法模拟 学校:╳╳╳ 院系:╳╳╳ 班级:╳╳╳ 姓名:╳╳╳ 学号:╳╳╳

指导教师:╳╳╳ 目录 一、实验题目 (3) 二、实验学时 (4) 三、指导老师 (4) 四、实验日期 (4) 五、实验目的 (4) 六、实验原理 (4) 6.1页面的含义 (4) 6.2 页面置换算法的含义 (4) 6.3 置换算法 (4) 6.3.1最佳置换算法(Optimal) (5) 6.3.2先进先出(FIFO)页面置换算法 (5) 6.3.3 LRU置换算法 (5) 七、实验步骤及结果 (5)

7.1 验证最佳置换算法 (5) 7.1.1 实验截图 (5) 7.1.2 实验分析 (6) 7.2 验证先进先出(FIFO)页面置换算法 (7) 7.2.1 实验截图 (7) 7.2.2 实验分析 (7) 7.3 验证LRU置换算法 (8) 7.3.1 实验截图 (8) 7.3.2 实验分析 (8) 八、报告书写人 (9) 附录一最佳置换算法(Optimal) (9) 附录二先进先出(FIFO)页面置换算法 (15) 附录三LRU置换算法 (20) 实验五:页面调度算法模拟 一、实验题目 页面调度算法模拟

二、实验学时 2学时 三、指导老师 ╳╳╳ 四、实验日期 2018年12月10日星期一 五、实验目的 (1)熟悉操作系统页面调度算法 (2)编写程序模拟先进先出、LRU等页面调度算法,体会页面调度算法原理 六、实验原理 6.1页面的含义 分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,称为页面或页。 6.2 页面置换算法的含义 在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法(Page_Replacement Algorithms)。 6.3 置换算法 一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。

计算方法第二章方程求根上机报告

实验报告名称 班级:学号:姓名:成绩: 1实验目的 1)通过对二分法与牛顿迭代法作编程练习与上级运算,进一步体会二分法与牛顿迭代法的不同特点。 2)编写割线迭代法的程序,求非线性迭代法的解,并与牛顿迭代法。 2 实验内容 用牛顿法和割线法求下列方程的根 x^2-e^x=0; x*e^x-1=0; lgx+x-2=0; 3实验步骤 1)根据二分法和牛顿迭代法,割线法的算法编写相应的求根函数; 2)将题中所给参数带入二分法函数,确定大致区间; 3)用牛顿迭代法和割线法分别对方程进行求解; 3 程序设计 牛顿迭代法x0=1.0; N=100; k=0; eps=5e-6; delta=1e-6; while(1) x1=x0-fc1(x0)/fc2(x0); k=k+1; if k>N disp('Newmethod failed')

break end if(abs(x1-x0)=delta) c=x1; x1=cutnext(x0,x1); x0=c; %x0 x1μYí?μ?μ?x1 x2 è?è?±£′??úx0 x1 end k=k+1; if k>N disp('Cutline method failed') break; end if(abs(x1-x0)

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网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、最佳淘汰算法(OPT) 2、先进先出的算法(FIFO) 3、最近最久未使用算法(LRU) 4、简单时钟(钟表)算法(CLOCK) 命中率=1-页面失效次数/页地址流(序列)长度 三、实验原理 UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。 当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。为实现请求调页,核心配置了四种数据结构:页表、页帧(框)号、访问位、修改位、有效位、保护位等。 当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。 四、算法描述 本实验的程序设计基本上按照实验内容进行。即使用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。 (1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:A:50%的指令是顺序执行的 B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1

数值分析上机实验报告

数值分析上机实验报告

《数值分析》上机实验报告 1.用Newton 法求方程 X 7-X 4+14=0 在(0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001)。 1.1 理论依据: 设函数在有限区间[a ,b]上二阶导数存在,且满足条件 {}α?上的惟一解在区间平方收敛于方程所生的迭代序列 迭代过程由则对任意初始近似值达到的一个中使是其中上不变号 在区间],[0)(3,2,1,0,) (') ()(],,[x |))(),((|,|,)(||)(|.4;0)(.3],[)(.20 )()(.110......b a x f x k x f x f x x x Newton b a b f a f mir b a c x f a b c f x f b a x f b f x f k k k k k k ==- ==∈≤-≠>+ 令 )9.1()9.1(0)8(4233642)(0)16(71127)(0)9.1(,0)1.0(,1428)(3 2 2 5 333647>?''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f 故以1.9为起点 ?? ?? ? ='- =+9.1)()(01x x f x f x x k k k k 如此一次一次的迭代,逼近x 的真实根。当前后两个的差<=ε时,就认为求出了近似的根。本程序用Newton 法求代数方程(最高次数不大于10)在(a,b )区间的根。

1.2 C语言程序原代码: #include #include main() {double x2,f,f1; double x1=1.9; //取初值为1.9 do {x2=x1; f=pow(x2,7)-28*pow(x2,4)+14; f1=7*pow(x2,6)-4*28*pow(x2,3); x1=x2-f/f1;} while(fabs(x1-x2)>=0.00001||x1<0.1); //限制循环次数printf("计算结果:x=%f\n",x1);} 1.3 运行结果: 1.4 MATLAB上机程序 function y=Newton(f,df,x0,eps,M) d=0; for k=1:M if feval(df,x0)==0 d=2;break else x1=x0-feval(f,x0)/feval(df,x0); end e=abs(x1-x0); x0=x1; if e<=eps&&abs(feval(f,x1))<=eps d=1;break end end

银行家算法设计实验报告

银行家算法设计实验报告

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

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

计算方法上机实习题大作业(实验报告).

计算方法实验报告 班级: 学号: 姓名: 成绩: 1 舍入误差及稳定性 一、实验目的 (1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; (2)通过上机计算,了解舍入误差所引起的数值不稳定性 二、实验内容 1、用两种不同的顺序计算10000 21n n -=∑,分析其误差的变化 2、已知连分数() 1 01223//(.../)n n a f b b a b a a b =+ +++,利用下面的算法计算f : 1 1 ,i n n i i i a d b d b d ++==+ (1,2,...,0 i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f 3、给出一个有效的算法和一个无效的算法计算积分 1 041 n n x y dx x =+? (0,1,...,1 n = 4、设2 2 11N N j S j == -∑ ,已知其精确值为1311221N N ?? -- ?+?? (1)编制按从大到小的顺序计算N S 的程序 (2)编制按从小到大的顺序计算N S 的程序 (3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数 三、实验步骤、程序设计、实验结果及分析 1、用两种不同的顺序计算10000 2 1n n -=∑,分析其误差的变化 (1)实验步骤: 分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h (2)程序设计: a.顺序计算

#include #include void main() { double sum=0; int n=1; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0)printf("sun[%d]=%-30f",n,sum); if(n>=10000)break; n++; } printf("sum[%d]=%f\n",n,sum); } b.逆序计算 #include #include void main() { double sum=0; int n=10000; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0) printf("sum[%d]=%-30f",n,sum); if(n<=1)break; n--; } printf("sum[%d]=%f\n",n,sum); } (3)实验结果及分析: 程序运行结果: a.顺序计算

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

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

存储管理实验报告

综合性实验报告 一、实验目的 通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。 页面置换算法是虚拟存储管理实现的关键,通过本次实验理解内存页面调度的机制,在模拟实现FIFO、LRU、OPT、LFU、NUR几种经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。 二、总体设计 1、编写函数计算并输出下述各种算法的命中率 ①OPT页面置换算法 OPT所选择被淘汰的页面是已调入内存,且在以后永不使用的,或是在最长时间内不再被访问的页面。因此如何找出这样的页面是该算法 的关键。可为每个页面设置一个步长变量,其初值为一足够大的数,对 于不在内存的页面,将其值重置为零,对于位于内存的页面,其值重置 为当前访问页面与之后首次出现该页面时两者之间的距离,因此该值越 大表示该页是在最长时间内不再被访问的页面,可以选择其作为换出页 面。 ②FIFO页面置换算法 FIFO总是选择最先进入内存的页面予以淘汰,因此可设置一个先进先出的忙页帧队列,新调入内存的页面挂在该队列的尾部,而当无空闲 页帧时,可从该队列首部取下一个页帧作为空闲页帧,进而调入所需页 面。 ③LRU页面置换算法 LRU是根据页面调入内存后的使用情况进行决策的,它利用“最近的过去”作为“最近的将来”的近似,选择最近最久未使用的页面予以 淘汰。该算法主要借助于页面结构中的访问时间time来实现,time记

录了一个页面上次的访问时间,因此,当须淘汰一个页面时,选择处于 内存的页面中其time值最小的页面,即最近最久未使用的页面予以淘 汰。 ④LFU页面置换算法 LFU要求为每个页面配置一个计数器(即页面结构中的counter),一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则 将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘 汰。 ⑤NUR页面置换算法 NUR要求为每个页面设置一位访问位(该访问位仍可使用页面结构中的counter表示),当某页被访问时,其访问位counter置为1。需要 进行页面置换时,置换算法从替换指针开始(初始时指向第一个页面) 顺序检查处于内存中的各个页面,如果其访问位为0,就选择该页换出, 否则替换指针下移继续向下查找。如果内存中的所有页面扫描完毕未找 到访问位为0的页面,则将替换指针重新指向第一个页面,同时将内存 中所有页面的访问位置0,当开始下一轮扫描时,便一定能找到counter 为0的页面。 2、在主函数中生成要求的指令序列,并将其转换成页地址流;在不同 的内存容量下调用上述函数使其计算并输出相应的命中率。 三、实验步骤(包括主要步骤、代码分析等) 主要步骤: 、通过随机数产生一个指令序列,共320条指令。其地址按下述原则生成: ①50%的指令是顺序执行的; ②25%的指令是均匀分布在前地址部分; ③25%的指令是均匀分布在后地址部分; 具体的实施方法是: A.在[0,319]的指令地址之间随机选区一起点M; B.顺序执行一条指令,即执行地址为M+1的指令; C.在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’; D.顺序执行一条指令,其地址为M’+1; E.在后地址[M’+2,319]中随机选取一条指令并执行;

算法与设计实验报告

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

实验内容 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

FIFO算法实验报告

实验报告 课程名称 学生所在系部 年级 专业、班级 学生姓名 学号 任课教师 实验成绩 软件工程系制

一、实验题目: 先进先出(FIFO)页面置换算法和最近最久未使用(LRU)置换算法程序设计 二、实验目的: 通过对FIFO,LRU算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 三、实验设备及环境: 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。 四、实验内容及要求: (1)用C语言编程实现对FIFO,LRU算法的模拟。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: 五、实验方法内容 1.算法流程图

2.主要的常量变量 char a; int m=4,n=12,i,y[12]={1,2,3,4,1,2,5,1,2,3,4,5}; 主要模块 void FIFO(void); void LRU(void); void Xunhuan() void main() 四.代码 #include"stdio.h" #include"stdlib.h" #include"time.h" void FIFO(void); void LRU(void); char a; int m=4,n=12,i,y[12]={1,2,3,4,1,2,5,1,2,3,4,5}; /*m为物理块数,n为要访问的页面数*/ typedef struct page{ int num; int time; }Page; Page x[10]; int GetMax(page *x) { int i; int max=-1; int tag=0; for(i=0;i

计算方法实验报告册

实验一——插值方法 实验学时:4 实验类型:设计 实验要求:必修 一 实验目的 通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C )编程实现数值方法的求解。并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。 二 实验内容 通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。取点越密集,所得折线就越逼近理论上的插值曲线。本实验中将所取的点的横坐标存放于动态数组[]X n 中,通过插值方法计算得到的对应纵坐标存放 于动态数组[]Y n 中。 以Visual C++.Net 2005为例。 本实验将Lagrange 插值、Newton 插值和三次样条插值实现为一个C++类CInterpolation ,并在Button 单击事件中调用该类相应函数,得出插值结果并画出图像。CInterpolation 类为 class CInterpolation { public : CInterpolation();//构造函数 CInterpolation(float *x1, float *y1, int n1);//结点横坐标、纵坐标、下标上限 ~ CInterpolation();//析构函数 ………… ………… int n, N;//结点下标上限,采样点下标上限 float *x, *y, *X;//分别存放结点横坐标、结点纵坐标、采样点横坐标 float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;//样条插值用到的公有指针,分别存放 i h ,i α,i β,i a ,i b ,i c ,i d 和i m }; 其中,有参数的构造函数为 CInterpolation(float *x1, float *y1, int n1) { //动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1; N=x1[n]-x1[0]; X=new float [N+1]; x=new float [n+1]; y=new float [n+1];

算法设计实验报告(川大陈瑜)

《算法设计》课程报告 课序号: 01 学号: 2012141461134 姓名:刘佳玉 任课教师:陈瑜 评阅成绩: 评阅意见: 提交报告时间:2014年 6 月 16 日

贪心算法 1、问题描述 (这是我在soj上找的一道题,以前没做出来,现在用贪心的思想做出来了) 约翰要去钓鱼。他有h小时可用(1≤h≤16),在这个地区有n个湖泊(2≤n≤25),所有的湖泊沿着一条单行道可到达。约翰从湖泊1开始,他可以在任何湖泊结束。他只能从一个湖,到下一个,但他没有必要停在任何湖除非他想停。对于每个i = 1,……,n-1,ti 表示从湖i到湖i+1的5分钟的时间间隔(0 < ti < = 192)。例如,t3 = 4意味着它从湖3湖4需要20分钟的时间。 为了帮助他们规划自己的钓鱼旅行,约翰已经收集了一些关于湖泊信息。对于每个湖泊的i,能钓到的鱼在最初的5分钟的数量,用fi表示(fi > = 0),是已知的。每钓5分钟的鱼,能钓到的鱼在接下来的5分钟的间隔降低一个恒定的数di(di>=0)。如果能钓到的鱼在一个时间区的数量小于或等于di,将不会有更多的鱼留在湖里在下一个时间间隔。为了简化规划,约翰认为没有人会在影响他期待钓到的鱼的数量的湖里钓鱼。 写一个程序来帮助约翰计划他的最大化期望钓到的鱼的数量的钓鱼之旅。在每个湖花费的时间数必须是5的倍数。 这个问题包含多个测试案例! 一个多输入的第一行是一个整数N,然后一个空白行后的N个输入块。每个输入块由问题描述中的格式表示的。每个输入块之间有一个空行。 输出格式包含N个输出块。输出块之间要有一个空白行。 输入 在输入中,会给你一个案例输入的数量。每一种情况下,以n开始,其次是h,接下来有一行n个整数指定fi(1 < =i< = n),然后有一行n个整数di(1≤i<=n),最后,有一行n - 1的整数ti(1≤i<=n-1)。输入在n=0的情况下终止。 输出

计算方法上机实验报告——拉格朗日插值问题

计算方法上机实验报告——拉格朗日插值问题 一、方法原理 n次拉格朗日插值多项式为:Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0) n=2时,称为二次插值或抛物线插值,精度相对高些 L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x 2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1) 二、主要思路 使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。 对节点xi(i=0,1,…,n)中任一点xk(0<=k<=n)作一n次多项式lk(xk),使它在该点上取值为1,而在其余点xi(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) 上式表明:n个点xi(i=0,1,…,k-1,k+1,…,n)都是lk(x)的零点。可求得lk 三.计算方法及过程:1.输入节点的个数n 2.输入各个节点的横纵坐标 3.输入插值点 4.调用函数,返回z 函数语句与形参说明 程序源代码如下: 形参与函数类型 参数意义 intn 节点的个数 doublex[n](double*x) 存放n个节点的值 doubley[n](double*y) 存放n个节点相对应的函数值 doublep 指定插值点的值 doublefun() 函数返回一个双精度实型函数值,即插值点p处的近似函数值 #include #include usingnamespacestd; #defineN100 doublefun(double*x,double*y,intn,doublep); voidmain() {inti,n; cout<<"输入节点的个数n:"; cin>>n;

《算法设计与分析》实验报告

算法设计与分析课程实验项目目录 学生:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。

本科实验报告专用纸 课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号实验项目类型设计实验地点机房 学生学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间2012年3月1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人 H.E.Dudeney(1857-1930)给出的: S END +MORE MONEY . 这里有两个前提假设: 第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。)

该算法程序代码如下: #include "stdafx.h" #include "time.h" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l

相关文档
最新文档