中南大学算法实验汇总.docx
文本预览下载声明
算法分析与设计实验报告学院: 信息科学与工程学院专业班级: i got7指导老师: 学号: i got7 姓名: 鸟宝宝合并排序合并排序是分治法的应用,把需要排序的数组A[1 - n],一分为二A[1 -n/2]和A[n/2+1 - n],然后在对每一个子数组递归排序,接着再把这两个子数组合并成一个有序的数组。算法描述:第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾关键代码:privatestaticvoid Sort(int[] a, intleft, intright) {if(left=right)return;intmid = (left + right) / 2;Sort(a, left, mid);Sort(a, mid + 1, right);merge(a, left, mid, right); }privatestaticvoid merge(int[] a, intleft, intmid, intright) {int[] tmp = newint[a.length];intr1 = mid + 1;inttIndex = left;intcIndex=left;// 逐个归并while(left =mid r1 = right) {if (a[left] = a[r1]) tmp[tIndex++] = a[left++];elsetmp[tIndex++] = a[r1++]; }// 将左边剩余的归并while (left =mid) {tmp[tIndex++] = a[left++]; }// 将右边剩余的归并while ( r1 = right ) {tmp[tIndex++] = a[r1++]; } System.out.print( 第+(++number)+次排序: );//从临时数组拷贝到原数组while(cIndex=right){a[cIndex]=tmp[cIndex];//输出中间归并排序结果 System.out.print(a[cIndex]+ );cIndex++; } System.out.println(); }运行结果截屏:算法分析:合并排序满足分治法的基本公式T(n)=2T(n/2)+f(n)其中2T(n/2)是2个子问题求解,即对两个子数组排序;而f(n)是将子问题合起来求原始问题的解的代价,即将两个有序的子数组合并为一个有序的数组。在最终的合并阶段,键值的比较的代价,在最坏的情况下是n-1 ,(比如每个数组的第i号轮流被放入数组),根据主定理,T(n)=O(nlogn)。0-1背包问题问题描述:在0 / 1背包问题中,需对容量为W的背包进行装载。从n 个物品中选取装入背包的物品,每件物品j的重量为wj,价值为vi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。有3中方法可解:动态规划法:递推式: K(w,j)=max{K(w-wj, j-1)+vj, K(w,j-1)} w ≥ wj K(w,j)=K(w,j-1) w wj 初始条件: K(0,j)=0, K(w, 0)=0. 初始化条件表示把前面i个物品装入容量为0的背包和把0个物品装入容量为j的背包,得到的价值均为0。 第二个式子说明:如果第i个物品的重量大于背包的容量,则装入第i个物品得到的最大价值和装入第i-1个物品得到的最大价值是相同的,即物品i不能装入背包中。 第一个式子说明:如果第i个物品的重量小于背包的容量,则会有两种情况:(1)如果把第i个物品装入背包,则背包中物品的价值就等于把前i-1个物品装入容量为iwj?的背包中的价值加上第i个物品的价值iv; (2)如果第i个物品没有装入背包,则背包中物品的价值就是等于把前i-1个物品装入容量为j的背包中所取得的价值。 显然,取二者中价值较大者作为把前i个物品装入容量为j的背包中的最优解。w-wj…?w?Wj-1?K[w-wj,?j-1]K[w,j-1]jK[w,?j]n目标 构建的表格:时间复杂度为:O(nw)分支限界法:1.按单位价值对待处理的物品进行排序2.计算可行结点可获得的最大价值的上界
显示全部