《算法分析与设计》实验指导书学时.docx

上传人:b****6 文档编号:3032094 上传时间:2022-11-17 格式:DOCX 页数:20 大小:55.39KB
下载 相关 举报
《算法分析与设计》实验指导书学时.docx_第1页
第1页 / 共20页
《算法分析与设计》实验指导书学时.docx_第2页
第2页 / 共20页
《算法分析与设计》实验指导书学时.docx_第3页
第3页 / 共20页
《算法分析与设计》实验指导书学时.docx_第4页
第4页 / 共20页
《算法分析与设计》实验指导书学时.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

《算法分析与设计》实验指导书学时.docx

《《算法分析与设计》实验指导书学时.docx》由会员分享,可在线阅读,更多相关《《算法分析与设计》实验指导书学时.docx(20页珍藏版)》请在冰豆网上搜索。

《算法分析与设计》实验指导书学时.docx

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

 

数理学院

 

算法分析与设计

实验报告

 

姓名:

学号:

班级:

实验一分治策略排序…………………………..…..………3

实验二减治策略查找顺序表…………………..…………..5

实验三动态规划求解0/1背包问题……………………….8

实验四贪心算法求解最短路径问题……………………..10

实验一分治策略排序

实验目的

1)以排序问题为例,掌握分治法的基本设计策略;

2)熟练掌握合并排序算法的实现;

3)熟练掌握快速排序算法的实现;

4)理解常见的算法经验分析方法。

实验环境

计算机、C语言程序设计环境

实验学时

2学时

实验内容与步骤

1.准备实验数据

要求:

编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。

这些数作为本算法实验的输入数据。

2.实现合并排序算法

要求:

实现mergesort算法。

输入:

待排数据文件data.txt;

输出:

有序数据文件resultsMS.txt(注:

建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。

合并排序算法(类C语言):

/*数组A[]中包含待排元素;arrayB[]isaworkarray*/

TopDownMergeSort(A[],B[],n)

{

TopDownSplitMerge(A,0,n,B);

}

//iBeginisinclusive;iEndisexclusive(即:

A[iEnd]不是待排元素)

TopDownSplitMerge(A[],iBegin,iEnd,B[])

{

if(iEnd-iBegin<2)//如果只有1个待排元素,返回。

return;

//recursivelysplitrunsintotwohalvesuntilrunsize==1,

//thenmergethem

iMiddle=(iEnd+iBegin)/2;//划分

TopDownSplitMerge(A,iBegin,iMiddle,B);

TopDownSplitMerge(A,iMiddle,iEnd,B);

TopDownMerge(A,iBegin,iMiddle,iEnd,B);//合并;元素放到数组B中。

CopyArray(B,iBegin,iEnd,A);//copythemergedrunsbacktoA

}

//lefthalfisA[iBegin:

iMiddle-1]

//righthalfisA[iMiddle:

iEnd-1]

TopDownMerge(A[],iBegin,iMiddle,iEnd,B[])

{

i0=iBegin,i1=iMiddle;

//Whilethereareelementsintheleftorrightruns

for(j=iBegin;j

//Ifleftrunheadexistsandis<=existingrightrunhead.

if(i0=iEnd||A[i0]<=A[i1])){

B[j]=A[i0];

i0=i0+1;

}else{

B[j]=A[i1];

i1=i1+1;

}

}

}

CopyArray(B[],iBegin,iEnd,A[])

{

for(k=iBegin;k

A[k]=B[k];

}

3.实现快速排序算法

要求:

实现QuickSort算法。

输入:

待排数据文件data.txt;

输出:

有序数据文件resultsQS.txt(注:

建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeQS。

快速排序算法(伪码):

ProcedureQuickSort(p,q)

integerp,q;globaln,A(1:

n)

ifp

j←q+1

Partition(p,j);//用元素A(p)划分元素表A[p:

j-1];划分后,划分元素下标由参数j带出。

QuickSort(p,j-1);

QuickSort(j+1,q);

endif

endQuickSort

用元素A(m)划分元素表A[m:

p-1]:

Procedurepartition(m,p)

integerm,p,I;globalA(m:

p-1)

v=A(m);I=m;

loop

loopI=I+1untilA(I)>=vrepeat

loopp=p-1untilA(p)<=vrepeat

ifI

thenA(i)A(p)

elseexit

endif

repeat

A(m)=A(p);A(p)=v;

endpartition

实验报告:

实验报告应包括以下内容:

(1)题目;

(2)2个算法的基本思想描述;

(3)程序流程图;

(4)给出data.txt、resultsMS.txt、resultsQS.txt三个数据文件;给出TimeMS、TimeQS的数值结果;

(5)实验分析;以表或者图的形式给出这两个算法效率的经验分析结果;并和理论分析结论进行对比。

(6)说明本次实验的心得体会、经验等。

如果程序未通过,应分析其原因。

实验二减治策略查找顺序表

实验目的

1)以顺序表查找问题为例,掌握减治法的基本设计策略;

