1、多媒体数据库实验2指标等级ABCD功能完整程序质量按时检查提问回答检查时间总评成绩云南大学软件学院实 验 报 告序 号: 实验老师: 秦江龙 课程名称:多媒体数据库系统设计实验 实验名称: 多媒体数据压缩 学 号: 姓 名: 一、 实验名称多媒体数据压缩二、 实验目的通过使用不同的数据压缩软件,熟悉不同的数据压缩标准的特性三、 实验内容(算法、程序、步骤和方法)任务1:35类不同的多媒体数据类型(如:文本、图像、音频、视频等),根据压缩率、压缩时长、CPU占用率、内存占用情况,评价常用压缩工作35款(如WinRAR, WinZip, Zip7等)请给出你的结论,哪一款压缩软件更适合压缩哪一类多
2、媒体数据类型。任务2:请使用你熟悉的语言,实现如下程序:对用户输入的任意英文字符串,先统计各英文字符出现的次数和概率,采用Huffman编码对字符串编码压缩,然后再解码还原输入字符串。对比35组测试数据,比较Huffman编码的码长和等长编码的码长。说明Huffman编码的优点。四、 数据记录和计算7-zipWinRARWinZip原始数据视频(mp4)视频(mp4)视频(mp4)压缩格式7zrarzip原文件大小87.5M87.5M87.5M压缩包大小68.1M68.5M85.6M压缩率77.8%78.3%97.8%CPU占用率80%84%78%内存占用191012K96744K52668K
3、评价7-zip对MP4视频的压缩率较低,CPU占用率居中,内存占用率较高,总体压缩效果较为理想。WinRAR对MP4视频的压缩率居中,CPU占用率较高,内存占用率居中,总体压缩效果一般。WinZip对MP4视频的压缩率较高,CPU占用率较低,内存占用率较低,总体压缩效果不太理想。7-zipWinRARWinZip原始数据文档(docx)文档(docx)文档(docx)压缩格式7zrarzip原文件大小12.02M12.02M12.02M压缩包大小11.2M11.3M12M压缩率93.2%94.0%99.8%CPU占用率71%66%84%内存占用139764K96788K42736K评价7-zi
4、p对docx文档的压缩率较低,CPU占用率居中,内存占用率较高,总体压缩效果较为理想。WinRAR对docx文档的压缩率居中,CPU占用率较低,内存占用率居中,总体压缩效果一般。WinZip对docx文档的压缩率较高,CPU占用率较高,内存占用率较低,总体压缩效果不太理想。7-zipWinRARWinZip原始数据图片(bmp)图片(bmp)图片(bmp)压缩格式7zrarzip原文件大小4.11M4.11M4.11M压缩包大小562K728K622K压缩率13.4%17.3%14.8%CPU占用率93%87%89%内存占用35572K3940K42288K评价7-zip对bmp图片的压缩率较
5、低,CPU占用率较高,内存占用率较低,总体压缩效果较为理想。WinRAR对bmp图片的压缩率较高,CPU占用率较低,内存占用率居中,总体压缩效果一般。WinZip对bmp图片的压缩率居中,CPU占用率居中,内存占用率较高,总体压缩效果不太理想。源代码#include#include#include#includeusing namespace std;const int MAXSIZE=100;typedef struct Huffmantree char cname; int weight,mark; struct Huffmantree *parent,*lchild,*rchild,*n
6、ext;Hftree,*linktree;linktree tidy_string(char ch) int i=0; linktree tree,ptr,beforeptr,node; tree=(linktree)malloc(sizeof(Hftree); if(!tree) return NULL; tree-next=NULL; for(i=0;chi!=0&chi!=n;i+) ptr=tree; beforeptr=tree; node=(linktree)malloc(sizeof(Hftree); if(!node) return NULL; node-parent=NULL
7、; node-lchild=NULL; node-rchild=NULL; node-next=NULL; node-mark=0; node-cname=chi; node-weight=1; if(tree-next=NULL) tree-next=node; else ptr=tree-next; while(ptr&ptr-cname!=node-cname) ptr=ptr-next; beforeptr=beforeptr-next; if(ptr&ptr-cname=node-cname) ptr-weight+=1; free(node); else node-next=bef
8、oreptr-next; beforeptr-next=node; return tree;linktree squent_node(linktree tree) linktree head,ph,pt,beforeph; head=(linktree)malloc(sizeof(Hftree); if(!head) return NULL; head-next=NULL; ph=head; beforeph=head; while(tree-next) pt=tree-next; tree-next=pt-next; pt-next=NULL; ph=head-next; beforeph=
9、head; if(head-next=NULL) head-next=pt; else while(ph&ph-weightweight) ph=ph-next; beforeph=beforeph-next; pt-next=beforeph-next; beforeph-next=pt; free(tree); return head;linktree createHtree(linktree tree) linktree p,q,newnode,beforep; for(p=tree-next,q=p-next;p!=NULL&q!=NULL;p=tree-next,q=p-next)
10、tree-next=q-next; q-next=NULL; p-next=NULL; newnode=(linktree)malloc(sizeof(Hftree); if(!newnode) return NULL; newnode-next=NULL; newnode-mark=0; newnode-lchild=p; newnode-rchild=q; p-parent=newnode; q-parent=newnode; newnode-weight=p-weight+q-weight; p=tree-next; beforep=tree; if(p!=NULL&p-weight=n
11、ewnode-weight) newnode-next=beforep-next; beforep-next=newnode; else while(p!=NULL&p-weightweight) p=p-next; beforep=beforep-next; newnode-next=beforep-next; beforep-next=newnode; return (tree-next);void Huffman_Coding(linktree tree) int index=0; char *code; linktree ptr=tree; code=(char*)malloc(10*
12、sizeof(char); printf(字符以及它的相应权数: 哈夫曼编码:nn); if(ptr=NULL) printf(哈夫曼树是空的!n); exit(0); else while(ptr-lchild&ptr-rchild&ptr-mark=0) while(ptr-lchild&ptr-lchild-mark=0) codeindex+=0; ptr=ptr-lchild; if(!ptr-lchild&!ptr-rchild) ptr-mark=1; codeindex=0; printf(tw%c=%dttt,ptr-cname,ptr-weight); for(index=
13、0;codeindex!=0;index+) printf(%c,codeindex); printf(n); ptr=tree; index=0; if(ptr-rchild&ptr-rchild-mark=0) ptr=ptr-rchild; codeindex+=1; if(!ptr-lchild&!ptr-rchild) ptr-mark=1; codeindex+=0; printf(tw%c=%dttt,ptr-cname,ptr-weight); for(index=0;codeindex!=0;index+) printf(%c,codeindex); printf(n); p
14、tr=tree; index=0; if(ptr-lchild-mark=1&ptr-rchild-mark=1) ptr-mark=1; ptr=tree; index=0; printf(n); free(code);void Huffamn_Decoding(linktree tree,char code) int i=0,j=0; char *char0_1; linktree ptr=tree; char0_1=(char*)malloc(10*sizeof(char); coutlchild&ptr-rchild;j=0,ptr=tree) for(j=0;codei!=0&ptr
15、-lchild&ptr-rchild;j+,i+) if(codei=0) ptr=ptr-lchild; char0_1j=0; if(codei=1) ptr=ptr-rchild; char0_1j=1; if(!ptr-lchild&!ptr-rchild) char0_1j=0; for(j=0;char0_1j!=0;j+) coutcname); if(codei=0&ptr-lchild&ptr-rchild) char0_1j=0; cout 没有与最后几个字符的 0,1序列: char0_1相匹配的字符!lchild); deletenode(ptr-rchild); fr
16、ee(ptr); int main() char stringMAXSIZE,codeMAXSIZE; linktree temp,ht,htree,ptr=NULL; cout编码:请输入当前要进行编码的字符串:string; coutendl; temp=tidy_string(string); ht=squent_node(temp); htree=createHtree(ht); Huffman_Coding(htree); cout解码:请输入要解码的0,1序列:code; coutendl; Huffamn_Decoding(htree,code); deletenode(htre
17、e); return 0;截图五、 结论(结果)1. 在对三种压缩软件的测试中发现,7-zip的压缩率较低,内存占用一般,但CPU占用较高,整体压缩效果最好;WinRAR压缩率居中,内存占用一般,CPU占用居中,整体压缩效果一般;WinZip压缩率最低,内存占用较高,CPU占用较高,整体压缩效果最差。其中7-zip适合对视频等大文件进行压缩,WinRAR适合对文档等文件进行压缩,WinZip适合对图片等小文件进行压缩。2. Huffman编码的码长是变化的,对于出现频率较高的信息,编码的长度较短;而对于出现频率较低的信息,编码的长度较长,这样,处理全部信息的总码长一定小于实际信息的符号长度。Huffman编码的码长虽然是可变的,但却自带同步代码。Huffman编码方法的编码效率比Shannon-Fano编码方法更高。指导教师签名: 秦江龙
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1