山东科技大学算法设计总文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》
实验报告
班级计算机2011-3班
姓名
学号
2013年12 月08 日
目录
实验一二分查找程序实现…………………………………………………………………01页
实验二棋盘覆盖问题………………………………………………………………………04页实验三0-1背包问题的动态规划算法设计……………………………………………….07页实验四背包问题的贪心算法………………………………………………………………10页
实验五最小重量机器设计问题(回溯法) (12)
页
实验六最小重量机器设计问题(分支限界法) (15)
页
指导教师对实验报告的评语
成绩:
指导教师签字:
年月日
算法分析与设计实验报告
—二分搜索算法的实现
一、实验目的
建立算法复杂度的理论分析与实验分析的联系,深刻体会算法复杂度作为算法的好坏评价指标的本质含义。
二、实验要求
1、用c/c++语言实现二分搜索算法。
2、通过随机产生有序递增数组的方法,测出二分查找算法平均意义下比较次数随问题规模的变化结果,并绘制曲线表示。
三、实验原理
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解。
四、实验过程(步骤)
1、产生随机有序递增数组
使用rand()函数产生随机数,并组织成有序数组, ; 为使每次产生的随机数不同使用随机数发生器的初始化函数srand(time(0))
for ( int j=100; j <=1000; j+=100 ) {
array[0]=10+rand()%15;
for(int i=1; i // 生成递增随机数列 array[i]=array[i-1]+1+rand()%3+rand()%10; } 产生要查找的数的下标 suffix 为要搜索的元素下标 int suffix = rand() % j; key 为要查找的数据 int key = array[suffix]; 2、统计理论平均查找次数和实际平均查找次数 float count=0.0 //平均实际查找次数 根据二分查找的算法可得理论平均查找次数为O(log n); 3、二分查找 int BinarySearch( int b[], int key, int left, int right ) { while( left <= right ) { middle = ( left + right ) / 2; if (Key == b[middle]) { RowCount++; return middle; } else if ( key < b[middle] ) { right = middle - 1; RowCount++; } else { left = middle + 1; RowCount++; } } return -1; //没有找到 } 五、运行结果 x:数组个数y:平均查找时间系列1:理论平均查找时间系列2:实际平均查找时间 六、实验分析与讨论 在试验中,遇到了如何产生随机数递增数组的问题,解决方法是采用rand()函数获得随机递增数组和要查找的数字下标。采用随机化的数组,能够更加具有普遍性,更加能够证明算法的平均查找时间。 七、实验心得 二分查找在搜索有序表时,效率比较高。通过这次实验我对二分查找算法的认识又有了新的提高。 指导教师对实验报告的评语 成绩: 指导教师签字: 年月日 算法分析与设计实验报告 —分治法解决棋盘覆盖问题 一、实验目的 建立算法复杂度的理论分析与实验分析的联系,深刻体会算法复杂度作为算法的好坏评价指标的本质含义。 二、实验要求 1、用c++程序语言实现分治法解决棋盘覆盖问题。 2、分析算法的时间复杂度 三、实验原理 用分治策略,可以设计解决棋盘问题的一个简介算法。 当k>0时,可以将2^k *2^k棋盘分割为4个2^k-1 * 2^k-1子棋盘。由棋盘覆盖问题得知,特殊方格必位于4个较小的子棋盘中,其余3个子棋盘中无特殊方格。为了将3个无特殊方格的子棋盘转化为特殊棋盘可以将一个L型骨牌覆盖这3个较小棋盘的会合处,所以,这3个子棋盘上被L型覆盖的方格就成为给棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归的使用这种分割,直至棋盘简化为1*1棋盘为止。 四、实验过程(步骤) 1、数据说明: tr:棋盘上左上角方格的行号 tc:棋盘上左上角方格的列号 dr:特殊方格所在的行号 dc:特殊方格所在的列号 定义了全局变量tile,用于进行覆盖。区分4种不同L类型的骨牌,初始值为0. Board[]数组用来表示棋盘 2、函数说明 ChessBoard函数实现了递归的将棋盘划分为子棋盘,并将棋盘进行覆盖。 main()函数用来进行输入棋盘的大小和特殊棋盘的位置。 使用memset(Board,0,sizeof(Board))将Board[]数组清零 使用setw()函数控制输出格式 五、运行结果