数据结构 实验三 题目二:哈夫曼树
数据结构(C语言版)实验报告(哈夫曼树)

《数据结构与算法》实验报告一、需求分析1.问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工通道(及可以双向传输信息的通道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼的编/译码系统。
2.基本要求一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:编码(Encoding)。
利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5)T:印哈夫曼树(Tree printing)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示出,同时将此字符形式的哈夫曼树写入文件TreePrint中。
3.测试数据(1)利用教科书例6-2中的数据调试程序。
(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
4,实现提示(1)编码结果以文本方式存储在文件CodeFile中。
(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”表示退出运行Quit。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。
(3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。
北邮数据结构实验3哈夫曼编码

数据结构实验报告实验名称:实验3——哈夫曼编码学生姓名:班级:班内序号:学号:日期:2013年11月24日1.实验要求利用二叉树结构实现赫夫曼编/解码器。
基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析2.1存储结构:struct HNode{char c;//存字符内容int weight;int lchild, rchild, parent;};struct HCode{char data;char code[100];}; //字符及其编码结构class Huffman{private:HNode* huffTree; //Huffman树HCode* HCodeTable; //Huffman编码表public:Huffman(void);void CreateHTree(int a[], int n); //创建huffman树void CreateCodeTable(char b[], int n); //创建编码表void Encode(char *s, string *d); //编码void Decode(char *s, char *d); //解码void differ(char *,int n);char str2[100];//数组中不同的字符组成的串int dif;//str2[]的大小~Huffman(void);};结点结构为如下所示:三叉树的节点结构:struct HNode//哈夫曼树结点的结构体{ int weight;//结点权值int parent;//双亲指针int lchild;//左孩子指针int rchild;//右孩子指针char data;//字符};示意图为:int weight int parent int lchild int rchild Char c 编码表节点结构:struct HCode//编码表结构体{char data;//字符char code[100];//编码内容};示意图为:基本结构体记录字符和出现次数:struct node{int num;char data;};示意图为:2.关键算法分析(1).初始化:伪代码:1.输入需要编译的文本内容2.将输入的内容保存到数组str1中3.统计出现的字符数目,并且保存到变量count中4.统计出现的不同的字符,存到str2中,将str2的大小存到dif中时间复杂度O(n!)(2).创建哈夫曼树算法伪代码:1.创建一个长度为2*n-1的三叉链表2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前n个结点的data域,并将对应结点的孩子域和双亲域赋为空3.从三叉链表的第n个结点开始,3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其下标x,y。
数据结构哈夫曼编码实验报告

数据结构哈夫曼编码实验报告数据结构哈夫曼编码实验报告1·实验目的1·1 理解哈夫曼编码的基本原理1·2 掌握哈夫曼编码的算法实现方式1·3 熟悉哈夫曼编码在数据压缩中的应用2·实验背景2·1 哈夫曼编码的概念和作用2·2 哈夫曼编码的原理和算法2·3 哈夫曼编码在数据压缩中的应用3·实验环境3·1 硬件环境:计算机、CPU、内存等3·2 软件环境:编程语言、编译器等4·实验过程4·1 构建哈夫曼树4·1·1 哈夫曼树的构建原理4·1·2 哈夫曼树的构建算法4·2 哈夫曼编码4·2·1 哈夫曼编码的原理4·2·2 哈夫曼编码的算法4·3 实现数据压缩4·3·1 数据压缩的概念和作用4·3·2 哈夫曼编码在数据压缩中的应用方法5·实验结果5·1 构建的哈夫曼树示例图5·2 哈夫曼编码表5·3 数据压缩前后的文件大小对比5·4 数据解压缩的正确性验证6·实验分析6·1 哈夫曼编码的优点和应用场景分析6·2 数据压缩效果的评估和对比分析6·3 实验中遇到的问题和解决方法7·实验总结7·1 实验所获得的成果和收获7·2 实验中存在的不足和改进方向7·3 实验对于数据结构学习的启示和意义附件列表:1·实验所用的源代码文件2·实验中用到的测试数据文件注释:1·哈夫曼编码:一种用于数据压缩的编码方法,根据字符出现频率构建树形结构,实现高频字符用较短编码表示,低频字符用较长编码表示。
2·哈夫曼树:由哈夫曼编码算法构建的一种特殊的二叉树,用于表示字符编码的结构。
哈夫曼树_实验报告

一、实验目的1. 理解哈夫曼树的概念及其在数据结构中的应用。
2. 掌握哈夫曼树的构建方法。
3. 学习哈夫曼编码的原理及其在数据压缩中的应用。
4. 提高编程能力,实现哈夫曼树和哈夫曼编码的相关功能。
二、实验原理哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树,又称为最优二叉树。
其构建方法如下:1. 将所有待编码的字符按照其出现的频率排序,频率低的排在前面。
2. 选择两个频率最低的字符,构造一棵新的二叉树,这两个字符分别作为左右子节点。
3. 计算新二叉树的频率,将新二叉树插入到排序后的字符列表中。
4. 重复步骤2和3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。
哈夫曼编码是一种基于哈夫曼树的编码方法,其原理如下:1. 从哈夫曼树的根节点开始,向左子树走表示0,向右子树走表示1。
2. 每个叶子节点对应一个字符,记录从根节点到叶子节点的路径,即为该字符的哈夫曼编码。
三、实验内容1. 实现哈夫曼树的构建。
2. 实现哈夫曼编码和译码功能。
3. 测试实验结果。
四、实验步骤1. 创建一个字符数组,包含待编码的字符。
2. 创建一个数组,用于存储每个字符的频率。
3. 对字符和频率进行排序。
4. 构建哈夫曼树,根据排序后的字符和频率,按照哈夫曼树的构建方法,将字符和频率插入到哈夫曼树中。
5. 实现哈夫曼编码功能,遍历哈夫曼树,记录从根节点到叶子节点的路径,即为每个字符的哈夫曼编码。
6. 实现哈夫曼译码功能,根据哈夫曼编码,从根节点开始,按照0和1的路径,找到对应的叶子节点,即为解码后的字符。
7. 测试实验结果,验证哈夫曼编码和译码的正确性。
五、实验结果与分析1. 构建哈夫曼树根据实验数据,构建的哈夫曼树如下:```A/ \B C/ \ / \D E F G```其中,A、B、C、D、E、F、G分别代表待编码的字符。
2. 哈夫曼编码根据哈夫曼树,得到以下字符的哈夫曼编码:- A: 00- B: 01- C: 10- D: 11- E: 100- F: 101- G: 1103. 哈夫曼译码根据哈夫曼编码,对以下编码进行译码:- 00101110111译码结果为:BACGACG4. 实验结果分析通过实验,验证了哈夫曼树和哈夫曼编码的正确性。
数据结构 哈夫曼编码实验报告

数据结构哈夫曼编码实验报告数据结构哈夫曼编码实验报告1. 实验目的本实验旨在通过实践理解哈夫曼编码的原理和实现方法,加深对数据结构中树的理解,并掌握使用Python编写哈夫曼编码的能力。
2. 实验原理哈夫曼编码是一种用于无损数据压缩的算法,通过根据字符出现的频率构建一棵哈夫曼树,并根据哈夫曼树对应的编码。
根据哈夫曼树的特性,频率较低的字符具有较长的编码,而频率较高的字符具有较短的编码,从而实现了对数据的有效压缩。
实现哈夫曼编码的主要步骤如下:1. 统计输入文本中每个字符的频率。
2. 根据字符频率构建哈夫曼树,其中树的叶子节点代表字符,内部节点代表字符频率的累加。
3. 遍历哈夫曼树,根据左右子树的关系对应的哈夫曼编码。
4. 使用的哈夫曼编码对输入文本进行编码。
5. 将编码后的二进制数据保存到文件,同时保存用于解码的哈夫曼树结构。
6. 对编码后的文件进行解码,还原原始文本。
3. 实验过程3.1 统计字符频率首先,我们需要统计输入文本中每个字符出现的频率。
可以使用Python中的字典数据结构来记录字符频率。
遍历输入文本的每个字符,将字符添加到字典中,并递增相应字符频率的计数。
```pythondef count_frequency(text):frequency = {}for char in text:if char in frequency:frequency[char] += 1else:frequency[char] = 1return frequency```3.2 构建哈夫曼树根据字符频率构建哈夫曼树是哈夫曼编码的核心步骤。
我们可以使用最小堆(优先队列)来高效地构建哈夫曼树。
首先,将每个字符频率作为节点存储到最小堆中。
然后,从最小堆中取出频率最小的两个节点,将它们作为子树构建成一个新的节点,新节点的频率等于两个子节点频率的和。
将新节点重新插入最小堆,并重复该过程,直到最小堆中只剩下一个节点,即哈夫曼树的根节点。
北邮数据结构实验三题目2哈夫曼树(代码)

~Huffman(){delete []HTree;delete []HcodeTable;}//析构函数
};
//初始化哈夫曼树
void Huffman::Init(char *s)
{
int n=0;
while (*(s+n)!='\0')
k=0;//控制哈夫曼数组下标
ctemp=temp[0];//做标记
for (int i=0;i<n;i++)
{
if(temp[i]==ctemp)
{
l++;//统计不同字符出现的频度
if (i==n-1)
HTree[k].weight=l;
}
{
for (int j=0;HcodeTable[i].code[j]!='\0';j++)
{
*d+=HcodeTable[i].code[j];
sum+=1;
}
s++;
n++;
break;
}
}
}
}
void main()
{
cout<<"请选择输入字符串:"<<endl;
char str[1000]={'\0'};
char *s=&str[0];
char c;
int i=0;
bool flag=0;//判断不同字符个数是否>=2
while (cin.get(c))//接收输入字符串,自动除去空格
数据结构哈夫曼树例题

哈夫曼树是一种特殊的树形结构,主要用于数据压缩和编码等领域。
它通过构建最优二叉树,使得树中每个节点的两个子树权值之和最小,从而在编码过程中达到数据压缩的效果。
下面是一个使用Python实现哈夫曼树的例题:```pythonclass Node:def __init__(self, frequency):self.frequency = frequencyself.left = Noneself.right = Nonedef calculate_frequency(file_data):frequency_map = {}for char in file_data:if char not in frequency_map:frequency_map[char] = 0frequency_map[char] += 1return frequency_mapdef huffman_tree(frequency_map):queue = [Node(frequency) for frequency in frequency_map.values()]while len(queue) > 1:node1 = queue.pop(0)node2 = queue.pop(0)merged = Node(node1.frequency + node2.frequency)merged.left = node1merged.right = node2queue.append(merged)return queue[0] # 返回根节点def encode(huffman_tree, file_data):result = ""for char in file_data:node = huffman_tree.find(char) # 查找对应节点result += chr(int(node.weight) + ord(' ')) # 将权值转化为字符,添加到结果中return resultdef decode(huffman_tree):return huffman_tree.left # 直接使用左子树解码,可以得到原数据```解题思路:1. 首先需要统计文件的字符频率,构造一个字符到频率的映射,也就是构建哈夫曼树的节点。
数据结构哈夫曼编码实验报告

数据结构哈夫曼编码实验报告【正文】1.实验目的本实验旨在研究哈夫曼编码的原理和实现方法,通过实验验证哈夫曼编码在数据压缩中的有效性,并分析其应用场景和优缺点。
2.实验原理2.1 哈夫曼编码哈夫曼编码是一种无损数据压缩算法,通过根据字符出现的频率构建一颗哈夫曼树,将频率较高的字符用较短的编码表示,频率较低的字符用较长的编码表示。
哈夫曼编码的编码表是唯一的,且能够实现前缀编码,即一个编码不是另一个编码的前缀。
2.2 构建哈夫曼树构建哈夫曼树的过程如下:1) 将每个字符及其频率作为一个节点,构建一个节点集合。
2) 每次从节点集合中选择出现频率最低的两个节点,构建一个新节点,并将这两个节点从集合中删除。
3) 将新节点加入节点集合。
4) 重复以上步骤,直到节点集合中只有一个节点,这个节点就是哈夫曼树的根节点。
2.3 编码过程根据哈夫曼树,对每个字符进行编码:1) 从根节点开始,根据左子树为0,右子树为1的规则,将编码依次加入编码表。
2) 对于每个字符,根据编码表获取其编码。
3) 将编码存储起来,得到最终的编码序列。
3.实验步骤3.1 数据读取与统计从输入文件中读取字符序列,并统计各个字符的频率。
3.2 构建哈夫曼树根据字符频率构建哈夫曼树。
3.3 构建编码表根据哈夫曼树,构建每个字符的编码表。
3.4 进行编码根据编码表,对输入的字符序列进行编码。
3.5 进行解码根据哈夫曼树,对编码后的序列进行解码。
4.实验结果与分析4.1 压缩率分析计算原始数据和压缩后数据的比值,分析压缩率。
4.2 编码效率分析测试编码过程所需时间,分析编码效率。
4.3 解码效率分析测试解码过程所需时间,分析解码效率。
4.4 应用场景分析分析哈夫曼编码在实际应用中的优势和适用场景。
5.结论通过本次实验,我们深入了解了哈夫曼编码的原理和实现方法,实践了哈夫曼编码的过程,并对其在数据压缩中的有效性进行了验证。
实验结果表明,哈夫曼编码能够实现较高的压缩率和较高的编解码效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2008级数据结构实验报告实验名称:实验三树学生姓名:班级:班内序号:学号:日期:20013年11月26日1.实验要求实验目的通过选择下面两个题目之一进行实现,掌握如下内容:掌握二叉树基本操作的实现方法了解赫夫曼树的思想和相关概念学习使用二叉树解决实际问题的能力实验内容利用二叉树结构实现赫夫曼编/解码器。
基本要求:1.初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2.建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3.编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4.译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5.打印(Print):以直观的方式打印赫夫曼树(选作)6.计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析哈夫曼树结点的储存结构除了二叉树所有的双亲域parents,左子树域lchild,右子树域rchild。
还需要有字符域word,权重域weight,编码域code。
其中由于编码是一串由0和1组成的字符串,所以code是一个字符数组。
进行哈夫曼编码首先要对用户输入的信息进行统计,将每个字符作为哈夫曼树的叶子结点。
统计每个字符出现的次数(频度)作为叶子的权重,统计次数可以根据每个字符不同的ASCII 码。
并根据叶子结点的权重建立一个哈夫曼树。
建立每个叶子的编码从根结点开始,规定通往左子树路径记为0,通往右子树路径记为 1.由于编码要求从根结点开始,所以需要前序遍历哈夫曼树,故编码过程是以前序遍历二叉树为基础的。
同时注意递归函数中能否直接对结点的编码域进行操作。
编码信息只要遍历字符串中每个字符,从哈夫曼树中找到相应的叶子结点,取得相应的编码。
最后再将所有找到的编码连接起来即可。
译码则是将编码串从左到右诸位判别,直到确定一个字符。
这可以用生成哈夫曼树的逆过程实现。
由于每个字符的编码各不相同,且编码也是个字符串,所以只要遍历编码串,从哈夫曼树中找到相应的叶子结点,取得相应的字符再将找到的字符连接起来即可。
2.1 存储结构哈夫曼树顺序存储结构2.2 关键算法分析1、统计字符的频度自然语言描述:1)取出字符串中的一个字符2)遍历所有初始化的哈夫曼树结点3)如果结点中有记录代表的字符且字符等于取出的字符,说明该字符的叶子存在,则将该结点的权加一。
4)如果所有结点均没有记录字符与取出字符一致,说明该字符的叶子不存在,则将结点的字符记为取出字符,并将权重设为1.5)重复(1)(2)(3)(4)步骤,如此遍历字符串中的所有字符。
伪代码:1.for(int i=0;i<字符长度;i++)1.1for (int j=0;j<字符长度;j++)1.1.1 if (WordStr[i]==HuffTree[j].word)1.1.1.1权重++1.1.1.2 break;1.1.2否则取字符域为空的结点1.1.2.1 HuffTree[j].word=WordStr[i];1.1.2.2 HuffTree[j].weight=1;1.1.2.3 叶子数++;1.1.2.4 break;结束时间复杂度O(n2),空间复杂度S(0)2、构造哈夫曼树自然语言描述:1)将n个权值的叶子结点存放到数组huffTree的前n个分量中2)通过统计字符频度的算法给n个结点赋权值3)将数组huffTree中出叶子结点外的结点初始化:左右子树、双亲域为-1;权值为0;字符编号域为\0。
4)不断将两棵子树合并为一棵子树,并将新子树的根节点顺序存放到数组huffTree的前n个分量的后面。
伪代码描述:1.数组huffTree初始化,除叶子节点外,所有元素结点左右子树、双亲域为-1;权值为0;字符编号域为\0。
2.进行n-1次合并2.1在二叉树集合中选取两个权值最小的根结点,其下标分别即为j1和j22.2将二叉树j1和j2合并为一棵新的二叉树结点k时间复杂度O(n),空间复杂度S(2)3、为每个叶子结点编码自然语言描述:1)初始化一个字符数组Code暂存每个叶子结点的编码。
2)从叶子结点开始,如果是哈夫曼树的左孩子,则将编码表中的code值赋为0,否则为13)将指针层层上移,重复2)直到根结点4)将所得编码逆置,并将编码最后一位赋为’\0’5)进行下一叶子结点的编码算法时间复杂度O(n2),空间复杂度S(60)4、为信息编码自然语言描述:1)定义字符串str1储存编码2)遍历信息字符串中的每一个字符3)对每一个字符,将其与huffTree前n个叶子结点的word域逐个比较,发现相同的则将该结点的编码串code连接到str1串的末尾。
4)遍历信息字符串结束,输出str1算法时间复杂度O(n2) ,空间复杂度S(2)5、译码自然语言描述:1)从编码串str1第一个字符开始和数组huffTree第一个结点的编码域第一个字符进行比较。
2)若相等,则继续比较两者的后续字符3)否则,从str1第一个字符与huffTree第二个节点的编码域第一个字符进行比较。
4)重复上述过程,当huffTree结点中的字符全部比较完毕则说明本趟匹配成功,输出huffTree结点的word域值。
5)重复上述过程,当str1中的字符全部比较完毕,译码结束。
huffTree[k+1]算法时间复杂度O(n 2) 1. 程序运行结果测试条件:问题规模n 的数量级为1。
测试内容:I love data Structure, I love Computer, I will try my best to study data Structure.测试结论:测试的功能有:建立哈夫曼树、对每个字符进行编码、对信息字符串进行编码、对编码串进行译码。
各项功能均能正常运行。
界面的跳转也能实现。
编码前信息总长度为400bits ,编码后的长度为320bits 。
由于哈夫曼编码采用不等长编码,有效缩短了编码长度,节省了空间。
2.总结调试时出现的问题及解决的方法(1)字符串在函数中的存储在给字符进行编码时,由于对于字符串储存的理解不清楚,以致于在生成解决方案是出现了“屯屯屯”的字样,经过查阅相关资料得知,是因为字符串末尾没有加’\0’所致。
(2)字符串编码的位数由于对于字符串存储位数的不够清晰,走入了以往的经验错误,在储存编码时总是少一位,经检查发现是在逆置时数组的个数没有搞清楚(3)字符串的输入输出问题最初字符串是用cin输入,后来发现此种方式只适用于单个次,遇到’\0’即停止,后来调用了cin.getline才有效的解决了这个问题心得体会哈夫曼树又称做最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。
在n个带权叶子结点所构成的二叉树中,满二叉树或完全二叉树不一定是最优二叉树。
权值越大的结点离树根越近的二叉树才是最优二叉树。
哈夫曼树是根据字符出现的概率来构造平均长度最短的编码。
它是一种变长的编码。
在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。
再做本实验的过程中,也出现了很多问题,主要是要编写程序,因为程序比较长,再编写的过程中,经常会出现一些错误,比如:把一些字母编写错误,没区分大小写,漏句,符号写错或漏写等等。
我想这些都是一些比较低级的错误,主要是自己对程序还不是很熟悉,再做实验的时候还不够细心所导致的吧。
这些都是要求我们再做实验的过程中不断总结经验教训,加深对程序的了解和喜爱,不要粗心大意。
通过本实验我也总结了一些经验,那就是再修改程序的时候,不要死转牛角尖,要从大处着手,逐步深入,逐个修改,还要用联系的观点来看程序,有时候一个地方错了,会引起很多个错误,而显示错误的句子本身可能会没有错误,只是与之相关联的一些语句发生了错误而引起的错误。
这时我们就不要死盯着原来的地方不放,而应该找出与之相关联的语句。
哈夫曼树的应用非常广泛,在通信中,采用0,1的不同排列来表示不同的字符,而哈夫曼树在数据编码中的应用,若每个字符出现的频率相同,则可以采用等长的二进制编码,若频率不同,则可以采用不等长的二进编码,频率较大的采用位数较少的编码,频率较小的字符采用位数较多的编码,这样可以使字符的整体编码长度最小,哈夫曼编码就是一种不等长的二进制编码,且哈夫曼树是一种最优二叉树,它的编码也是一种最优编码,在哈夫曼树中,规定往左编码为0,往右编码为1,则得到叶子结点编码为从根结点到叶子结点中所有路径中0和1的顺序排列。
通过这次试验,感觉自己有了很大的提高,再看程序时也没有以前那样不知所云了,修改程序也有了一定的提高,虽然本课程是有点难,但相信功夫不负有心人,只要付出努力,一定会取得成功。
下一步的改进(1)程序中多次使用了遍历数组或对数据进行逐个比对,循环的次数可以通过计算再减少,提高时间效率。
(2)下次争取使用菜单选择工具,选择要进行的功能,。