欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    算法设计实验报告讲解.docx

    • 资源ID:8682820       资源大小:244.29KB        全文页数:41页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    算法设计实验报告讲解.docx

    1、算法设计实验报告讲解华北电力大学实 验 报 告| 实验名称 算法设计与分析综合实验 课程名称 算法设计与分析 | 专业班级: 学生姓名: 学 号: 成 绩:指导教师: 实验日期: 综合实验一 分治策略归并排序一、实验目的及要求归并排序是一个非常优秀的排序方法,也是典型的分治策略的典型应用。实验要求:(1)编写一个模板函数:template ,MergeSort(T *a, int n);以及相应的一系列函数,采用分治策略,对任意具有:bool operator(const T&x,const T&y);比较运算符的类型进行排序。(2)与STL库中的函数std:sort(.)进行运行时间上的比较

    2、,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。二、所用仪器、设备计算机、Visual C+软件。三、实验原理分治原理:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它

    3、们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。归并原理:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。四、实验方法与步骤归并过程为:比较ai和aj的大小,若aiaj,则将第一个有序表中的元素ai复制到rk中,并令i和k分别加上1;否则将第二个有序表中的元素aj复制到rk中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有

    4、序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间s,t以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间s,t。实现时间计量:#define _CLOCK_T_DEFINEDsrand(unsigned)time(0);/定义一数组an;对每一个赋予一值。ai=rand();得到随即数。 duration =(double)(finish -start)/CLOCKS_PER_SEC;start=clock();将系统时间赋予Start。以便以后进行比较。std:sort(b,b+1000)

    5、;系统执行1000个数据。Finish-Start为最终结果。五、实验结果与数据处理实验结果截图:实验代码:#include#include#include#include#includeusing namespace std;templatevoid MergSort(Type a, int n) Type *b = new Typen; int s = 1; while (s n) MergPass(a, b, s, n); s += s; MergPass(b, a, s, n); s += s; templatevoid MergPass(Type x, Type y, int s,

    6、int n) int i = 0; while (i = n - 2 * s) Merg(x, y, i, i + s - 1, i + 2 * s - 1); i = i + 2 * s; if (i + s n) Merg(x, y, i, i + s - 1, n - 1); else for (int j = i; j = n - 1; j+) yj = xj; templatevoid Merg(Type c, Type d, int l, int m, int r) int i = l, j = m + 1, k = l; while (i = m) & (j = r) if (c

    7、i m) for (int q = j; q = r; q+) dk+ = cq; else for (int q = i; q = m; q+) dk+ = cq;float randf(float base, float up) return (rand() % (int)(up - base) * RAND_MAX)/(float)RAND_MAX ; /产生随机数void printArray(float *a,int N) for(int i=0;i0) coutaiendl; else coutai ; void main() int ArrayLen = 5; cout请输入元素

    8、个数:ArrayLen; float *array = new floatArrayLen; float *arrays = new floatArrayLen; float mn, ene; printf(数组已建立: n); srand(unsigned)time(NULL); /设置随机数的seed for (int i = 0; i ArrayLen; i+) mn = (float)rand(); /产生小数 ene = randf(1,10000)+mn; arraysi =ene; arrayi = ene; /cout需要排序的归并数组:n; /printArray(array

    9、, ArrayLen); int flag = 1; while (flag != 0) coutn输入需要显示的排序方法:endl; cout 1.归并排序 2.std排序 0.退出 flag; switch (flag) case 0: break; case 1: clock_t s = 0, e = 0; s = clock(); MergSort(array, ArrayLen); e = clock(); /cout排序后的序列为:endl; /printArray(array, ArrayLen); cout nMergSort运行了: (e - s) ms endl; brea

    10、k; case 2: clock_t start1 = 0, end1 = 0; start1 = clock(); std:sort(&arrays0, &arraysArrayLen); end1 = clock(); /printArray(array, ArrayLen); cout nstd:sort运行了: (end1 - start1) ms sFileName = sFileName1; ifstream fin(sFileName); char ch4; fin.getline(ch, 4); int n1 = atoi(ch); cout 节点数目: n1 n = n1;

    11、this-t = new THaffmanNode2 * n1 - 1; this-nNext = n1; char ch1; for (int i = 0; in1; i+) fin.get(ch1); ti.c = ch1; fin.ignore(100, ,); fin.getline(ch, 4); ti.f = atoi(ch); for (int i = 0; in; i+) cout ti.c ti.f endl; for (int i = 0; i= 2) THaffmanNode nn, nr, nl; nl = PQ.top(); PQ.pop(); nr = PQ.top

    12、(); PQ.pop(); nn.f = nl.f + nr.f; nn.l = nl.idx; nn.r = nr.idx; nn.idx = nNext+; tnl.idx.p = nn.idx; tnr.idx.p = nn.idx; tnn.idx = nn; PQ.push(nn); else t2 * n - 2.p = -1; break; Huffman:Huffman(void)void Huffman:OutputTree() for (int i = 0; i2 * n - 1; i+) cout 权重: ti.f ; cout 左孩子: ti.l ; cout 右孩子:

    13、 ti.r ; cout 父节点: ti.p ; cout 在数组的位置: ti.idx endl; /现在数组中存的是哈弗曼数void Huffman:OutputCode() /用stack 来依次记录各编码的0 1 编码 std:stackint, std:list sk; THaffmanNode ntemp, ntemp1; for (int i = 0; in; i+) ntemp = ti; while (ntemp.p != -1) ntemp1 = tntemp.p; if (tntemp1.l.idx = ntemp.idx) sk.push(0); ntemp = nte

    14、mp1; else sk.push(1); ntemp = ntemp1; int i1 = sk.size(); cout ti.f : ; for (int i = 0; ii1; i+) cout sk.top(); sk.pop(); cout endl; 实验结果截图:综合实验三 用回溯方法求解n后问题一、实验目的及要求问题:对任意给定的n求解n后问题。具体要求:1封装n后问题为类,编写以下两种算法进行求解:(1)递归回溯方法;(2)迭代回溯方法。(选)2对任意给定的n,要求输出其解向量(所有解),并输出其解数;3构造n后问题的解数表格(由程序自动生成):n 后数解数第一个解42(2

    15、,4,1,3)56二、所用仪器、设备计算机、Visual C+软件。三、实验原理回溯原理:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:1、定义一个解空间,它包含问题的解。2、利用适于搜索的方法组织解空间。3、利用深度优先法搜索解空间。4、利用限界函数避免移动到不可能产生解的子空间。问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。四、实验方法与步骤n后问题等于在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。即规定每一列

    16、放一个皇后,不会造成列上的冲突;当第i行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以i为下标的标记置为被占领状态。K:第K个皇后,也表示第K行Xi:第K个皇后在第K行的 第i列皇后k在第k行第xk列时,xi=xk时,两皇后在同一列上;abs(xi-xk)=abs(i-k)时,两皇后在同一斜线上;两种情况两皇后都可相互攻击,返回false表示不符合条件。五、实验结果与数据处理实验结果截图: 实验代码:#include#includeclass Queenfriend int nQueen(int);private: bool Place(int k); void Backtrac

    17、k(int t); int n,*x; /当前解 long sum; /当前已找到的可行方案数;bool Queen:Place(int k) for (int j=1;jn) sum+;/达到叶结点 for(int i=1;i=n;i+) coutxi ; coutendl; for(i=1;i=n;+i) for(int j=1;j=n;+j) if(xi!=j) cout. ; else cout#; coutendl; coutendl; else for (int i=1;i=n;i+) /搜索子结点 xt=i; /进入第i个子结点 if (Place(t) Backtrack(t+

    18、1); int nQueen(int n)Queen X;/初始化XX.n=n;X.sum=0;int *p=new int n+1;for(int i=0;i=n;i+) pi=0;X.x=p;X.Backtrack(1); /对整个解空间回溯搜索delete p;return X.sum;void main() int a=0,b=0; cout*欢迎进入皇后问题*endl; int flag=1; while(flag) cout请输入皇后数a; b=nQueen(a); cout方案个数:bendl; cout是否继续?1为是,0为否flag; 综合实验四 背包问题的贪心算法一、实验目

    19、的及要求问题: 给定如下n种物品的编号,及其价值;背包重量为c, 求最佳装包方案,才能使其装入背包的价值最大。物品编号12n重量w1w2.wn价值v1v2vn具体要求:将背包问题进行类的封装;能对任意给定的n种物品的重量、价值及背包限重,输出以上表格( 或纵向输出);输出背包问题的解;本题要求采用STL库中的排序算法数据进行排序。二、所用仪器、设备计算机、Visual C+软件。三、实验原理贪心算法解决背包问题有几种策略:(1)一种贪心准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这

    20、种策略不能保证得到最优解。例如,考虑n=2, w=100,10,10, p =20,15,15, c = 105。当利用价值贪婪准则时,获得的解为x= 1 , 0 , 0 ,这种方案的总价值为2 0。而最优解为 0 , 1 , 1 ,其总价值为3 0。(2)另一种方案是重量贪心准则是:从剩下的物品中选择可装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n= 2 ,w=10,20, p=5,100, c= 2 5。当利用重量贪婪策略时,获得的解为x =1,0,比最优解 0 , 1 要差。(3)还有一种贪心准则,就是我们教材上提到的,认为,

    21、每一项计算yi=vi/si,即该项值和大小的比,再按比值的降序来排序,从第一项开始装背包,然后是第二项,依次类推,尽可能的多放,直到装满背包。四、实验方法与步骤首先计算每种物品单位重量的价值Vi/Wi,然后依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超出C,则选择单位重量价值次高的物品,并尽可能多的装入背包。依此策略一直进行下去,直到背包装满为止。采用贪婪准则:每次选择p/w最大的物品放入背包。注意在这之前的计算每种物品单位重量的价值Vi/Wi后,进行排序。五、实验结果与数据处理实验截图:主要代码如下:#include #define M 4 struct node float no;/编号


    注意事项

    本文(算法设计实验报告讲解.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开