递归与分治算法设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容
算法描述
2.假币识别问题的解题思路或算法思想: 将这n个硬币分成两等份,然后放到天平的 两端,则假币在较轻的那一端; 然后将较轻的那一端的硬币再分成2等份, 然后再放到天平的两端进行比较,假币还 是在较轻的那一段; 直到最后只剩下两个硬币了,分别放到天 平的两端,轻的哪一个就是假币。 当然,最后也可能剩下3个硬币,我们可以 将这3个硬币中任意拿出来一个,然后将剩 下的两个放到天平的两端,如果天平是平 的,则说明拿出来的那个硬币就是假币; 如果天平不是平的,则轻的那一端是假 币。 1. 二分搜索问题的程序:
} public static void main(String[] args) { int []a = new int[]{2,3,4,5,6,8,9}; //0 1 2 3 4 5 6 Scanner scn = new Scanner(System.in); int x = scn.nextInt(); int m = new Digui().binarySearch(a, x,0,a.length-1); if(a[m]==x){ System.out.println("与x相等的数据元素的下 标是"+ m); }else{ System.out.println("不存在" + x); if(a[m]>x){ System.out.println("比x大的最小数组元素 的下标是" + m); if((m-1)<0){ System.out.println("不存在比x小的数组 元素"); } }else{ System.out.println("比x小的最大数组元素 的下标是" + m); if(m >= a.length-1){ System.out.println("不存在比x大的数组 元素"); }else{ System.out.println("比x大的最小数组元 素的下标是" + (m +1)); } } } }
算法设计与分析实验报告
专 姓 业 名 班 学 级 号
实验名称 实验目的
实验一:递归与分治算法设计 1.掌握递归与分治策略的基本思想。 2.通过设计求解给定问题的递归算法和分 治算法学会使用递归和分治法解决问题的 一般技巧。 1. 二分搜索问题: 设a[0:n-1]是已排好序的数组。试改写二 分搜索算法,使得当搜索元素x不在数组a 中时,返回小于x的最大元素的位置i和大 于x的最小元素的位置j;当搜索元素x在数 组a中时,返回x在数组中的位置,此时i和 j相同。 2. 假币识别问题: 一个袋子里有n个硬币,其中一枚是假币, 假币和真币外观一模一样,仅凭肉眼无法 区分,但是已知假币比真币轻一些。试设 计识别假币的分治算法。 1.二分搜索问题的解题思路或算法思想: 将n个元素分成个数大致相同的两半, 取a[n/2]与x进行比较。 如果x=a[n/2],则找到x算法终止, 如果x<x[n/2],则在数组的右边部分继续 搜索, 如果x<x[n/2],则在数组的左边部分继续 搜索。
package com.t1; import java.util.Scanner; public class Digui { public static int binarySearch (int a[],int x ,int left,int right){ int mid =0 ; while (left < right){ mid = (left + right)/2; if(a[mid]==x) return mid; if(a[mid]>x){ right = mid - 1; }else{ left = mid + 1; } } return left; }
程序及运行 结果
for ( int i = low; i <= low+(high-low)/2; i++ ) { sum1 = sum1 + coin[i]; } //后半段 for ( int i = low+(high-low)/2+1; i <= high; i++ ) { sum2 = sum2 + coin[i]; } if ( sum1 > sum2 ) { re = FalseCoin(coin, low, low+(highlow)/2); return re; } else if ( sum2 > sum1 ){//sum2 > sum1 re = FalseCoin(coin, low+(high-low)/2+1, high); return re; } } else {//如果是奇数 //前半段,除去中间的一个硬币 for ( int i = low; i <= low+(high-low)/2-1; i++ ){ sum1 = sum1 + coin[i]; } //后半段,除去中间的一个硬币 for ( int i = low+(high-low)/2+1; i <= high;i++ ) { sum2 = sum2 + coin[i]; } sum3 = coin[low+(high-low)/2]; if ( sum1 > sum2 ) { re = FalseCoin(coin, low, low+(highlow)/2-1); return re;
实例:
1)
2)
总结
实验心得体会: 通过该试验,我掌握递归与分治策略 的基本思想,并通过设计求解给定问题的 递归算法和分治算法,学会使用递归和分 治法解决问题的一般技巧。 改进意见: 应学会熟练使用递归和分治法解决该 问题,认真学习递归分治策略的思想,还 有就是多练习用分治来解决一些实际问题 对于更好地掌握分治是有很大帮助的。要 掌握它,我还要多练习写这方面的程序。 指导教师:
public static void main(String[] args) { int[] coin = new int[MAXNUM]; System.out.println("请输入硬币总的个数: "); Scanner in = new Scanner(System.in) ; int n = in.nextInt(); System.out.println("请输入所有硬币质量: "); for ( int i = 0; i < n; i++ ) { coin[i] = in.nextInt(); } int p = FalseCoin(coin, 0, n-1); System.out.println("假币在 " + p + "个位置 "); } }
} else if ( sum2 > sum1 ){ re = FalseCoin(coin, low+(high-low)/2+1, high); return re; } if ( sum1 == sum2 ) { re = low+(high-low)/2+1; return re; } } return re; }
实验成绩: 年 月 日
wk.baidu.com
实例:
1)
2)
3)
4)
2. 假币识别问题的程序:
package com.t3; //假币问题 import java.util.Scanner; public class Main { static final int MAXNUM = 20; private static int FalseCoin(int[] coin, int low, int high) { int sum1 = 0, sum2 = 0, sum3 = 0; int re = 0; if ( low+1 == high ) { if ( coin[low] < coin[high] ) { re = low+1; return re; }else { re = high+1; return re; } } if ( (high-low+1)%2 == 0 ) {//如果n是偶数 //前半段