实验3. 贪心算法
实验三-贪心算法

for(inti=0;i<s.length();i++){
buf.append(getEachCode(s.substring(i,i+1)));
}
returnbuf.toString();
}
publicString getEachCode(String name){
for(inti=0;i<buffer.length();i++){
if(name.equals(codes[i].name)){
returnhuffstring[i];
}
}
return"";
}
publicvoidgetCode(intn,String[] thecodes,String thebuffer){
importjava.util.Scanner;
classHuffmanCode{
Stringname;
doubleweight;
intlc,rc,pa;
publicHuffmanCode(){
name="";
weight=0;
lc=-1;rc=-1;pa=-1;
}
}
publicclassHuffman1 {
dist[j]=newdist;prev[j]=u;}}}}
(3)运行结果
3、题目三
(1)问题分析
设G=(V,E)是连通带权图,V={1,2,…,n}。构造G的最小生成树的Prim算法的基本思想是:首先置S{1},然后,只要S是V的真子集,就进行如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。过程中所取到的边恰好构成G的一棵最小生成树。
实验3贪心算法(定稿)

实验3贪心算法(定稿)第一篇:实验3 贪心算法(定稿)《算法设计与分析》实验报告实验3贪心算法姓名学号班级实验日期实验地点一、实验目的1、掌握贪心算法的设计思想。
2、理解最小生成树的相关概念。
二、实验环境1、硬件环境 CPU:酷睿i5 内存:4GB 硬盘:1T2、软件环境操作系统:Windows10 编程环境:jdk 编程语言:Java三、实验内容:在Prim算法与Kruskal算法中任选一种求解最小生成树问题。
1、你选择的是:Prim算法2、数据结构(1)图的数据结构——图结构是研究数据元素之间的多对多的关系。
在这种结构中,任意两个元素之间可能存在关系,即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图形结构——多个对多个,如(2)树的数据结构——树结构是研究数据元素之间的一对多的关系。
在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系。
树形结构——一个对多个,如3、算法伪代码 Prim(G,E,W)输入:连通图G 输出:G的最小生成树T 1.S←{1};T=∅ 2.While V-S ≠∅ do3.从V-S中选择j使得j到S中顶点的边e的权最小;T←T∪{e}4.S←S∪{j}3、算法分析时间复杂度:O(n)空间复杂度:O(n^2)4、关键代码(含注释)package Prim;import java.util.*;publicclass Main { staticintMAXCOST=Integer.MAX_VALUE;staticint Prim(intgraph[][], intn){ /* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */ intlowcost[]=newint[n+1];/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */ intmst[]=newint[n+1];intmin, minid, sum = 0;/* 默认选择1号节点加入生成树,从2号节点开始初始化*/ for(inti = 2;i<= n;i++){/* 标记1号节点加入生成树 */ mst[1] = 0;/* n个节点至少需要n-1条边构成最小生成树 */ for(inti = 2;i<= n;i++){/* 找满足条件的最小权值边的节点minid */ for(intj = 2;j<= n;j++){/* 输出生成树边的信息:起点,终点,权值 */System.out.printf(“%c1, minid + 'A''A' + 1;intj = chy-'A' + 1;graph[i][j] = cost;graph[j][i] = cost;for(intj = 1;j<= n;j++){ } graph[i][j] = MAXCOST;} } System.out.println(”Total:"+cost);} }5、实验结果(1)输入(2)输出最小生成树的权值为:生成过程:(a)(b)(d)(e)(c)四、实验总结(心得体会、需要注意的问题等)这次实验,使我受益匪浅。
贪心算法 实验报告

贪心算法实验报告贪心算法实验报告引言:贪心算法是一种常用的算法设计策略,它通常用于求解最优化问题。
贪心算法的核心思想是在每一步选择中都选择当前最优的解,从而希望最终能够得到全局最优解。
本实验旨在通过实际案例的研究,探索贪心算法的应用和效果。
一、贪心算法的基本原理贪心算法的基本原理是每一步都选择当前最优解,而不考虑整体的最优解。
这种贪婪的选择策略通常是基于局部最优性的假设,即当前的选择对于后续步骤的选择没有影响。
贪心算法的优点是简单高效,但也存在一定的局限性。
二、实验案例:零钱兑换问题在本实验中,我们以零钱兑换问题为例,来说明贪心算法的应用。
问题描述:假设有不同面值的硬币,如1元、5元、10元、50元和100元,现在需要支付给客户x元,如何用最少的硬币数完成支付?解决思路:贪心算法可以通过每次选择当前面值最大的硬币来求解。
具体步骤如下:1. 初始化一个空的硬币集合,用于存放选出的硬币。
2. 从面值最大的硬币开始,如果当前硬币的面值小于等于待支付金额,则将该硬币放入集合中,并将待支付金额减去该硬币的面值。
3. 重复步骤2,直到待支付金额为0。
实验过程:以支付金额为36元为例,我们可以通过贪心算法求解最少硬币数。
首先,面值最大的硬币为100元,但36元不足以支付100元硬币,因此我们选择50元硬币。
此时,剩余待支付金额为36-50=-14元。
接下来,面值最大的硬币为50元,但待支付金额为负数,因此我们选择下一个面值最大的硬币,即10元硬币。
此时,剩余待支付金额为-14-10=-24元。
继续选择10元硬币,剩余待支付金额为-24-10=-34元。
再次选择10元硬币,剩余待支付金额为-34-10=-44元。
最后,选择5元硬币,剩余待支付金额为-44-5=-49元。
由于待支付金额已经为负数,我们无法继续选择硬币。
此时,集合中的硬币数为1个50元和3个10元,总共4个硬币。
实验结果:通过贪心算法,我们得到了36元支付所需的最少硬币数为4个。
实验3贪心算法和回溯法

实验3 贪心算法和回溯法一、实验目的1. 理解最小生成树算法——Prim算法和Kruskal算法的基本思想,学会编程实现这两种算法;2. 理解并查集的特点与适用环境,学会使用并查集解决常见的问题;3. 理解单源最短路径算法——Dijkstra算法的基本思想,学会编程实现Dijkstra算法;4. 理解回溯法的基本思想,学会使用回溯法解决常见的问题。
二、实验内容1. 编程实现Prim算法。
输入:顶点编号及边权重。
例:0 1 100 2 151 2 50输出:最小生成树。
例:0 1 100 2 152. 在某个城市里住着n个人,现在给定关于这n个人的m条信息(即某2个人认识)。
假设所有认识的人一定属于同一个单位,请计算该城市最多有多少单位?输入:第1行的第1个值表示总人数,第2个值表示总信息数;第2行开始为具体的认识关系信息。
例:10 42 34 54 85 8输出:单位个数。
例:73. 编程实现Kruskal算法。
输入:顶点编号及边权重。
例:0 1 100 2 151 2 50输出:最小生成树。
例:0 1 100 2 154. 编程实现Dijkstra算法。
输入:第1行第1个值表示顶点个数,第2个值表示边个数;第2行开始为边权重。
例:5 70 1 100 3 300 4 1001 2 502 4 103 2 203 4 60输出:顶点0到每一个顶点的最短路径长度。
例:0 10 50 30 605. 使用回溯法求解N皇后问题。
输入:皇后的个数。
例:4输出:每一个方案及总方案数。
例:0 1 0 00 0 0 23 0 0 00 0 4 0----------------0 0 1 02 0 0 00 0 0 30 4 0 0----------------总方案数为2。
6. 使用回溯法求解0-1背包问题。
输入:两个一维数组分别存储每一种物品的价值和重量,以及一个整数表示背包的总重量。
例:价值数组v[] = {6,3,6,5,4},重量数组w[] = {2,2,4,6,5},背包重量C=10。
贪心算法背包问题

题目:贪心算法
背包问题
专业:JAVA 技术 09——02 班 学号:540913100201 姓名:柏顺顺 指导老师:宋胜利
实验三:贪心算法
一、实验目的与要求
1、掌握背包问题的算法 2、初步掌握贪心算法
背包问题
二、实验题:
问题描述:与 0-1 背包问题相似,给定 n 种物品和一个背包。物品 i 的重量是 wi,其价 值为 vi,背包的容量为 c。与 0-1 背包问题不同的是,在选择物品 i 装入背包时,背包问题 的解决可以选择物品 i 的一部分,而不一定要全部装入背包,1< i < n。
JOptionPane.showMessageDialog(null, "重量不能为空!"); return; } else{ if (s1.equals("")){ JOptionPane.showMessageDialog(null, "效益值不能为空!"); return; }else { if (s3.equals("")) JOptionPane.showMessageDialog(null, "总重量不能为空!"); return; } } } catch (Exception e3) { // TODO: handle exception }
}
//可以执行贪心算法了 int [] wCopy = new int [w.length]; int [] pCopy = new int [w.length]; float temp2; int temp1; float totalx=0; float [] x = new float [w.length];//效益和重量的比值 float [] n =new float[w.length];//记录个数 float [] nCopy = new float[w.length]; for(int i=0;i<w.length;i++) { wCopy [i] = w[i]; pCopy [i] = p[i]; } for (int i=0;i<w.length;i++) x[i] = (float) ((p[i]*1.0)/w[i]); for(int i= 0;i<w.length;i++) for(int j=i+1;j<w.length;j++)
《算法导论》贪心算法实验指导书(二)

《算法导论》贪心算法实验指导书(二)
《算法导论》实验指导书
本书共分阶段4个实验,每个实验有基本题和提高题。
基本题必须完成,提高题根据自己实际情况进行取舍。
题目不限定如下题目,可根据自己兴趣爱好做一些与实验内容相关的其他题目,如动态规划法中的图象压缩,回溯法中的人机对弈等。
其具体要求和步骤如下:
实验三贪心算法(4学时)
一、实验要求与目的
1、熟悉贪心算法的基本原理与适用范围。
2、使用贪心算法编程,求解最小生成树问题。
二、实验内容
1、任选一种贪心算法(Prim或Kruskal),求解最小生成树。
对算法进行描述和复杂性分析。
编程实现,并给出测试实例
一、实验要求与目的
3、熟悉贪心算法的基本原理与适用范围。
4、使用贪心算法编程,求解霍夫曼编码问题。
二、实验内容
2、采用贪心算法,求解霍夫曼编码。
对算法进行描述和复杂性分析。
编程实现,并给出测试实例
一、实验目的与要求
1、掌握汽车加油问题的算法;
2、进一步掌握贪心算法;
二、实验题
一辆汽车加满油后可以行驶N千米。
旅途中有若干个加油站。
若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。
并证明你的算法能产生一个最优解。
三、实验提示
把两加油站的距离放在数组中,a[1..n]表示从起始位置开始跑,经过n个加油站,a[k]表示第k-1个加油站到第k个加油站的距离。
汽车在运行的过程中如果能跑到下一个站则不加油,否则要加油。
(算法略)。
算法实验报告贪心

一、实验背景贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。
贪心算法并不保证能获得最优解,但往往能获得较好的近似解。
在许多实际应用中,贪心算法因其简单、高效的特点而被广泛应用。
本实验旨在通过编写贪心算法程序,解决经典的最小生成树问题,并分析贪心算法的优缺点。
二、实验目的1. 理解贪心算法的基本原理和应用场景;2. 掌握贪心算法的编程实现方法;3. 分析贪心算法的优缺点,并尝试改进;4. 比较贪心算法与其他算法在解决最小生成树问题上的性能。
三、实验内容1. 最小生成树问题最小生成树问题是指:给定一个加权无向图,找到一棵树,使得这棵树包含所有顶点,且树的总权值最小。
2. 贪心算法求解最小生成树贪心算法求解最小生成树的方法是:从任意一个顶点开始,每次选择与当前已选顶点距离最近的顶点,将其加入生成树中,直到所有顶点都被包含在生成树中。
3. 算法实现(1)数据结构- 图的表示:邻接矩阵- 顶点集合:V- 边集合:E- 已选顶点集合:selected- 最小生成树集合:mst(2)贪心算法实现```def greedy_mst(graph):V = set(graph.keys()) # 顶点集合selected = set() # 已选顶点集合mst = set() # 最小生成树集合for i in V:selected.add(i)mst.add((i, graph[i]))while len(selected) < len(V):min_edge = Nonefor edge in mst:u, v = edgeif v not in selected and (min_edge is None or graph[u][v] < graph[min_edge[0]][min_edge[1]]):min_edge = edgeselected.add(min_edge[1])mst.add(min_edge)return mst```4. 性能分析为了比较贪心算法与其他算法在解决最小生成树问题上的性能,我们可以采用以下两种算法:(1)Prim算法:从任意一个顶点开始,逐步添加边,直到所有顶点都被包含在生成树中。
算法分析与设计实验三贪心算法

实验三贪心算法实验目的1. 掌握贪心法的基本思想方法;2. 了解适用于用贪心法求解的问题类型,并能设计相应贪心法算法;3. 掌握贪心算法复杂性分析方法分析问题复杂性。
预习与实验要求1. 预习实验指导书及教材的有关内容,掌握贪心法的基本思想;2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3. 认真听讲,服从安排,独立思考并完成实验。
实验设备与器材硬件:PC机软件:C++或Java等编程环境实验原理有一类问题是要从所有的允许解中求出最优解,其策略之一是“贪心法”,即逐次实施“贪心选择”:在每个选择步骤上做出的选择都是当前状态下最优的。
贪心选择依赖于在此之前所做出的选择,但不依赖于后续步骤所需要的选择,即不依赖于后续待求解子问题。
显然,这种选择方法是局部最优的,但不是从问题求解的整体考虑进行选择,因此不能保证最后所得一定是最优解。
贪心法是求解问题的一种有效方法,所得到的结果如果不是最优的,通常也是近似最优的。
实验内容以下几个问题选做一项:1. 用贪心法实现带有期限作业排序的快速算法应用贪心设计策略来解决操作系统中单机、无资源约束且每个作业可在等量时间内完成的作业调度问题。
假定只能在一台机器上处理N个作业,每个作业均可在单位时间内完成;又假定每个作业i都有一个截止期限di>0(它是整数),当且仅当作业i在它的期限截止以前被完成时,则获得pi的效益。
这个问题的一个可行解是这N个作业的一个子集合J,J中的每个作业都能在各自的截止期限之前完成。
可行解的效益值是J中这些作业的效益之和,即Σp。
具有最大效益值的可行解就是最优解。
2. 实现K元归并树贪心算法两个分别包含n个和m个记录的已分类文件可以在O(n+m)时间内归并在一起而得到一个分类文件。
当要把两个以上的已分类文件归并在一起时,可以通过成对地重复归并已分类的文件来完成。
例如:假定X1,X2,X3,X4是要归并的文件,则可以首先把X1和X2归并成文件Y1,然后将Y1和X3归并成Y2,最后将Y2和X4归并,从而得到想要的分类文件;也可以先把X1和X2归并成Y1,然后将X3和X4归并成Y2,最后归并Y1和Y2而得到想要的分类文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3.贪心算法一、实验目的1.理解贪心算法的基本思想。
2.运用贪心算法解决实际问题。
二、实验环境与地点1.实验环境:Windows7,Eclipse2.实验地点:网络工程实验室三、实验内容与步骤编写程序完成下列题目,上机调试并运行成功。
1.活动安排问题。
问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:将此表数据作为实现该算法的测试数据。
(1)给出算法基本思想;(2)给出用java语言实现程序的代码;算法:public static int greedySelector(int[] s, int[] f, boolean a[]) {int n = s.length - 1;a[1] = true;int j = 1;int count = 1;for (int i = 2; i <= n; i++) {if (s[i] >= f[j]) {a[i] = true;j = i;count++;} elsea[i] = false;}return count;}2.哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。
统计字符串中各个字符出现的频率,求各个字符的哈夫曼编码方案。
输入:good good study,day day up输出:各字符的哈夫曼编码。
算法:算法中用到的类Huffman定义为:private static class Huffman implements Comparable {Bintree tree;float weight;// 权值private Huffman(Bintree tt, float ww) {tree = tt;weight = ww;}public int compareTo(Object x) {float xw = ((Huffman) x).weight;if (weight < xw)return -1;if (weight == xw)return 0;return 1;}}算法huffmanTree描述如下:public static Bintree huffmanTree(float[] f) {// 生成单结点树int n = f.length;Huffman[] w = new Huffman[n + 1];Bintree zero = new Bintree();for (int i = 0; i < n; i++) {Bintree x = new Bintree();x.makeTree(new MyInteger(i), zero, zero);w[i + 1] = new Huffman(x, f[i]);}// 建优先队列MinHeap H = new MinHeap();H.initialize(w, n);// 反复合并最小频率树for (int i = 1; i < n; i++) {Huffman x = (Huffman) H.removeMin();Huffman y = (Huffman) H.removeMin();Bintree z = new Bintree();z.makeTree(null, x.tree, y.tree);Huffman t = new Huffman(z, x.weight + y.weight);H.put(t);}return ((Huffman) H.removeMin()).tree;}提示:统计一个字符串中每个字符出现的次数思路:1.创建一个map key:出现的字符value:出现的次数2.获取字符串中的每一个字符3.查看字符是否在Map中作为key存在否,若存在,说明已经统计过则value+1 不存在:value=1代码如下:public class CountString {public static void main(String[] args) {String str = "good good study,day day up";Map<Character, Integer> map = new HashMap<Character, Integer>();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 用toCharArray()也可以if (map.containsKey(c)) {// 若统计过map.put(c, map.get(c) + 1);} else {map.put(c, 1);}}System.out.println(map);}}四、实验总结与分析参考代码:1.ActivityArrangementpublic class AvtivityArrangement {public static int[] s= { 0,1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};public static int[] f= { 0,4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};public static boolean[] a=new boolean[s.length];public static int greedySelector(int[] s, int[] f, boolean[] a) {int n = s.length - 1;a[1] = true;int j = 1;int count = 1;for (int i = 2; i <= n; i++) {if (s[i] >= f[j]) {a[i] = true;j = i;count++;} elsea[i] = false;}return count;}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.print("相容活动共有:"+greedySelector(s, f, a)+"个:");for (int i = 1; i < a.length; i++) {if (a[i]) {System.out.print(i+" ");}}}}2.Huffmanpublic class BtNode {Object data;BtNode lChild;BtNode rChild;public BtNode() {// 构造一个空节点this(null);}public BtNode(Object data) {// 构造左右孩子域为空的节点this(data,null,null);}public BtNode(Object data, BtNode lchild, BtNode rchild) {// TODO Auto-generated constructor stubthis.data=data;this.lChild=lchild;this.rChild=rchild;}}public class Bintree {BtNode root;public Bintree() {root=null;}public Bintree(BtNode root) {this.root=root;}public Bintree(Object data, BtNode lchild, BtNode rchild) { BtNode node=new BtNode(data, lchild, rchild);this.root=node;}}import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.PriorityQueue;import java.util.Scanner;public class Huffman implements Comparable {Bintree tree;float weight;// 权值public static Object[]c;private Huffman(Bintree tt, float ww) {tree = tt;weight = ww;}public int compareTo(Object x) {float xw = ((Huffman) x).weight;if (weight < xw)return -1;if (weight == xw)return 0;return 1;}public static Bintree huffmanTree(int[] f) {// 生成单结点树int n = f.length;Huffman[] w = new Huffman[n ];Bintree zero = new Bintree();for (int i = 0; i < n; i++) {Bintree x = new Bintree(new Integer(i),null, null );//null, nullw[i] = new Huffman(x, f[i]);}// 建优先队列List list=Arrays.asList(w);PriorityQueue H = new PriorityQueue(list);System.out.println(H);//* 反复合并最小频率树*/for (int i = 1; i < n; i++) {Huffman x = (Huffman) H.poll();Huffman y = (Huffman) H.poll();Bintree z = new Bintree(null, x.tree.root, y.tree.root);Huffman t = new Huffman(z, x.weight + y.weight);H.offer(t);}return ((Huffman) H.poll()).tree;}public static void CountString(String str ,Map<Character, Integer> map) { for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 用toCharArray()也可以if (map.containsKey(c)) {// 若统计过map.put(c, map.get(c) + 1);} else {map.put(c, 1);}}System.out.println(map);}public static void main(String[] args) {Map<Character, Integer> map = new HashMap<Character, Integer>();Scanner scanner=new Scanner(System.in);String string=scanner.nextLine();//输入字符串CountString(string ,map);//统计输入字符串的字符频率//得到字符数组和对应的频率数组c=map.keySet().toArray();int []f=new int[c.length];for (int i = 0; i < c.length; i++) {f[i]=map.get(c[i]);System.out.println(c[i]+":"+f[i]);}//创建huffman树Bintree huf=huffmanTree(f);//输出huffman编码String str="";traverseHuf(huf.root,str);}private static void traverseHuf(BtNode huf,String string) {String str1=""+string;if (huf.lChild==null) {System.out.println(c[(int) huf.data]+":"+str1);}else {traverseHuf( huf.lChild,str1+"0");traverseHuf( huf.rChild,str1+"1");}}}运行结果:good{d=1, g=1, o=2}o:0d:10g:11。