一:首先,讨论并比较基于字符的压缩与基于单词的压缩
1. 基于字符的压缩所用的存储空间固定,但由于每个字符都要编码,相比基于单词的压缩在文章字数较少时更加适用;
2. 基于单词的压缩适用于专业类文章或者其他相关术语等有单词出现频率高的文章的压缩,这样编码的长度会减少很多
3. 对于不同的文章,应综合考虑,或者在大量统计的基础上得出普适规律
4. 无论是基于字符的压缩还是基于单词的压缩如果应用K叉树,则空间利用率都会提高,而应用最优堆则会使时间复杂度降低
二:系统不足
不足:
1. 没有考虑优化问题,如果应用K叉树,平均编码长度就会减少很多,整体的哈夫曼编码会变得简短;
2. 在建立哈夫曼树的过程中,无论是插入结点还是寻找最小结点,他们整体的时间复杂度都是O(n2)。如果考虑用最小堆问题,寻找最小结点的时间复杂度变为O(logn),整体的复杂度就减少为O(n·logn)。
三:实验心得
这次最突出的问题是:代码的复用问题,因为之前建立结构体数组用的是全局变量,本以为在函数操作中会简单,到后来在建立基于单词压缩方法时就出现了复用问题,后来是自己动手改了每个函数参数之间的传递。我觉得这对我是一次警告,警告我以后编程序时要充分考虑代码复用性及函数的封装性。
还有一个地方,是方法的选择问题,在寻找权值最小的两个结点时,我面临很多方法,可以用实验一用过的插入排序把数组按权值排序后直接取前两个,也可以直接遍历两次寻找到最小的,然而这两种方法的时间复杂度都是O(n),如果再进一步考虑,思考老师给的后面的加分题,完全可以想到用最小堆来优化使时间复杂度降为O(logn),这也是刚学过的知识。
上面的两个问题让我意识到对知识的应用和对程序优化的重要性,对已经实现出来的功能从时间复杂度和空间复杂度两个方面优化,并加强他的复用性,使方法可以再更多情况下使用而不是仅仅局限于当前命题,是我要学习的方向之一。
实验是基础的哈夫曼树,在寻找资料的过程中无意接触到了计算机学科对自然语言的处理这一领域,做为兴趣决定会去多多接触一下,就拿哈夫曼树当入门了。