算法设计与分析实验4报告(优选.)
- 格式:doc
- 大小:57.00 KB
- 文档页数:9
实验报告题目实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
二、实验内容设计一个递归和分治算法,找出数组的最大元素,找出x在数组A中出现的次数。
三、实验要求(1)用分治法求解…问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1.设计一个递归算法,找出数组的最大元素。
2.设计一个分治算法,找出x在数组A中出现的次数。
3.写一个主函数,调用上述算法。
五、实验结果分析(分析时空复杂性,设计测试用例及测试结果)时间复杂性:最好情况下,O(n)最坏情况下:O(nlog(n)空间复杂性分析:O(n)六、实验体会通过写递归与分治策略实验,更加清楚的知道它的运行机理,分治法解题的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
做实验重在动手动脑,还是要多写写实验,才是硬道理。
七、附录:(源代码)#include"stdio.h"#define ElemType intint count(ElemType a[],int i,int j,ElemType x){int k=0,mid; //k用来计数,记录数组中x出现的次数if(i==j){if(a[i]==x) k++;return k;}else{mid=(i+j)/2;k+=count(a,i,mid,x);k+=count(a,mid+1,j,x);}return k;}ElemType Maxitem(ElemType a[],int n){ElemType max=a[n-1],j;if(n==1){max=a[n-1];return max;}else{j=Maxitem(a,n-1);if(j>max) max=j;return max;}}void main(void){ElemType a[]={1,5,2,7,3,7,4,8,9,5,4,544,2,4,123};ElemType b;ElemType x;int n;b=Maxitem(a,15);printf("数组的最大元素为%d\n",b);printf("输入想要计数的数组元素:\n");scanf("%d",&x);n=count(a,0,14,x);printf("%d在数组中出现的次数为%d次\n",x,n);}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。
三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。
如果a>b则交换位置,如果a<b则不交换。
四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。
二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。
递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。
算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。
本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。
一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。
在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。
通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。
二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。
在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。
我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。
三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。
在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。
我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。
四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。
在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。
我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。
五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。
在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。
在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。
在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。
学号09710118《算法设计与分析》实验报告四学生姓名范振山专业、班级09计算机一班指导教师唐国峰成绩电子与信息工程系2012 年4 月6 日实验四:贪心算法运用练习一、实验目的本次实验是针对贪心算法的设计及应用练习,旨在加深学生对该部分知识点的理解,提高学生运用该部分知识解决问题的能力。
二、实验步骤与要求1.实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;2.学生独自完成实验指定内容;3.实验结束后,用统一的实验报告模板编写实验报告。
4.提交说明:(1)电子版提交说明:a 需要提交Winrar压缩包,文件名为“《算法设计与分析》实验四_学号_姓名”,如“《算法设计与分析》实验四_09290101_张三”。
b 压缩包内为一个“《算法设计与分析》实验四_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验报告电子版”。
其下分别放置对应实验成果物。
(2)打印版提交说明:a 不可随意更改模板样式。
b 字体:中文为宋体,大小为10号字,英文为Time New Roman,大小为10号字。
c 行间距:单倍行距。
(3)提交截止时间:2012年4月20日16:00。
三、实验项目请从下列题目列表中任选2道或3道题目,运用贪心算法对问题的进行求解。
备选题目列表如下:1.教材第106页所记述的0-1背包问题。
2.教材课后习题4-9;3.教材课后习题4-21。
四、实验过程(一)题目一:给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为c。
问如何选择装入背包中的物品,使得装入背包中物品的总价值最大?1.题目分析给定c>0;wi>0;vo>0,1≤i≤n,要求找出一个n元0-1向量(x1,x2,……xn),xi∈{0,1},1≤i ≤n,使得∑wixi≤c,而且∑vixi达到最大。
2.算法构造首先计算每种物品单位重量的价值vi.wi;然后,依贪心算法策略,将尽可能多的单位重量价值最高的物品装入背包。
计算机算法设计与分析实验报告专业:java 技术学号:541213440245 姓名:徐亚涛指导老师:谷培培实验一:棋盘覆盖(递归与分治策略)一、实验目的与要求1、明确棋盘覆盖的概念2、明确递归与分治策略的设计思路。
3、利用递归与分治策略解决棋盘覆盖问题。
二、实验题:问题描述:递归与分治策略算法,用4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
输入数据由程序运行后的界面中的编辑框中输入游戏规模,特殊方格的位置。
将覆盖的结果在窗口中显示出来。
三、实验代码package cn.ChessBoard;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;public class ChessBoards extends JFrame {private int tr, tc, dr, dc, size;//定义各成员变量int tile = 1;float red,green,blue;JPanel centerPanel;JPanel southPanel;JButton[][] button;JTextField TrText, TcText, DrText, DcText, SizeText;JLabel TrLabel, TcLabel, DrLabel, DcLabel, SizeLabel;JButton OKButton;JButton CancelButton;JPanel panel = new JPanel();public ChessBoards() {super();setTitle("棋盘覆盖");this.setResizable(false);centerPanel = new JPanel();southPanel = new JPanel();OKButton = new JButton("确定或开始");OKButton.addActionListener(new OKButtonAction()); CancelButton = new JButton("取消或清除"); CancelButton.addActionListener(new OKButtonAction()); setBounds(300, -10, 900, 900);//设置窗口大小与位置TrText = new JTextField("0",2);//定义各组件TcText = new JTextField("0",2);DrText = new JTextField("0",2);DcText = new JTextField("0",2);SizeText = new JTextField("4",2);TrLabel = new JLabel("起始方格坐标x: ");TcLabel = new JLabel("起始方格坐标y: "); DrLabel = new JLabel("特殊方格坐标x: "); DcLabel = new JLabel("特殊方格坐标y: "); SizeLabel = new JLabel("棋盘规模size: ");TrText.setEnabled(false);TcText.setEnabled(false);int tR = Integer.parseInt(TrText.getText());int tC = Integer.parseInt(TcText.getText());int dR = Integer.parseInt(DrText.getText());int dC = Integer.parseInt(DcText.getText());int Size = 1;for (int i=0;i<Integer.parseInt(SizeText.getText());i++) Size*=2;tr = tR;tc = tC;dr = dR;dc = dC;size = Size;southPanel.add(CancelButton);//添加各组件到窗体southPanel.add(TrLabel);southPanel.add(TrText);southPanel.add(TcLabel);southPanel.add(TcText);southPanel.add(DrLabel);southPanel.add(DrText);southPanel.add(DcLabel);southPanel.add(DcText);southPanel.add(SizeLabel);southPanel.add(SizeText);southPanel.add(OKButton);getContentPane().add(southPanel, BorderLayout.NORTH);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}class gridLayout {public gridLayout() {centerPanel.setLayout(new GridLayout(0, size));button = new JButton[size][size];for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {button[i][j] = new JButton();if (i == dr && j == dc) {button[i][j].setBackground(Color.BLUE);button[i][j].setText("<html><font size='2' color='white'>棋盘覆盖<br>Done By Java!</font></html>");button[i][j].setEnabled(false);}centerPanel.add(button[i][j]);}}}private void sleep(){for (int i=0;i<100;i++)for(int j=0;j<1000;j++);}public void ChessBoard(int tr, int tc, int dr, int dc, int size) {//算法实现if (size == 1) // 棋盘方格大小为1,说明递归到最里层return;int t = tile++;// 每次递增1Random rd = new Random();red=rd.nextFloat();green=rd.nextFloat();blue=rd.nextFloat();Color col = new Color(red,green,blue);sleep();int s = size / 2; // 棋盘中间的行、列号(相等的)// 检查特殊方块是否在左上角子棋盘中if (dr < tr + s && dc < tc + s) // 在ChessBoard(tr, tc, dr, dc, s);else // 不在,将该子棋盘右下角的方块视为特殊方块{button[tr + s - 1][tc + s - 1].setBackground(col);button[tr + s - 1][tc + s - 1].setEnabled(false);button[tr + s - 1][tc + s - 1].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);sleep();}// 检查特殊方块是否在右上角子棋盘中if (dr < tr + s && dc >= tc + s) // 在ChessBoard(tr, tc + s, dr, dc, s);else // 不在,将该子棋盘左下角的方块视为特殊方块{button[tr + s - 1][tc + s].setBackground(col);button[tr + s - 1][tc + s].setEnabled(false);button[tr + s - 1][tc + s ].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);sleep();}// 检查特殊方块是否在左下角子棋盘中if (dr >= tr + s && dc < tc + s) // 在ChessBoard(tr + s, tc, dr, dc, s);else // 不在,将该子棋盘右上角的方块视为特殊方块{button[tr + s][tc + s - 1].setBackground(col);button[tr + s][tc + s - 1].setEnabled(false);button[tr + s ][tc + s - 1].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);sleep();}// 检查特殊方块是否在右下角子棋盘中if (dr >= tr + s && dc >= tc + s) // 在ChessBoard(tr + s, tc + s, dr, dc, s);else // 不在,将该子棋盘左上角的方块视为特殊方块{button[tr + s][tc + s].setBackground(col);button[tr + s][tc + s].setEnabled(false);button[tr + s ][tc + s ].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr + s, tc + s, tr + s, tc + s, s);sleep();}}}public class OKButtonAction implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton whichButton = (JButton) e.getSource();String whichName = whichButton.getActionCommand();if(whichName.equals("开始")) {getContentPane().add(centerPanel, BorderLayout.CENTER);int tR = Integer.parseInt(TrText.getText());int tC = Integer.parseInt(TcText.getText());int dR = Integer.parseInt(DrText.getText());int dC = Integer.parseInt(DcText.getText());int Size = 1;for (int i=0;i<Integer.parseInt(SizeText.getText());i++)Size*=2;tr = tR;tc = tC;dr = dR;dc = dC;size = Size;try {gridLayout grid = new gridLayout();grid.ChessBoard(tr, tc, dr, dc, size);centerPanel.updateUI();} catch (Exception EX) {EX.printStackTrace();}panel.removeAll();OKButton.setEnabled(false);}if (whichName.equals("取消或清除")) {//当你点下一个提示按钮时的事件响应JLabel label = new JLabel();label.setHorizontalAlignment(JLabel.CENTER);label.setText("<html><Font size='+8',color='red'><center><b><br> 您取消了操作或是<br><Font size='+8',color='blue'><center>您清除了前一个棋盘……" +"<br><Font size='+8',color='green'><center>下面是关于题目的介绍<br><br><br><br><br><br> </b></Font></html>");// JLabel l = new JLabel("题目要求");JTextArea area = new JTextArea("在一个2k x 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同," +"称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目1.N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后,任何两个皇后不放在同一行同一列,同一斜线上,问有多少种放法。
2.主元素问题问题描述:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。
给出一个算法,判断A中是否存在主元素。
二、实验目的(1)通过N后问题的实现,体会拉斯维加斯随机算法的随机特点:运行次数随机但有界,找到的解一定为正确解。
但某次运行可能找不到解。
(2)通过实现主元素的不同算法,了解蒙特卡罗算法的随机特性:对于偏真的蒙特卡罗算法,找到为真的解一定是正确解;但非真的解以高概率给出解的正确率------即算法找到的非真解以小概率出现错误。
同时体会确定性算法与随机化算法的差异及各自的优缺点。
(3)通过跳跃表的实现,体会算法设计的运用的广泛性,算法设计的思想及技巧不拘泥独立问题的解决,而在任何需要计算机解决的问题中,都能通过算法设计的技巧(无论是确定性还是随机化算法)来灵巧地解决问题。
此实验表明,通过算法设计技巧与数据组织的有机结合,能够设计出高效的数据结构。
三、实验要求(1)N后问题分别以纯拉斯维加斯算法及拉斯维加斯算法+回溯法混合实现。
要求对同一组测试数据,完成如下任务a.输出纯拉斯维加斯算法找到解的运行次数及运行时间。
b.输出混合算法的stopVegas值及运行时间c.比较a、b的结果并分析N后问题的适用情况。
(2)主元素问题,要求对同一组测试数据,完成如下任务:a.若元素可以比较大小,请实现O(n )的确定性算法,并输出其运行时间。
b.(选做题)若元素不可以比较大小,只能比较相同否,请实现O(n) 确性算法,并输出其运行时间。
c.实现蒙特卡罗算法,并输出其运行次数及时间。
d.比较确定性算法与蒙特卡罗算法的性能,分析每种方法的优缺点。
(3)参照教材实现跳跃表(有序)及基本操作:插入一个结点,删除一个结点。
本科实验报告课程名称:算法设计与分析实验项目:递归与分治算法实验地点:计算机系实验楼110专业班级:物联网1601 学号:2016002105 学生:俞梦真指导教师:郝晓丽2018年05月04 日实验一递归与分治算法1.1 实验目的与要求1.进一步熟悉C/C++语言的集成开发环境;2.通过本实验加深对递归与分治策略的理解和运用。
1.2 实验课时2学时1.3 实验原理分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。
需要注意的是,分治法使用递归的思想。
划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。
最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。
1.4 实验题目1.上机题目:格雷码构造问题Gray码是一个长度为2n的序列。
序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。
试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。
对于给定的正整数n,格雷码为满足如下条件的一个编码序列。
(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2)序列中无相同的编码。
(3)序列中位置相邻的两个编码恰有一位不同。
2.设计思想:根据格雷码的性质,找到他的规律,可发现,1位是0 1。
两位是00 01 11 10。
三位是000 001 011010 110 111 101 100。
n位是前n-1位的2倍个。
N-1个位前面加0,N-2为倒转再前面再加1。
3.代码设计:}}}int main(){int n;while(cin>>n){get_grad(n);for(int i=0;i<My_grad.size();i++)cout<<My_grad[i]<<endl;My_grad.clear();}return 0;}运行结果:1.5 思考题(1)递归的关键问题在哪里?答:1.递归式,就是如何将原问题划分成子问题。
《算法分析与设计》实验报告专业:计科班级:日期:2016/04/11 成绩:学生姓名:学号:指导老师:实验单元三贪心算法一、实验题目实验二哈弗曼树二、实验目的了解前缀编码的概念,掌握最优子结构性质的证明方法;掌握贪心算法的设计思想并能熟练运用。
三、实验内容设需要编码的字符集为{d1, d2, •, dn},它们出现的频率为{w1, w2, •, wn},应用哈弗曼树构造最短的编码。
哈弗曼编码的基本思想是:在集合中选择两颗根节点的权值最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根节点的权值为其左、右子树上根节点的权值之和;随后删除这两颗树,同时将新得到的二叉树加入F 中。
不断重复,最后直到剩下一棵树,这棵树便是哈弗曼树。
四、实验结果(代码及运行结果)实验源代码:#include <stdio.h>#include <string.h>#include <time.h>#include <stdlib.h>typedef struct Node // 定义树结构{int data;struct Node *leftchild;struct Node *rightchild;} Tree;typedef struct Data // 定义字符及其对应的频率的结构{int data; // 字符对应的频率是随机产生的char c;};void Initiate(Tree **root); // 初始化节点函数int getDataMin(struct Data a[],int n); // 得到数组 a 中数值(频率)最小的数void toLength(char s[],int k); // 设置有 k 个空格的串 svoid set(struct Data a[],struct Data b[]); // 初始化数组 a,且将 a 备份至 bchar getCharhar(int x,struct Data a[]); // 得到 a 中频率为 x 对应的字符void print(struct Data a[]); // 输出初始化后的字符及对应的频率int n;int main() // 入口函数{Tree *root = NULL,*left = NULL,*right = NULL,*p = NULL;int min,num;int k = 30,j,m;struct Data a[100];struct Data b[100];int i;char s[100] = {'\0'},s1[100] = {'\0'};char c;set(a,b);print(a);Initiate(&root);Initiate(&left);Initiate(&right);Initiate(&p);//设置最底层的左节点min = getDataMin(a,n);left->data = min;left->leftchild = NULL;left->rightchild = NULL;//设置最底层的右节点min = getDataMin(a,n-1);right->data = min;right->leftchild = NULL;right->rightchild = NULL;root->data = left->data+right->data;Initiate(&root->leftchild);Initiate(&root->rightchild);//将设置好的左右节点插入到root中root->leftchild = left;root->rightchild = right;for(i = 0; i<n-2; i++){min = getDataMin(a,n-2-i);Initiate(&left);Initiate(&right);if(min<root->data)//权值小的作为左节点{left->data = min;left->leftchild = NULL;left->rightchild = NULL;p->data = min+root->data;Initiate(&p->leftchild);Initiate(&p->rightchild);p->leftchild = left;p->rightchild = root;root = p;}else{right->data = min;right->leftchild = NULL;right->rightchild = NULL;p->data = min+root->data;Initiate(&p->leftchild);Initiate(&p->rightchild);p->leftchild = root;p->rightchild = right;root = p;}Initiate(&p);}num = n-1;p = root;printtf("哈夫曼树:\n");while(num) // 输出建立的 Huffman 图{if(num == n-1){for(j = 0; j<k-3; j++)printtf(" ");printtf("%d\n",root->data);}for(j = 0; j<k-4; j++)printtf(" ");printtf("/ \\\n");for(j = 0; j<k-5; j++)printtf(" ");printtf("%d",root->leftchild->data);printtf(" %d\n",root->rightchild->data); if(root->leftchild->leftchild!= NULL){root = root->leftchild;k = k-2;}{root = root->rightchild;k = k+3;}num--;}num = n-1;Initiate(&root);root = p;printtf("字符编码:\n");while(num){if(root->leftchild->leftchild == NULL){strcpy(s1,s);m = root->leftchild->data;c = getChar(m,b);printtf("%c 【%d】:%s\n",c,m,strcat(s1,"0")); }if(root->rightchild->leftchild == NULL){strcpy(s1,s);m = root->rightchild->data;c = getChar(m,b);printtf("%c 【%d】:%s\n",c,m,strcat(s1,"1")); }if(root->leftchild->leftchild!= NULL){strcat(s,"0");root = root->leftchild;}if(root->rightchild->leftchild!= NULL){strcat(s,"1");root = root->rightchild;}num--;}return 0;}int getDataMin(struct Data a[],int n){int i,t;for(i = 1; i<n; i++)if(a[i].data<a[0].data){t = a[i].data;a[i].data = a[0].data;a[0].data = t;}}t = a[0].data;for(i = 0; i<n-1; i++){a[i] = a[i+1];}return t;}void toLength(char s[],int k) // 输出空格{int i = 0;for(; i<k; i++)strcat(s," "); // strcat()字符串连接函数}void Initiate(Tree **root) // 初始化函数{*root = (Tree *)malloc(sizeof(Tree));(*root)->leftchild = NULL;(*root)->rightchild = NULL;}void set(struct Data a[],struct Data b[]){int i;srand((unsigned)time(NULL)); // 生成随机数n = rand()%10+2;for(i = 0; i<n; i++){a[i].data = rand()%100+1;a[i].c = i+97;b[i].data = a[i].data;b[i].c = a[i].c;if(i >= 0&&a[i].data == a[i-1].data)i--;}}char getChar(int x,struct Data b[]){for(i = 0; i<n; i++){if(b[i].data == x){break;}}return b[i].c;}void print(struct Data a[]) // 打印函数{int i;printtf("字符\t 出现的频率\n");for(i = 0; i<n; i++){printtf("%c\t %d\n",a[i].c,a[i].data);}}运行结果为:五、实验体会哈夫曼编码算法:每次将集合中两个权值最小的二叉树合并成一棵新二叉树,n-1次合并后,成为最终的一棵哈夫曼树。