数据结构课设用哈夫曼实现软件压缩

上传人:仙*** 文档编号:43742993 上传时间:2021-12-04 格式:DOC 页数:25 大小:472.51KB
返回 下载 相关 举报
数据结构课设用哈夫曼实现软件压缩_第1页
第1页 / 共25页
数据结构课设用哈夫曼实现软件压缩_第2页
第2页 / 共25页
数据结构课设用哈夫曼实现软件压缩_第3页
第3页 / 共25页
点击查看更多>>
资源描述
南京师范大学数据结构课程设计报告姓姓 名:名: 学学 号:号: 学学 院:院: 计算机科学与技术学院 题题 目:目: 排序算法比较与压缩软件的实现 指导教师:指导教师: 二一四年九月一日目录目录必做题.3一、一、设计内容设计内容.3二、二、设计思想描述设计思想描述.31 希尔排序.32 快速排序.33 堆排序.44 二路归并排序.7三、三、程序结构程序结构.81 类设计.82 主程序设计.83 流程图.9四、四、系统环境与程序测试案例系统环境与程序测试案例.9五、五、设计中遇到的问题及解决方案设计中遇到的问题及解决方案.121 测时间的函数不准确.12其他测试运行时间的方式:.132什么是“真随机”,什么是“伪随机”?.143 如何根据文档结构图生成目录.14六、六、参考文献参考文献.15选做题.15一、一、设计内容设计内容.15二、二、设计思想描述设计思想描述.151 Huffman树与Huffman编码.152 Huffman算法的思想.153 现有的压缩软件及其压缩比.16三、三、程序结构程序结构.171 类设计.172 主程序设计.183 流程图.20四、四、系统环境与程序测试案例系统环境与程序测试案例.20五、五、设计中遇到的问题及解决方案设计中遇到的问题及解决方案.23六、六、收获与体会收获与体会.24七、七、参考文献参考文献.24必做题必做题一、一、设计内容设计内容编程实现希尔、快速、堆排序、归并排序算法。要求随机产生 10000 个数据存入磁盘文件,然后读入数据文件,分别采用不同的排序方法进行排序,并将结果存入文件中。二、二、设计思想描述设计思想描述1 希尔排序希尔排序希尔排序是对直接插入排序的改进。基本思想是先取一个小于 n 的整数 d1 作为第一个增量,把文件的全部记录分组,所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量 d2d1 重复上述的分组和排序,直至所取的增量 dt=1(dtdt-ld2d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。举例举例已知数据序列为(12, 5, 9, 20, 6, 31, 24) ,对该数据序列进行希尔排序:12 5 9 20 6 31 24 12 59 20 6 31 24 5 6 9 12 20 2431 初始键值序列第一趟排序结果(d1=3)第二趟排序结果(d2=1)具体代码见 Sort 代码.txt!2 快速排序快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。举例举例已知数据序列为(12, 5, 9, 20, 6, 31, 24) ,对该数据序列进行快速排序:(1) 一次划分12 5 9 20 6 3124 12 5 9 20 6 3124 12 5 9 20 6 3124 6 5 9 20 12 3124 6 5 9 20 12 3124 6 5 9 20 12 3124 6 5 9 12 20 3124 (2) 对轴值两侧分别进行快速排序6 5 96 5 95 6 95 9 20 31 2420 31 2431 2424 24 31 3 堆排序堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父结点。举例举例已知数据序列为(12, 5, 9, 20, 6, 31, 24) ,对该数据序列进行堆排序:51292420631初始:1 调整成小根堆659242012312 5 与 24 换624952012313 调整成小根堆126952024311231195202465 调整成小根堆129315202464 6 与 31 换1224195203167 调整成小根堆209315241266 9 与 24 换2024195123169 调整成小根堆249315242068 12 与 24 换243195122068 20 与 31 换10 调整成小根堆312411 24 和 31 换9512206312412 排序结果9512206244 二路归并排序二路归并排序将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序。(1)归并子算法:把位置相邻的两个按值有序序列合并成一个按值有序序列。void Merge(int r, int r1, int s, int m, int t);/一次归并算法(2)一趟归并扫描子算法:将参加排序的序列分成若干个长度为 t 的,且各自按值有序的子序列,然后多次调用归并子算法 merge 将所有两两相邻成对的子序列合并成若干个长度为 2t 的,且各自按值有序的子序列。若某一趟归并扫描到最后,剩下的元素个数不足两个子序列的长度时:若剩下的元素个数大于一个子序列的长度 t 时,则再调用一次归并子算法 merge 将剩下的两个不等长的子序列合并成一个有序子序列若剩下的元素个数小于或者等于一个子序列的长度 t 时,只须将剩下的元素依次复制到前一个子序列后面。void MergePass(int r, int r1, int n, int h);/一趟归并排序算法(3)二路归并排序算法:将参加排序的初始序列分成长度为 1 的子序列使用 MergePass 函数进行第一趟排序,得到 n / 2 个长度为 2 的各自有序的子序列(若 n 为奇数,还会存在一个最后元素的子序列) ,再一次调用 mergePass 函数进行第二趟排序,得到 n / 4 个长度为 4 的各自有序的子序列, 第 i 趟排序就是两两归并长度为 2(i-1) 的子序列得到 n / (2i) 长度为 2i 的子序列,直到最后只剩一个长度为 n 的子序列。由此看出,一共需要 log2n 趟排序,每一趟排序的时间复杂度是 O(n)。void MergeSort1(int r, int r1, int n);/归并排序非递归算法举例举例已知数据序列为(12, 5, 9, 20, 6, 31, 24) ,对该数据序列进行堆排序:12 5920631245 12 9 20 6 31245 9 12 206 24 315 6 9 12 20 24 31三、三、程序结构程序结构1 类设计类设计本程序中只含有一个类,即测执行时间的类 CTimer :class CTimer/测执行时间的类public:CTimer()QueryPerformanceFrequency(&m_Frequency);Start();void Start()QueryPerformanceCounter(&m_StartCount); double End()LARGE_INTEGER CurrentCount;QueryPerformanceCounter(&CurrentCount);return double(CurrentCount.LowPart - m_StartCount.LowPart) / (double)m_Frequency.LowPart;void ShowNow()LARGE_INTEGER CurrentCount;QueryPerformanceCounter(&CurrentCount);coutTimer Count is:double(CurrentCount.LowPart - m_StartCount.LowPart) / (double)m_Frequency.LowPartendl;private:LARGE_INTEGER m_Frequency;LARGE_INTEGER m_StartCount;2 主程序设计主程序设计Sort.h 文件中包含所有排序算法,具体代码见 Sort.h 文件。test.cpp 文件中包含产生随机数,读写文件,main 函数和菜单控制程序。函数声明如下:int Menu();void MainMenuCtrl();void WriteFile(int n);void SaveFile(int r, int n, char filename);void ReadFile(int r, int n);void Print(int r, int n);测试时间的代码如下:CTimer t;t.Start();ShellSort(r, n);/希尔排序cout希尔排序执行时间为:t.End()sendl;3 流程图流程图菜单产生随机数并写入文件读文件希尔排序快速排序堆排序归并排序将排序结果写入文件开始结束四、四、系统环境与程序测试案例系统环境与程序测试案例硬件环境截图如下:软件环境:Microsoft Visual C+6.01 10000 个随机数排序2 20000 个随机数排序3 100000 个随机数排序测试结果数据分析:时间复杂度10000 个数据20000 个数据100000 个数据希尔排序O(n2)0.00276598 秒0.0060197 秒0.0395745 秒快速排序O(n)2log n0.00172446 秒0.00374468 秒0.021415 秒堆排序O(n)2log n0.00263925 秒0.00568505 秒0.0337188 秒非递归的归并排序O(n)2log n0.00174817 秒0.00374692 秒0.0208593 秒递归的归并排序O(n)2log n0.00266666 秒0.00581711 秒0.0313498 秒表 1、各种排序执行时间对比表00.0050.010.0150.020.0250.030.0350.0410000个数据20000个数据100000个数据希尔排序快速排序堆排序非递归的归并排序递归的归并排序图 1、各种排序执行时间对比图由上图得,快速排序和非递归的归并排序的排序效率高,其他 3 种排序速度较慢。五、五、设计中遇到的问题及解决方案设计中遇到的问题及解决方案1 测时间的函数不准确测时间的函数不准确不准确的函数如下:clock_t start, finish; /定义开始,结束时间double duration;/持续时间/测量一个事件持续的时间start=clock(); ShellSort(r, n);/希尔排序finish=clock(); duration=(double)(finish - start) / CLOCKS_PER_SEC; /CLK_TCK 毫秒 CLOCKS_PER_SEC 秒cout希尔排序执行时间为: duration msendl;截图如下:分析:使用 clock_t clock() 得到的是 CPU 时间,精确到 1/CLOCKS_PER_SEC 秒,但实际上会有误差。clock()函数 clock()定义于 time.h 中,clock()返回从程序运行时刻开始的时钟周期数,CLOCKS_PER_SEC 定义了每秒钟包含多少了时钟单元数。所以得到的时间差其实是从时钟周期数转换过来的。CPU 执行时间=程序所含时钟周期数时钟周期程序总时钟周期数=程序所含指令条数= 此时的 CPI 是该机器指令集中的所有指令执行所用的平均时钟周期数,是一个平均数,即可近似的认为三次排序时的 CPI 相同。时钟周期即 CPU 主频的倒数,为一个定值。所以三次排序下此条件相同。所以得到如下结论:当程序所含的指令条数越多时,此种方法测到的时钟周期数越多,所反映的时间越长,造成了实验结果的不准确。其他测试运行时间的方式:其他测试运行时间的方式:(1)GetTickCount()函数:GetTickCount 记录了从系统启动时经过的时间,精确到毫秒。在 windows 下实现(毫秒级):注意要添加头文件。DWORD dwStart = GetTickCount(); /取 windows 启动到现在的流逝时间(毫秒)Run_Your_Func(.); /运行你的函数DWORD dwUsed = GetTickCount() - dwStart; /计算该函数所消耗的时间(2)对于一般的实时控制,使用 GetTickCount()函数就可以满足精度要求,但要进一步提高计时精度,就要采用 QueryPerformanceFrequency()函数和 QueryPerformanceCounter()函数。这两个函数是VC 提供的仅供 Windows 9X 使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。CTimer 类如下:class CTimer/测执行时间的类public:CTimer()QueryPerformanceFrequency(&m_Frequency);Start();void Start()QueryPerformanceCounter(&m_StartCount); double End()LARGE_INTEGER CurrentCount;QueryPerformanceCounter(&CurrentCount);return double(CurrentCount.LowPart - m_StartCount.LowPart) / (double)m_Frequency.LowPart;void ShowNow()LARGE_INTEGER CurrentCount;QueryPerformanceCounter(&CurrentCount);coutTimer Count is:double(CurrentCount.LowPart - m_StartCount.LowPart) / (double)m_Frequency.LowPartendl;private:LARGE_INTEGER m_Frequency;LARGE_INTEGER m_StartCount;(3)写一个测试执行时间的宏#include window.h#define BEGIN_RECORDlong _temp_begin_time_;_temp_begin_time_=:GetTickCount();#define END_RECORD(dtime)dtime=:GetTickCount()-_temp_begin_time_;用法:long tim;BEGIN_RECORD被测函数;END_RECORD(tim);/tim 就是所求的时间差!2 什么是什么是“真随机真随机”,什么是,什么是“伪随机伪随机”?(1)、伪随机数:一方面它是可以预先确定的,并且是可以重复地生产和复制的;一方面它又具有某种随机序列的随机特性。(2)、真随机数:它是相对于伪随机数而言的,不具有规律,但计算机不会产生绝对随机的随机数。Microsoft VC+产生随机数的原理:Srand ( )和 Rand( )函数。它本质上是利用线性同余法,y=ax+b(mod m)。其中 a,b,m 都是常数。因此 rand 的产生决定于 x,x 被称为 Seed。Seed 需要程序中设定,一般情况下取系统时间作为种子。它产生的随机数之间的相关性很小,取值范围是 032767(int),即双字节(16 位数),若用 unsigned int 双字节是 65535,四字节是 4294967295,一般可以满足要求。相同种子下产生的随机寻列是相同的。3 如何根据文档结构图生成目录如何根据文档结构图生成目录电子版文档点击“视图”“文档结构图”编成目录,点击可快速链接,且目录随时能够看到;纸质版文档点击“插入”“引用”“索引和目录” 。二者前提都要点击“视图”“大纲” ,编辑标题级别。六、六、参考文献参考文献1 DoubleLic+计算代码执行时间的方法(毫秒级):http:/ aaronalan 的专栏GetTickCount() 用法 :http:/ 许明吉博客GetTickCount() 函数的作用和用法http:/ 设计内容设计内容设有一个文本文件 A(可以是 C 源程序) ,统计该文件中各字符的频率,对各字符进行 Huffman编码,将该文件翻译成 Huffman 编码文件 B,再将 Huffman 编码文件译码成文件 C,并对文件 A 与C 进行比较。二、二、 设计思想描述设计思想描述1 Huffman 编码编码Huffman 树是在叶子结点集合确定的前提下,所有可能的二叉树形态中树的带权路径长度最小的二叉树。当 Huffman 树应用于信息编码领域时,叶子结点被用于表示待编码的符号。将每个结点的左分支记作 0,右分支记作 1,则每个叶子结点的路径可以用一个 0/1 串的编码来表示,称为Huffman 编码。Huffman 编码是一种可变长编码方式,编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。Huffman 算法的最根本的原则是:累计的(字符的统计数字*字符的编码长度)为最小,也就是权值(字符的统计数字*字符的编码长度)的和最小。2 Huffman 算法的思想算法的思想Huffman 算法的思想可以概括为 2 次扫描。第一次是根据输入的字符计算各个字符的频率,并根据频率给每个字符编码;第二次扫描时对每个输入的字符进行匹配,并把输入的字符转换为编码输出到压缩文件中。为了得到文本中字符出现的频率,一般的做法是扫描整个文本进行统计,编写程序统计文本中各个字符出现的频率。由于一个字符的范围在0-255之间,即共有 256 个状态。所以直接向系统静态的申请一个长度为 256 的整数数组,用于存放相应的频率。得到频率后进行哈夫曼编码,然后将数据输出到文件保存。3 现有的压缩软件及其压缩比现有的压缩软件及其压缩比(1)WinZIPZIP 是最常见的压缩文件格式,Windows 系统已经集成了对 ZIP 压缩格式的支持。经历过 DOS 时代的用户可能还记得 ARJ 格式,它基本就是 DOS 时代的 ZIP,直到 ZIP 格式出现,以更高的压缩效率取代了 ARJ,成为用户的首选。现在大多数操作系统都会集成对 ZIP 文件的支持,而所有的压缩软件也都会提供对 ZIP 文件的支持,这些足以体现出 ZIP 格式的地位。ZIP 时代最出名的压缩软件就要数 WinZIP 了,它几乎是当时每台电脑都必备的软件。直到Windows 系统开始集成了对 ZIP 文件的支持,以及后起之秀 RAR 格式的出现,使得 WinZIP 不再是那么必要,才让它逐渐淡出了大家的视线。(2)WinRARRAR 格式的文件压缩率比 ZIP 更高。同样的文件使用 RAR 格式进行压缩后得到的大小通常都会比使用 ZIP 压缩后更小,而用户对文件进行压缩的主要目的就是要减小文件大小以便于网络传输,正巧 RAR 格式又出现在网络刚刚开始普及之时,所以 RAR 逐渐取代 ZIP 的地位也就是情理之中的事了。对 RAR 文件进行压缩或者解压缩,首选的软件当然是 WinRAR。与之前的 WinZIP 一样,它几乎也是现在每台电脑都必装的软件。图 2 WinZip12.0 和 WinRAR 压缩视频文件最终结果图表图 3 WinZip12.0 和 WinRAR 压缩视频文件最终结果图表图 4 WinZip12.0 和 WinRAR 压缩文档文件最终结果图表(3)7Z作为压缩格式的后起新秀,7Z 有着比 RAR 更高的压缩率,能够将文件压缩得更加小巧。不过因为 RAR 格式已经高度普及,7Z 想要取代 RAR 目前的地位相当不容易。与之前两种格式一样,7Z 也有着专门支持它的软件:7-zip。使用 7-zip 可以解压缩 RAR 格式的压缩文件,而 WinRAR 也同样可以解压缩 7Z 格式的压缩文件。大概因为直接使用现有的 Win-RAR 就可以处理网络上下载到的 7Z 格式文件,而要将文件压缩成 7Z 格式的话却需要额外安装 7-zip,所以也间接妨碍了 7Z 格式的普及。(4)CABCAB 是微软的一种安装文件压缩格式,主要应用于软件的安装程序中。因为涉及到安装程序,所以 CAB 文件中包含的文件通常都不是简单的直接压缩,而是对文件名等都进行了处理,所以虽然可以对其直接解压缩,但解压后得到的文件通常都无法直接使用。和 ZIP 一样,Windows 系统自身就可以打开 CAB 格式的文件,而几乎所有压缩软件也都可以对 CAB 文件进行解压。(5) WinMount最后单独介绍一个软件:Win-Mount。当解压缩一个文件时,就必然会多占用一些磁盘空间,因为磁盘上同时存在了压缩文件和解压后的文件。而 WinMount 的特点就是能够将压缩文件以类似虚拟光驱的方式挂接为一个虚拟磁盘供用户使用,因为所有的操作都是在内存中进行的,并没有实际执行任何的解压缩操作,所以不会占用额外的磁盘空间。这对于一些用户来说,可能还是很有帮助的。三、三、 程序结构程序结构1 类设计类设计哈夫曼树的结点结构如下:struct HuffNode/哈夫曼树结点的定义char data;/待编码的符号double weight;/符号出现的频率int lchild,rchild,parent;/父结点左右孩子结点的位置;哈夫曼树类的结构如下:class HuffTreepublic:HuffTree(vector &leaves);/构造函数vector Getcode(int i);/取编码string Decode(vector &source);/译码string Decode(string &source);/译码HuffTree()int Getn()return n;/返回叶子结点数char GetData(int i)return hufftreei.data;/返回叶子结点的值HuffNode GetNode(int i)return hufftreei;private:void SelectSmall(int &least, int &less, int i);private:vector hufftree;/所有结点的存储空间int n;/叶子结点数;哈夫曼树类有 2 个私有成员 vector类型的 hufftree (所有结点的存储空间)和 int 类型的 n(叶子结点数)。有 1 个编码函数 vector Getcode(int i)和 2 个译码函数,如下:string Decode(vector &source);/哈夫曼编码是 vector类型string Decode(string &source);/哈夫曼编码是 string 类型2 主程序设计主程序设计主程序中有 4 个重要函数,如下:(1)计算待解压字符出现的频度void GetFrequency(int frequency, char filename);/统计各字符出现的频度。先初始化用于统计每个 ASCII 码字符个数的数组 frequencyvoid GetFrequency(int frequency, char filename)for(int i=0;inoskipws;/noskipws:不忽略空白,把每行最后那个n 也读进来while(infilech)frequencych+;/统计每个 ASCII 码字符的个数infile.close();/关闭文件(2)压缩void Compression(HuffTree hf, vector leaves, char filename, char filename2);/压缩void Compression(HuffTree hf, vector leaves, char filename, char filename2)ifstream infile2(filename);/打开待压缩文件ofstream outfile;outfile.open(filename2);/打开压缩后文件char ch;infile2noskipws;/noskipws:不忽略空白,把每行最后那个n 也读进来while(infile2ch)/逐个读入字符for(int i=0;ileaves.size();i+)if(ch=leavesi.data)/找到字符对应的叶子结点for(int j=0;jhf.Getcode(i).size();j+)outfilehf.Getcode(i)j;/将对应 Huffman 编码写入文件infile2.close();/关闭待压缩文件outfile.close();/关闭压缩后文件coutendlendlendl;cout压缩文件filename成功,;cout生成了已压缩文件filename2!endlendlendl;(3)解压 1void Decompression1(HuffTree hf, char filename2, char filename3);解压方法 1:Huffman 编码储存为 vector类型从压缩后的文件中读入 Huffman 编码, 使用 HuffTree 类中的解码函数将 Huffman 编码转换成对应的 ASCII 码字符写入解压后的文件。void Decompression1(HuffTree hf, char filename2, char filename3)char c;/暂时储存读入的字符int t;/储存读入字符对应的整数vector source;/储存 Huffman 编码ifstream infile(filename2);/打开压缩后的文件while(infilec)/逐个读入 Huffman 码的 0/1符t=c-0;/将字符转换成整数source.push_back(t);/将整数插入 Huffman 编码中infile.close();/关闭压缩后的文件string target;target=hf.Decode(source);/得到 Huffman 编码对应的字符ofstream outfile(filename3);outfiletarget;/解压后的字符串写入解压后文件outfile.close();/关闭解压后的文件cout已成功解压生成文件filename3!endlendlc)/逐个读入 Huffman 码的 0/1符source=source+c; /将整数插入 Huffman 编码中infile.close();/关闭压缩后的文件string target;target=hf.Decode(source);/得到 Huffman 编码对应的字符ofstream outfile(filename3);outfiletarget;/解压后的字符串写入解压后文件outfile.close();/关闭解压后的文件cout已成功解压生成文件filename3!endlendlendl;3 流程图流程图读取文本中待压缩的数据开始结束统计各字符的频率建哈夫曼树得到哈夫曼编码通过哈夫曼树解码四、四、 系统环境与程序测试案例系统环境与程序测试案例硬件环境截图如下:软件环境:Microsoft Visual C+6.0软件使用界面:1 待压缩的文件为 Data.txt ,如下:压缩后的文件为:CompressionData.txt解压后的文件为:DecompressionData1.txt 中,将 Huffman 编码储存为 vector类型解压,DecompressionData2.txt 中,将 Huffman 编码储存为 string 类型解压。由上图可见,压缩前与解压后的 2 个文本内容相同。解压所耗时间如下:由于一组数据不够准确,故测量一下 3 组数据:文件原大小2KB10KB25KB压缩后文件大小5KB43KB109KB所用时间0.146675 秒0.707169 秒0.461611 秒表 2由上表得,用本程序的算法压缩,压缩后的文件会比原文件更大。五、五、 设计中遇到的问题及解决方案设计中遇到的问题及解决方案1 哈夫曼树的译码函数出错,截图如下:每次调试至上图左侧黄色箭头处,就报错。发现每次从树的根部找起,直到找到最后一个叶子结点后,没有返回到根部。故要添加一行代码:p=root; 具体见下方代码:string HuffTree:Decode(vector &source)/译码string target=;int root=hufftree.size()-1;/找根结点的下标int p=root;for(int i=0; isource.size(); i+)if(sourcei = 0)/sourcei是 int 型p=hufftreep.lchild;elsep=hufftreep.rchild;if(hufftreep.lchild = -1 & hufftreep.rchild = -1)target=target+hufftreep.data;p=root;return target;2 压缩后的文件比原文件大待改进!六、六、 收获与体会收获与体会经过为期一周的课程设计,我对哈夫曼树以及哈夫曼编码有了更透彻的理解,对程序的编写流程有了更深刻的体会。从最初的选定程序,到最终的程序运行成功,让我感到如果是仅仅掌握课本上的知识是远远不够很好地应用到实际的编程中去的。在这个过程中还需要我们更多的考虑实际条件的种种限制和约束。我在写程序的过程中也遇到了很多的问题,比如测试程序运行时间时,一开始总是测得为 0 秒,调试之后还是找不到问题所在,于是就查资料,问同学,问老师,最后才把问题解决了。其实上学期也遇到类似的问题,但时间长了就不记得了,所以知识还是需要不断的复习、巩固、加强,一时会了不代表以后一直都会呀。同时,word 的排版也出现了很多问题,例如,如何去掉封面的页码,如何更好地画流程图,如何管理文档结构图等等。通过上网查资料,这些问题都一一被解决啦。总之,本次专业课程设计提高了我解决问题的能力,为以后毕业设计和工程实践等打下良好的基础。同时,我发觉我们掌握的专业知识还远远不足,不能一味地满足于老师的传授,更多得失需要我们自己去发现,自己去搜集。只要付出努力,认真编程,耐心调试,完成一个大的程序也并不困难。我也会积极吸取本次课程设计的经验,继续研究数据结构和所学的各种编程语言。七、七、 参考文献参考文献1 王红梅,胡明,王涛编著 . 数据结构(C+版) . 第 2 版 . 北京:清华大学出版社,2011。2 管策译 . 改变未来的九大算法.扫描版 . 北京:中信出版社,2013。3 互动百科 . 压缩软件:http:/ 新浪科技 . 至高压缩比 7-Zip 压缩软件评测http:/ 中关村在线 . 压缩比率测试:视频文件压缩http:/ 网盟 . 压缩大作战 流行压缩软件详细评测http:/
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!