2)熟练掌握折半查找算法的实现;

3)掌握插值查找算法的实现;

4)分析实验结果。

实验环境

计算机、C语言程序设计环境

实验学时

2学时

实验内容与步骤

1.准备实验数据

通过实验一获得的排好序的数据可作为本算法实验的输入数据。

2.实现折半查找算法

要求:

实现binary_search算法。

输入:

已排序数据序列A、待查找的数据元素key;

输出:

数据元素key在数据序列A中的位置。

折半查找算法(类C语言):

intbinary_search(intA[],intkey,intimin,intimax)

{

while(imin<=imax)

{

intimid=midpoint(imin,imax);//找中点

if(A[imid]==key)

returnimid;

elseif(A[imid]

imin=imid+1;

else

imax=imid-1;

}

//没找到

returnNOT_FOUND;

}

3.实现插值查找算法

要求:

实现interp_search算法。

输入:

已排序数据序列A、待查找的数据元素key;

输出:

数据元素key在数据序列A中的位置。

插值查找算法(类C语言):

intinterpolation_search(intA[],intsize,intkey)

{

intlow=0;

inthigh=size-1;

intmid;

while(A[high]!

=A[low]&&key>=A[low]&&key<=A[high]){

mid=low+(high-low)*((key-A[low])/(A[high]-A[low]));

if(A[mid]

low=mid+1;

elseif(key

high=mid-1;

else

returnmid;

}

if(key==A[low])

returnlow;

else

return-1;

}

实验报告:

实验报告应包括以下内容:

(1)题目;

(2)2个算法的基本思想描述;

(3)程序流程图;

(4)程序输入和输出结果;

(5)实验分析;以表或者图的形式给出这两个算法效率的经验分析结果;并和理论分析结论进行对比。

(6)说明本次实验的心得体会、经验等。

如果程序未通过,应分析其原因。

实验三动态规划求解0/1背包问题

实验目的

1)以0/1背包问题为例,掌握动态规划算法的基本设计策略;

2)掌握并实现求解0/1背包问题的动态规划算法;

3)分析实验结果。

实验环境

计算机、C语言程序设计环境

实验学时

2学时

实验内容与步骤

1.理解0/1背包问题

0/1背包问题的描述:

已知有n个物品和一个承重为M的背包,物品i的重量为wi、价值为pi。

现在的问题是:

如果一个物品不能被分割以后部分放进背包,那么该如何装包,才能使背包中物品的价值之和为最大?

这个问题可形式化地表述如下:

极大化目标函数

约束条件:

2.准备实验数据

确定物品数目n的值,确定各物品的重量(取正整数)和价值;

确定背包的承重值M(取正整数)。

3.实现动态规划算法

要求:

实现MFKnapsack算法。

输入:

参数i(初次调用时为物品总数n),j(初次调用时为空包承重M);全局变量:

物品重量Weights[1..n],价值Values[1..n];

输出:

这i个物品的最优子集的价值。

算法MFKnapsack(i,j)(伪码):

//另有全局变量V[0..n,0..M]存放已经解决的子问题的结果;V初始化:

V[0,*]=0、V[*,0]=0,其他元素值初始化为负数。

ifV[i,j]<0//此问题还没有解

ifj

valueMFKnapsack(i-1,j)

else

valuemax{MFKnapsack(i-1,j),Value[i]+MFKnapsack(i-1,j-Weights[i])}

V[i,j]value

returnV[i,j]

4.修改以上算法,以输出最大装包价值对应的那些装包物品。

实验报告:

实验报告应包括以下内容:

(1)题目;

(2)算法的基本思想描述;

(3)程序流程图;

(4)给出实验内容4所要求的算法伪码或程序清单;

(5)实验分析:

分析算法效率;

(6)说明本次调试实验的心得体会、经验等。

如果程序未通过,应分析其原因。

 

选做实验动态规划求解最短路径问题

实验目的:

1)以解决最短路径问题为例,掌握动态规划的基本设计策略;

2)掌握Floyd动态规划算法求解完全最短路径问题并实现;

3)分析实验结果。

实验环境

计算机、C语言程序设计环境

实验学时

2学时

实验内容与步骤

1.准备实验数据

假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:

权值矩阵floatgraph[maxsize][maxsize]。

 

2.实现Floyd算法

用Floyd算法求一个图中所有点对之间的最短距离。

输入:

存储图数据的权值矩阵floatgraph[maxsize][maxsize];

输出:

保存到文件floyd-out

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1