如何评价菲利普·塞默·霍夫曼(Philip Seymour Hoffman)的演技?
1. 他是典型的纽约演员,纽约演员和好莱坞演员的区别,典型的说类似伍迪艾伦和迈克尔贝的区别。科班出身,毕业于纽约大学。有丰富的百老汇舞台经验,两提托尼奖。他在部分表演中有颇为浓厚的舞台剧风格,典型的比如本就是舞台剧改编的《虐童疑云》。与大学时代的室友斯蒂文-沙伯(Steven Schub)以及大导演本尼特-米勒(Bennett Miller)一同创建了一个剧院。2. 他父母在他9岁时离异。母亲是纽约州罗切斯特当地的法官,兄妹四人由母亲独自抚养长大。中产以上的单亲家庭,良好的教育背景,并不酗酒但吸毒,自小熟稔于中产阶级以致上流社会的生活状态,生日是狮子座的第一天(七月份的尾巴,你懂得)。在他的语录中有一句是「I was 22 and I was panicked for my life.」。当时他刚大学毕业,决定戒酒,实在有强大的决心。但后来他还说,「I am not ever going to preach to anyone about drugs or drinking. But, for me, when they were around, I had no self control.」让人哀叹的,他还是死于毒品过量。3. 他最大的标签是瞬间歇斯底里的情绪爆发,以及平时有些倦怠甚至冷漠的台词表达方式。因此卡波特真是为他量身定制的完美角色。他凭借这一角色几乎囊括了当年的所有演技奖,也是他生涯中在影史中位置最高的角色之一。但其实跳脱出这类角色的范畴,让他演从头到尾都很疯狂的(比如《碟中谍3》),或者是情绪偏平稳的角色(比如《总统杀局》),他的表现就相对普通了。4. 很多人认识他应该是从卡波特,或者碟中谍3,甚至近几年的一些奥斯卡佳片里。但他电影事业真正起步,是参演保罗-托马斯-安德森的一系列电影,自然包括《木兰花》、《不羁夜》等等。他是PTA的爱将,除却《血色将至》之外,PTA的每部作品里都少不了他。《不羁夜》中那个有同志倾向的小助理角色真正是他在影视圈突破性的角色,也算初步圈定了他之后的角色定位。此后几年,他几乎成为独立佳片的代名词,《谋杀绿脚趾》、《天才莱普利》、《几近成名》、《欲望小镇》等等,一系列独立佳片的参演终于奠定了他在圈内的地位。5. 论及他的演员偶像,大抵包括了丹尼尔-戴-刘易斯,保罗纽曼和梅丽尔-斯特里普。这可以看出他在演技方面的追求,和他的演技模式(偏体验派的)。其实他的很多演技表现可以用刘皇叔的标签评价,是那种以对自身超级强大甚至变态的控制欲,对角色进行拟态。但他和刘皇叔这一级别演员(历史上也数不出两只手)的差距在于,他的多数角色其实与他本人性格或者出身成长环境都有相似之处,当然你也可以说成他如果多活几年也许就能遇见更伟大的角色了。6. 《卡波特》绝对是他演员生涯的分水岭,此后的他,参与了更多大制作的电影,当然也在参演影片的选择上有更多的话语权。好几年之内,他每年至少有一部参演影片有奥斯卡提名,他的选片眼光可见一斑。我实在不擅于煽情。不过菲利普-塞弗-霍夫曼真的是我当下最喜爱的好莱坞演员之一,任何一部电影的演员表里有他,就足以让我产生强烈的观影兴趣。此前我所在的电影基金接到的一个让人兴奋的项目,某心理悬疑片,在去年年底几乎落定了最终演员会是他和艾玛-沃森,让我兴奋了好一阵子。他是当代为数不多的大师级演员之一,凭借他多年来的稳定的精彩贡献,足以让他在影史里能够与凯文-史派西、加里-奥德曼、克里斯多夫-沃尔肯,甚至汤姆-汉克斯和罗伯特-德尼罗等Big Name等列齐名。最可惜的是他的年纪,将将40岁来到演艺生涯的巅峰,他本有更多机会创造自己的辉煌。只可惜天不遂人愿。
谁知道英伦摇滚的和弦进行节奏啊?越多越好,比如Am→Fmaj7→G...
其实我也是来找走向的,偶然看到这个问题,我觉得如果真的找不到的话,不如去找一些比较典型的英伦摇滚的歌曲,看一看它们的和弦走向。这种东西一般都是付费的,像咱们这样自学的人,要么报个班,要么也就是自己分析了。个人感觉英伦风最主要的特征还是在音色和乐器节奏的配合上
我的电脑启动项中有FMAPP application 请问这是什么服务啊?win7家庭版
是一个网络收音机的应用程序。fmappapplication是联想主机使用了Conexant系列声卡芯片,你这个是其声卡驱动自带应用程序中的一个,比较类似网络广播或收音机程序,对系统正常运行没有什么作用,只能说是声音辅助程序。如果不想要的话建议你进入任务管理器选择服务对该服务点击鼠标右键,选择转到进程,然后右键打开文件位置,在文件安装目录里可以知道该程序是否有用,如作用不大建议开机禁止启动。
联想开机启动中有个Fmapp Application,这个有什么作用,能禁止吗?是在声卡conexan目录下的。
联想主机使用了Conexant 系列声卡芯片,你这个是其声卡驱动自带应用程序中的一个,比较类似网络广播或收音机程序,可以禁用,对系统运行没有任何影响。
journalofmanagementstudies投稿难度
journal of management studies是顶级期刊吗时间:2022-03-14 来源: 113journal of management studies是顶级期刊吗如果顶级期刊只算UTD,那么JMS不算,如果顶刊范围大一些,JMS基本也是顶刊了《计算机仿真》是不是中文核心期刊?《计算机仿真》是中文核心期刊,在中文核心期刊要目总览第六版),TP 自动化技术、计算机技术类核心期刊表第21位。做有限元模拟好发文章吗?可以发文章,但是很难发到好的期刊上。研究方法一般分为理论分析、实验探究和数值模拟,单独的某一种都可以发文章,其中数值模拟是其中发文章较难的。建议两两结合,比如以模拟为主,配少量实验,会好发一点。我感觉最佳组合是理论+实验,但是只有少部分研究者既精通理论又擅长实验,一般这种文章合作的比较多。在国际顶级期刊发表论文 很牛么楼主 你都说了是国际顶级期刊,你说牛吗?任何一个行业,能占到国际顶级的水平都很牛的 比如你能发一篇nature,影响因子一般在30+,你绝对大牛老师只说了数值模拟软件必须学会,但是没具体规定学哪一个,所以不知道该学哪一个??大概知道凝固模拟方法有相场法、元胞自动机、还有MC,这个钢貌似有共析转变,请问大家这三种方法我怎么选择?顺便推荐几篇简单易懂的文献或书籍吧,谢谢了啊。10人正在APP中讨论 查看最新猜你喜欢用户评论lgt725可以参考一下铸造模拟软件,如PRCAST,华铸CAE等cwzheng既然你们老师让你做这个,那么你们组里肯定有相关的研究基础吧?!应该也有师兄/姐做过相类似的课题吧!?zhao0610楼: Originally posted by cwzheng at 2012-02-14 20:27:02:既然你们老师让你做这个,那么你们组里肯定有相关的研究基础吧?!应该也有师兄/姐做过相类似的课题吧!?之前别人用的是levelset方法,有个师姐做过...不过...师姐,你懂的,所以我比较迷茫zhao0610楼: Originally posted by lgt725 at 2012-02-14 20:16:00:可以参考一下铸造模拟软件,如PRCAST,华铸CAE等怎么参考啊....说得容易....我是要自己编程,难道我还能去买个软件并手动破解不成minleiTX:1.导师要求你做“TC4钛合金的数值模拟”时是否提及较详细的研究内容?TC4钛合金凝固过程中的传热、传质、晶核形成与生长过程数值分析?明确了具体的研究目标后才能质疑、比较、判断和选择研究方法与研究工具;2.“Originally posted by lgt725 at 2012-02-14 20:16:00:可以参考一下铸造模拟软件,如PRCAST,华铸CAE等怎么参考啊....说得容易....我是要自己编程,难道我还能去买个软件并手动破解不成”“编程”的目的是求解研究问题的物理方程并对计算结果进行分析。商用仿真软件一般将物理方程的求解过程内置使研究计算机仿真是核心期刊吗是的,北大收录的计算机仿真这个期刊是核心么计算机仿真主办单位:中国航天科工集团公司第十七研究所出版周期:月刊该刊被以下数据库收录:中国科技论文统计源期刊(2016-2017年度)CSCD 中国科学引文数据库来源期刊(2015-2016年度)(含扩展版)北京大学《中文核心期刊要目总览》来源期刊:2014年版当然是核心期刊,是3核心期刊。请问ACS Applied Materials&Interfaces是顶级期刊吗?ACS Applied Materials&Interfaces是SCI,算不上顶级期刊,但也是很不错的期刊了,IF大概8多一些,且还在缓慢上升,是侧重于材料应用的多学科交叉期刊。能发ACS AMI还是可以的。超声医学数值模拟哪些SCI杂志审稿快和医学相关的话,ultrasonics比较好;Acta Acustica united with Acustica也可以考虑。这两个都容易中,都是4区,关于超声学2区以上的比较少。还可以考虑JASA Express Letters 两个月可接受。UMB侧重应用ULTRASONICS应用与理论均可IEEE UFFC也比较好,偏理论,但也重应用恭喜李老师在我公司润色的论文顺利在中科院2区期刊Journal of Environmental Management发表,投稿经验分享如下:期刊名称:Journal of Environmental Management影响因子:6.789中科院分区:二区一审周期:3个月难易程度评价:投稿后经过两轮修改,最终接收,前后历时近6个月,第一次修改后,专家又提出了一点小问题,又经历了第二轮修改。总体上评审专家提的问题很专业,该期刊也是环境管理类的经典top刊物。非常感谢NativeEE老师的精心润色,论文评审过程没有遇到关于语法方面的问题。
如何证明huffman编码是最优编码?
设某个Huffman编码加权和为sigma(Ai*Pi),若存在更优的非H编码,不妨设其中与H编码中权重Pi的位置Ai与Pj的位置Aj调换位置(Pi>Pj),则有Pi*Aj+Pj*Ai>Pi*Ai+Pj*Aj,整理得(Pi-Pj)*Aj>(Pi-Pj)*Ai,即Aj>Ai,与H编码矛盾,因此不存在更优的编码。
下列关于Huffman树和Huffman编码的说法正确的有
1、错误,频率越高,则编码越短2、正确,没有一个编码是另外一个编码的前缀3、正确,对于一组权值而言,Huffman编码并不唯一,因为没有左右子树方向的限制4、错误,不等长,这样才有编码前缀的问题
huffman编码可以压缩中文么?
huffman编码是可以压缩成中文,不过程序特别的复杂。
对一串字符进行huffman编码并解码
#include <stdlib.h>#include <iostream.h>#include <stdio.h>#include <string.h>#define OVERFLOW -1typedef struct{ char letter; int weight; int parent; int lchild; int rchild;}HTNode,*HuffmanTree;typedef char * *HuffmanCode;void Select(HuffmanTree &HT,int i,int &s1,int &s2){ /*选择森林中,根结点的权值最小和次小的两个树, *将其根结点的下标号记入s1和s2中 */ int j, k; for(k = 1; k < i; k++) { if(HT[k].parent != NULL) continue; s1 = k;/*init the number*/ break; } for(j = 1; j < i; j++) { if(HT[j].parent != NULL) continue; if(HT[j].weight < HT[s1].weight) s1 = j; } for(k = 1; k <= i; k++) { if(HT[k].parent != NULL || k == s1) continue; s2 = k; break; } for(j = 1; j < i; j++) { if(HT[j].parent != NULL) continue; if(HT[j].weight <= HT[s2].weight && j != s1) s2 = j; } }void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *zi,int *w,int n){ HuffmanTree p; int m,i,s1,s2,f,c; int Istart = 1; char *cd; if(n <= 1) return; m = 2*n-1; if(!(HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)))) exit(OVERFLOW); for(p=HT+1,i=1;i<=n;++i,++zi,++p,++w) { /*生成独立的森林*/ p->parent = NULL; p->letter = *zi; p->lchild = NULL; p->rchild = NULL; p->weight = *w; } for(;i<=m;++i,++p) { (*p).weight=0; (*p).parent=0; (*p).lchild=0; (*p).rchild=0; } for(i=n+1;i<=m;++i) { Select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char*)malloc(n*sizeof(char));/*临时的code存储*/ cd[n-1]=""; for(i=1;i<=n;++i) { Istart = n - 1; /*按已生成的哈夫曼树,得到各个字符的哈夫曼编码 */ for(c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) if(HT[f].lchild == c) cd[--Istart] = "0"; else cd[--Istart] = "1"; HC[i] = (char *)malloc((n - Istart) * sizeof(char)); strcpy(HC[i], &cd[Istart]); } free(cd); }void main(){ HuffmanTree HT; HuffmanCode HC; int i,j,yu; char zi[9]={"A","B","C","D","E","F","G","H"}; int w[100]; char z; char c[100]; z="A"; cout<<endl; for(i=0;i<=7;i++) { cout<<"please input the weight for "<<z<<":"; cin>>w[i]; z++; } HuffmanCoding(HT,HC,zi,w,8); cout<<endl; cout<<"char weight huffmancode "<<endl; for(i=1;i<=8;i++) cout<<HT[i].letter<<" "<<HT[i].weight<<" "<<HC[i]<<endl; cout<<"please input the text:"; cin>>c; cout<<"The code is:"; for(i=0; i < strlen(c); i++) /*根据字符的哈夫曼编码,将输入的文本(变量c表示的)翻译成电码。 */ cout<<HC[(c[i] - "A" + 1)]; cout<<endl; cout<<"Enter the code:"; cin>>c; j=strlen(c); yu=15; i=1; cout<<"The text is:"; while(i <= j) { while(HT[yu].lchild != 0)/*因为是完全二叉树*/ { if(c[i-1] == "0") { /*用哈夫曼树,将输入的电码(变量c表示的)翻译成文本, 说明:变量名c在程序中 */ yu = HT[yu].lchild; i++; continue; } if(c[i-1]== "1") { yu=HT[yu].rchild; i++; continue; } } /*显示由部分电码译码得到的字符,并准备对后面的电码进行译码*/ cout<<HT[yu].letter; yu = 15; } cout<<endl;}
huffman 编码(C++)
这是我们的作业题,自己写 的……(可能输入的格式跟你要的不一致,自己改一下)注:1、 初始化创建哈夫曼树有三种选择,其中选择编译课本测试数据时和编译源文件是,调用的输入文件分别是:test.txt和input.txt;字母的哈夫曼编码都保存在文件:hmfTree.txt; 2、 用户自定义模式下,需要编码的文件内容保存在ToBeTran.txt中;课本测试数据和源文件代码分别保存在course.txt和sorse.txt中,在(1)中选择不同的选项,则在编码时调用相应的文件进行编码,编码结果保存在文件CodeFile.txt中。 3、 文件译码时,调用文件CodeFile.txt进行译码,得到的结果保存在文件TextFile.txt中。 4、 打印代码文件:调用CodeFile.txt,结果显示在终端并保存在文件CodePrin.txt中。 5、 打印哈夫曼树:用凹入表形式把哈夫曼树显示在终端,同时将它保存在文件TreePrint..txt中。 #include <stdio.h> #include<malloc.h> #include <string.h> #include<fstream> #include<iostream> using namespace std; typedef struct { unsigned int weight; char ch1; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char **HuffmanCode; typedef struct { char ch; char code[7]; }codenode,*code; void select(HuffmanTree HT,int n,int & s1,int &s2){ //从哈夫曼树中选择出最小的两个节点 for(int i=1;i<=n;i++) if(!HT[i].parent){ s1=i; break; } for(i++;i<=n;i++) if(!HT[i].parent){ s2=i; break; } if(HT[s1].weight-HT[s2].weight){ int temp; temp=s1; s1=s2; s2=temp; } for(i=1;i<=n;i++) //对数组进行遍历,寻找最小的两个节点 if(!HT[i].parent){ if(HT[i].weight<HT[s1].weight){ s2=s1; s1=i; } else if(HT[i].weight<HT[s2].weight&&i!=s1) s2=i; } } void prin(){ //终端输出选择菜单 cout<<"---------------------------------------------------- " <<" ∣ I---创建哈夫曼树 ∣ " <<" ∣ ∣ " <<" ∣ E---文件编码 ∣ " <<" ∣ ∣ " <<" ∣ D---文件译码 ∣ " <<" ∣ ∣ " <<" ∣ P---打印代码文件 ∣ " <<" ∣ ∣ " <<" ∣ T---印哈夫曼树 ∣ " <<" ∣ ∣ " <<" ∣ O---哈夫曼树的存储结构 ∣ " <<" ∣ ∣ " <<" ∣ Q---退出 ∣ " <<" ----------------------------------------------------- "; printf("选择菜单功能选项:"); } void output (HuffmanTree th,int n){ //输出哈夫曼树的存储结构 int i=0; cout<<"序号"<<" "<<"字符"<<" "<<"双亲"<<" "<<"左孩子"<<" "<<"右孩子"<<" "<<"权值"<<endl; for(;i<2*n-1;i++){ th++; cout<<i<<" "<<th->ch1<<" "<<th->parent<<" "<<th->lchild<<" "<<th->rchild<<" "<<th->weight <<endl; } } void initial(HuffmanTree &HT,HuffmanCode &HC,int w[],int &n,char ch[],int &k){ //创建哈夫曼树 cout<<"---------------------------------------------------- " <<" ∣ 1---自定义 ∣ " <<" ∣ ∣ " <<" ∣ 2---编码课本测试数据 ∣ " <<" ∣ ∣ " <<" ∣ 3---编码源程序 ∣ " <<" ----------------------------------------------------- "; printf("选择菜单功能选项:"); scanf("%d",&k); if(k==1){ printf("输入需要编码的字符总数: "); scanf("%d",&n); printf(" 输入需要编码字符的权值: "); for(int d=0;d<n;d++) { scanf("%d",&w[d]); } printf(" 输入需要编码的字符串: "); scanf("%s",ch); } else if(k==2){ ifstream fin2 ("test.txt"); fin2>>n; for(int d=0;d<n;d++) fin2>>w[d]; fin2>>ch; fin2.close(); } else if(k==3){ ifstream fin1 ("input.txt"); fin1>>n; for(int d=0;d<n;d++) fin1>>w[d]; fin1>>ch; fin1.close(); } if(n<=1) return; int s1,s2,i,num=2*n-1; HuffmanTree p; HT=(HuffmanTree)malloc((num+1)*sizeof(HTNode)); for(p=HT+1,i=1;i<=n;i++,p++){ p->weight=w[i-1]; p->lchild=0; p->parent=0; p->rchild=0; p->ch1 =ch[i-1]; } for(;i<=num;p++,i++){ p->weight=0; p->lchild=0; p->parent=0; p->rchild=0; p->ch1 ="$"; } for(i=n+1;i<=num;i++){ select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); char * temp=(char *)malloc(n*sizeof(char)); temp[n-1]=""; for(i=1;i<=n;i++){ int start=n-1; for(int f=HT[i].parent,h=i;f;h=f,f=HT[f].parent) if(HT[f].lchild==h) temp[--start]="0"; else temp[--start]="1"; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],&temp[start]); } ofstream fout ("hfmTree.txt"); fout<<ch<<endl; for(int j=1;j<=n;j++) fout<<HC[j]<<endl; fout.close(); free(temp); } void encoding(int n,int select){ //编码:对文件TobeTran.txt进行译码 char a[100],b[100][20]; ifstream fin ("hfmTree.txt"); fin>>a; for(int j=0;j<n;j++) fin>>b[j]; fin.close(); ifstream fin1 ("course.txt"); ifstream fin2 ("sorse.txt"); ifstream fin3 ("ToBeTran.txt"); char s[1000]; if(select==3) fin2>>s; else if(select==2) fin1>>s; else fin3>>s; ofstream fout ("CodeFile.txt"); while(s[0]!=""){ for(int i=0;s[i]!=" "&&s[i]!=""&&i<30;i++ ){ for(int g=0;a[g]!=s[i];g++) ; fout<<b[g]; } fout<<" "; if(select==3) fin2>>s; else if(select==2) fin1>>s; else fin3>>s; } fin3.close(); fin2.close(); fin1.close(); fout.close(); } void decoding(HuffmanTree ht,int n){ //译码:对CodeFile.txt文件进行译码 ifstream fin ("CodeFile.txt"); ofstream fout ("TextFile.txt"); char s[500]; fin>>s; HuffmanTree head=ht+2*n-1; int i=0; while(s[0]!=""){ while(s[i]!=""){ if(s[i]=="1") head=ht+head->rchild; else if(s[i]=="0") head=ht+head->lchild; if((head->lchild)==0&&(head->rchild) ==0) { fout<<(head->ch1); head=ht+2*n-1; } i++; } fout<<" " ; i=0; fin>>s; } fin.close(); fout.close(); } void Print(){ //打印代码文件,显示在终端,每行50个代码 ifstream fin ("CodeFile.txt"); char s[2000]; int j=0; int i=1; fin>>s; ofstream fout ("CodePrin.txt"); while(s[0]!=""){ for(;s[j]!="";j++){ printf("%c",s[j]); fout<<s[j]; if(i%50==0){ fout<<endl; printf(" "); } i++; } j=0; fin>>s; } fin.close(); printf(" "); fout.close(); } void printTree( HuffmanTree node,HuffmanTree node1, int level ) { //打印哈夫曼树形(在参数的传递上,是文科给自己提出的意见才很好的解决了之后的操作难题^^) if( node == NULL ) return; if( node1->rchild!=0) { printTree( node,node+node1->rchild, level + 1 ); } fstream fout ; fout.open ("TreePrint.txt",ios::in | ios::out|ios::ate);//这个挺有用的:在文件末尾加入内容 for( int i = 0; i < level; i++ ) { fout<<"|……"; printf( "……"); } fout<<node1->weight<<endl; printf( "%d ", node1->weight ); if( node1->lchild!=0 ) { printTree( node,node+node1->lchild, level + 1 ); } fout.close(); } void main(){ int select; int n; char ch[100]; int w[100]; HuffmanTree HT=NULL; HuffmanCode hc=NULL; prin(); char c="I"; scanf("%c",&c); while(c!="Q"){ switch(c){ case "I": initial(HT,hc,w,n,ch,select); prin(); break; case "E": encoding(n,select); prin(); break; case "D": decoding(HT,n); prin(); break; case "P": Print(); prin(); break; case "T": printTree(HT,HT+2*n-1,1); prin(); break; case "O": output(HT,n); prin(); break; } scanf("%c",&c); } }
简单的Huffman霍夫曼编码。用C语言实现。
#include<stdio.h>#include<conio.h>#include<iostream.h>#include<string.h>#include<stdlib.h>#defineMAXVALUE10000/*权值最大值*/#defineMAXLEAF30/*叶子最多个数*/#defineMAXNODEMAXLEAF*2-1/*结点数的个数*/#defineMAXBIT50/*编码的最大位数*/typedefstructnode/*结点类型定义*/{charletter;intweight;intparent;intlchild;intrchild;}HNodeType;typedefstruct/*编码类型定义*/{charletter;intbit[MAXBIT];intstart;}HCodeType;typedefstruct/*输入符号的类型*/{chars;intnum;}lable;voidHuffmanTree(HNodeTypeHuffNode[],intn,lablea[]){inti,j,m1,m2,x1,x2,temp1;chartemp2;for(i=0;i<2*n-1;i++)/*结点初始化*/{HuffNode[i].letter=0;HuffNode[i].weight=0;HuffNode[i].parent=-1;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;}for(i=0;i<n-1;i++)for(j=i+1;j<n-1;j++)/*对输入字符按权值大小进行排序*/if(a[j].num>a[i].num){temp1=a[i].num;a[i].num=a[j].num;a[j].num=temp1;temp2=a[i].s;a[i].s=a[j].s;a[j].s=temp2;}for(i=0;i<n;i++){HuffNode[i].weight=a[i].num;HuffNode[i].letter=a[i].s;}for(i=0;i<n-1;i++)/*构造huffman树*/{m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<n+i;j++)/*寻找权值最小与次小的结点*/{if(HuffNode[j].parent==-1&&HuffNode[j].weight<m1){m2=m1;x2=x1;m1=HuffNode[j].weight;x1=j;}elseif(HuffNode[j].parent==-1&&HuffNode[j].weight<m2){m2=HuffNode[j].weight;x2=j;}}HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i;/*权值最小与次小的结点进行组合*/HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;HuffNode[n+i].lchild=x1;HuffNode[n+i].rchild=x2;}}voidHuffmanCode(intn,lablea[]){HNodeTypeHuffNode[MAXNODE];HCodeTypeHuffCode[MAXLEAF],cd;inti,j,c,p;HuffmanTree(HuffNode,n,a);for(i=0;i<n;i++)/*按结点位置进行编码*/{cd.start=n-1;c=i;p=HuffNode[c].parent;while(p!=-1){if(HuffNode[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<n;j++)/*储存编码*/HuffCode[i].bit[j]=cd.bit[j];HuffCode[i].start=cd.start;}for(i=0;i<n;i++){HuffCode[i].letter=HuffNode[i].letter;printf("%c",HuffCode[i].letter);for(j=HuffCode[i].start+1;j<n;j++)printf("%d",HuffCode[i].bit[j]);printf(" ");}}intmain(){labledata[30];chars[100],*p;inti,count=0;for(;;){cout<<"/求哈夫曼编码,直到输入为end结束!/"<<endl;printf("Inputsomeletters:");scanf("%s",s);if(!strcmp(s,"end"))exit(0);for(i=0;i<30;i++){data[i].s=0;data[i].num=0;}p=s;while(*p)/*计算字符个数与出现次数(即权值)*/{for(i=0;i<=count+1;i++){if(data[i].s==0){data[i].s=*p;data[i].num++;count++;break;}elseif(data[i].s==*p){data[i].num++;break;}}p++;}printf(" ");printf("differentletters:%d ",count);for(i=0;i<count;i++){printf("%c",data[i].s);printf("weight:%d ",data[i].num);}HuffmanCode(count,data);count=0;}getch();}这是我们的软件实习答案,希望对你有帮助!
霍夫曼(Huffman)编码学习的重点和难点是什么
哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。 本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使用任何扩展动态库,比如STL或者组件。只使用简单的C函数,比如:memset,memmove,qsort,malloc,realloc和memcpy。 因此,大家都会发现,理解甚至修改这个编码都是很容易的。 背景 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。 编码使用 我用简单的C函数写这个编码是为了让它在任何地方使用都会比较方便。你可以将他们放到类中,或者直接使用这个函数。并且我使用了简单的格式,仅仅输入输出缓冲区,而不象其它文章中那样,输入输出文件。 bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen); bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen); 要点说明 速度 为了让它(huffman.cpp)快速运行,我花了很长时间。同时,我没有使用任何动态库,比如STL或者MFC。它压缩1M数据少于100ms(P3处理器,主频1G)。 压缩 压缩代码非常简单,首先用ASCII值初始化511个哈夫曼节点: CHuffmanNode nodes[511]; for(int nCount = 0; nCount < 256; nCount++) nodes[nCount].byAscii = nCount; 然后,计算在输入缓冲区数据中,每个ASCII码出现的频率: for(nCount = 0; nCount < nSrcLen; nCount++) nodes[pSrc[nCount]].nFrequency++; 然后,根据频率进行排序: qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare); 现在,构造哈夫曼树,获取每个ASCII码对应的位序列: int nNodeCount = GetHuffmanTree(nodes); 构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。 // parent node pNode = &nodes[nParentNode++]; // pop first child pNode->pLeft = PopNode(pNodes, nBackNode--, false); // pop second child pNode->pRight = PopNode(pNodes, nBackNode--, true); // adjust parent of the two poped nodes pNode->pLeft->pParent = pNode->pRight->pParent = pNode; // adjust parent frequency pNode->nFrequency = pNode->pLeft->nFrequency + pNode->pRight->nFrequency; 这里我用了一个好的诀窍来避免使用任何队列组件。我先前就直到ASCII码只有256个,但我分配了511个(CHuffmanNode nodes[511]),前255个记录ASCII码,而用后255个记录哈夫曼树中的父节点。并且在构造树的时候只使用一个指针数组(ChuffmanNode *pNodes[256])来指向这些节点。同样使用两个变量来操作队列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。 接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中: int nDesIndex = 0; // loop to write codes for(nCount = 0; nCount < nSrcLen; nCount++) { *(DWORD*)(pDesPtr+(nDesIndex>>3)) |= nodes[pSrc[nCount]].dwCode << (nDesIndex&7); nDesIndex += nodes[pSrc[nCount]].nCodeLength; } (nDesIndex>>3): >>3 以8位为界限右移后到达右边字节的前面 (nDesIndex&7): &7 得到最高位. 注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。 解压缩 解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中: int nDesIndex = 0; DWORD nCode; while(nDesIndex < nDesLen) { nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7); pNode = pRoot; while(pNode->pLeft) { pNode = (nCode&1) ? pNode->pRight : pNode->pLeft; nCode >>= 1; nSrcIndex++; } pDes[nDesIndex++] = pNode->byAscii; }
Huffman编码C语言实现
说明:本程序是依据严蔚敏的数据结构(C语言版)上的代码实现的。#pragmaonce#include<stdio.h>#include<tchar.h>#include<stdlib.h>#define MAX 100 typedefstruct{ //节点 int weight; int parent, lchild, rchild;}HTNode, *HuffmanTree; typedefchar **HuffmanCode; //字符串数组,用于存储叶子节点的编码 void SelectMinNode(HuffmanTree &HT, int m, int &i1, int &i2) //找出权值最小的两个节点对应的数组下标{ HuffmanTree p = HT; int s1, s2; s1 = s2 = MAX; i1 = i2 = 1; for(int i=1; i<=m; i++) { if(!(p+i)->parent) { if((p+i)->weight < s1) { i2 = i; s1 = (p+i)->weight ; } } } for(int i=1; i<=m; i++) { if(!(p+i)->parent && i!=i2) { if((p+i)->weight < s2) { i1 = i; s2 = (p+i)->weight ; } } }}void StrCopy(char *p, char *q, int start) //从字符数组中第start个字符开始复制{ char *c1, *c2; c1 = p; while(q[start] != "") { *c1 = q[start]; c1++; start++; } *c1 = q[start];//别忘了将‘ "复制过来}void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n){ //HT赫夫曼树节点数组,HC存储赫夫曼编码,*w 节点权值数组的首地址,n节点个数 int i, i1, i2, m; HuffmanTree p; if(n<=1) return; m = 2 * n -1; //n个叶子节点的赫夫曼树的节点总数为2n-1,可以结合树的度为n-1自己证明。 HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); //数组首元素不使用,故多分配一个空间 p = HT + 1; for(i=1;i<=n;++i,++p,++w) //n个叶子节点初始化 { p->weight = *w; p->lchild = 0; p->rchild = 0; p->parent = 0; } for(;i<=m;++i,++p) //非叶子节点初始化 { p->weight = 0; p->lchild = 0; p->rchild = 0; p->parent = 0; } for(i=n+1;i<=m;++i) //对非叶子节点重新计算 { SelectMinNode(HT, i-1, i1, i2); HT[i1].parent = i; HT[i2].parent = i; HT[i].lchild = i1; HT[i].rchild = i2; HT[i].weight = HT[i1].weight + HT[i2].weight ; } ///从叶子节点到根节点求赫夫曼编码 char* cd; int start, c, f; HC = (HuffmanCode)malloc((n+1)*sizeof(char*));//分配字符指针数组,同样多分配一个 cd = (char*)malloc(n*sizeof(char)); //零时变量,用于存储当前叶子节点的赫夫曼编码 cd[n-1] = ""; for(int i=1; i<=n; i++) { start = n-1; for(c=i,f=HT[i].parent; f!=0;c=f,f=HT[f].parent) { if(HT[f].lchild == c) cd[--start] = "0"; else cd[--start] = "1"; } HC[i] = (char*)malloc((n-start)*sizeof(char)); StrCopy(HC[i], cd, start); //将存储的编码copy给HC的第i个数组 } free(cd);}void PrintHuffmanCode(HuffmanTree HT, HuffmanCode HC, int n) //打印各节点的赫夫曼编码{ HuffmanCode p; for(int i=1; i<=n; i++) { p = HC; printf("The weight %d HuffmanCode is: ", HT[i]); while(*p[i]!="") { printf("%c",*p[i]); p[i]++; } printf(" "); }}void main(){ int n = 8; HuffmanTree HT; HuffmanCode HC; int a[8] = {5, 29, 7, 8, 14, 23, 3, 11};//信号源的概率分布,即P={p0, p1,…, pK-1} HuffmanCoding(HT, HC, a, n); PrintHuffmanCode(HT, HC, n); system("pause");}
霍夫曼(Huffman)编码背景及国内外研究现状
哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。 本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使用任何扩展动态库,比如STL或者组件。只使用简单的C函数,比如:memset,memmove,qsort,malloc,realloc和memcpy。 因此,大家都会发现,理解甚至修改这个编码都是很容易的。 背景 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。 编码使用 我用简单的C函数写这个编码是为了让它在任何地方使用都会比较方便。你可以将他们放到类中,或者直接使用这个函数。并且我使用了简单的格式,仅仅输入输出缓冲区,而不象其它文章中那样,输入输出文件。 bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen); bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen); 要点说明 速度 为了让它(huffman.cpp)快速运行,我花了很长时间。同时,我没有使用任何动态库,比如STL或者MFC。它压缩1M数据少于100ms(P3处理器,主频1G)。 压缩 压缩代码非常简单,首先用ASCII值初始化511个哈夫曼节点: CHuffmanNode nodes[511]; for(int nCount = 0; nCount < 256; nCount++) nodes[nCount].byAscii = nCount; 然后,计算在输入缓冲区数据中,每个ASCII码出现的频率: for(nCount = 0; nCount < nSrcLen; nCount++) nodes[pSrc[nCount]].nFrequency++; 然后,根据频率进行排序: qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare); 现在,构造哈夫曼树,获取每个ASCII码对应的位序列: int nNodeCount = GetHuffmanTree(nodes); 构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。 // parent node pNode = &nodes[nParentNode++]; // pop first child pNode->pLeft = PopNode(pNodes, nBackNode--, false); // pop second child pNode->pRight = PopNode(pNodes, nBackNode--, true); // adjust parent of the two poped nodes pNode->pLeft->pParent = pNode->pRight->pParent = pNode; // adjust parent frequency pNode->nFrequency = pNode->pLeft->nFrequency + pNode->pRight->nFrequency; 这里我用了一个好的诀窍来避免使用任何队列组件。我先前就直到ASCII码只有256个,但我分配了511个(CHuffmanNode nodes[511]),前255个记录ASCII码,而用后255个记录哈夫曼树中的父节点。并且在构造树的时候只使用一个指针数组(ChuffmanNode *pNodes[256])来指向这些节点。同样使用两个变量来操作队列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。 接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中: int nDesIndex = 0; // loop to write codes for(nCount = 0; nCount < nSrcLen; nCount++) { *(DWORD*)(pDesPtr+(nDesIndex>>3)) |= nodes[pSrc[nCount]].dwCode << (nDesIndex&7); nDesIndex += nodes[pSrc[nCount]].nCodeLength; } (nDesIndex>>3): >>3 以8位为界限右移后到达右边字节的前面 (nDesIndex&7): &7 得到最高位. 注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。 解压缩 解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中: int nDesIndex = 0; DWORD nCode; while(nDesIndex < nDesLen) { nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7); pNode = pRoot; while(pNode->pLeft) { pNode = (nCode&1) ? pNode->pRight : pNode->pLeft; nCode >>= 1; nSrcIndex++; } pDes[nDesIndex++] = pNode->byAscii; }
Huffman编码MATLAB实现
function [h,l]=huffman(p) if (length(find(p<0))~=0) error("Not a prob,negative component"); end if (abs(sum(p)-1)>10e-10) error("Not a prob.vector,component do not add to 1") end n=length(p); q=p; m=zeros(n-1,n); for i=1:n-1 [q,l]=sort(q); m(i,:)=[l(1:n-i+1),zeros(1,i-1)]; q=[q(1)+q(2),q(3:n),1]; end for i=1:n-1 c(i,:)=blanks(n*n); end c(n-1,n)="0"; c(n-1,2*n)="1"; for i=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))... -(n-2):n*(find(m(n-i+1,:)==1))); c(n-i,n)="0"; c(n-i,n+1:2*n-1)=c(n-i,1:n-1); c(n-i,2*n)="1"; for j=1:i-1 c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,... n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1)); end end for i=1:n h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n); ll(i)=length(find(abs(h(i,:))~=32)); end l=sum(p.*ll); hl 参考资料:赵永强
霍夫曼编码(Huffman Coding)
如果一个码的任何一个码字都不是其他码字的前缀,称为前缀码, 也称即时码. 即时码的特点: 1. 唯一可译 2. 译码时没有延时. 二进制霍夫曼编码步骤: References : <信息论与编码> 陈运主编 第二版 http://baike.baidu.com/link?url=_1Ns4TTbQI-iCCK18Gog5DGdvbFG9tnh_a1hgaqJ2sgU3-zAm29XtjZIuwiJPnKdSurwx055cwYgv4ueFhiKFK
Huffman编码
这个是一个简单的,没有文件导入,需要编码的是自己输入的数组,你将它换成文件读取基本就可以实现对文章中的字符进行Huffman编码,这是我自己曾经做的一个程序,是VC6.0的,没有解码部分,解码部分你反过来推一下算法然后编一下代码就可以了。我还有一个是文件是用matlab作的huffman编码,你要的话给我邮箱,我给你发过去。#include<iostream.h>#include<string.h>#define N 100typedef struct{ int wei; //权值 int prt; //父节点 int lch; //左子节点 int rch; // 右子节点 int tmp; //中间变量,tmp=0 还未进行遍历 tmp=1 已近进行过向左遍历 tmp=2 已经进行过左右遍历 向上找到节点 char code[N];}huffmantree;void input();void print(huffmantree );void select(huffmantree *HT,int n,int &i,int &j){ int k; i=1; while(HT[i].prt!=0) { i++; } for(k=i+1;k<=n;k++) { if((HT[k].prt=0)&&(HT[k].wei <HT[i].wei)) i=k; } j=1; while((j==i)||(HT[j].prt!=0)) { j++; } for(k=j+1;k<=n;k++) { if((HT[k].prt=0)&&k!=i&&HT[k].wei<HT[j].wei) j=k; }}void huffman(int w[],huffmantree *HT,int n) //w存放n个字符的权值{ int m=2*n-1; int i,k,j; huffmantree *p=0; for(p=HT+1,i=1;i<=m;i++,p++) { HT[i].prt=0; HT[i].lch=0; HT[i].rch=0; } for(p=HT+1,i=1;i<=n;i++,p++) { HT[i].wei=w[i-1]; } for(p=HT+n+1,i=n+1;i<=m;i++,p++) { HT[i].wei=0;} for(k=n+1;k<=m;k++) { select(HT,k-1,i,j); // 找最小值和次小值的位置 HT[i].prt=k,HT[j].prt=k; // 找到i j 的父节点付给k HT[k].lch=i,HT[k].rch=j; // 父节点的左右指针分别指向i, j HT[k].wei=HT[i].wei+HT[j].wei; }}void huffmancoding(huffmantree *HT,int n) //n个叶子结点的huffman编码 从根节点开始编码{ int BT=2*n-1; int m=BT; int l,r,p; char s1[100]="0",s2[100]="1"; for(int i=0;i<=m;i++) //中间变量赋初值 { HT[i].tmp=0; } strcpy(HT[m].code," "); while(1) { l=HT[BT].lch; r=HT[BT].rch; p=HT[BT].prt; if(p==0&&HT[BT].tmp==2) break; if(l==0||r==0) { HT[BT].tmp=2; //如果是叶子结点则给中间变量赋值2向上返回一节结点 } if(HT[BT].tmp==0) //未进行过遍历,开始向左遍历 { HT[BT].tmp=1; //已经进行过向左遍历 l=HT[BT].lch; strcpy(HT[l].code,HT[BT].code); strcat(HT[l].code,s1); BT=l; } else if(HT[BT].tmp==1) { HT[BT].tmp=2; r=HT[BT].rch; strcpy(HT[r].code,HT[BT].code); strcat(HT[r].code,s2); BT=r; } else if(HT[BT].tmp==2) { p=HT[BT].prt; BT=p; } }}void print(huffmantree HT[],int n) //总共n个叶子节点{ int i; cout<<"源码:"<<endl; for(i=1;i<=n;i++) cout<<HT[i].wei<<endl; cout<<"Huffman编码:"<<endl; for(i=1;i<=n;i++) { cout<<HT[i].code<<endl; }}void input(int w[],int n){ int t,*p; int i=0; cout<<"对应的输入源码出现权值:(以-1结束)"<<endl; cin>>t; while(t>=0) { p=new int; *p=t; w[i]=*p; i++; cin>>t; }}void main(){ int n,m; cout<<"输入源码个数:"; cin>>n; int *w; w=new int[n+1]; input(w,n); m=2*n-1; huffmantree *HT; HT=new huffmantree[m+1]; huffman(w,HT,n); huffmancoding(HT,n); print(HT,n); delete w,HT;}
huffman平均码长
编码如下: x1:0 x2:10 x3:110 x4:1110 x5:11110 x6:11111 平均码长为0.3*1+0.25*2+0.2*3+0.1*4+0.1*5+0.05*5=2.55 过程为用频数小的相加,得新的二叉数和剩下的数中最小的比较,然后组成新树,依次类推,可得huffmantree,就可写出编码
用 Matlab 进行哈弗曼(Haffman)编码?
Matlab自带Huffman函数(ps:你拼写错了)huffmandeco Huffman decoderhuffmandict Generate Huffman code dictionary for a source with known probability modelhuffmanenco Huffman encoder密码生成:symbols = [1 2 3]; % Data symbolsp = [0.1 0.1 0.8]; % Probability of each data symboldict = huffmandict(symbols,p) % Create the dictionary.dict{1,:} % Show one row of the dictionary.加密解密:sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50); % Data to encodesymbols = [1 2 3]; % Distinct data symbols appearing in sigp = [0.1 0.1 0.8]; % Probability of each data symboldict = huffmandict(symbols,p); % Create the dictionary.hcode = huffmanenco(sig,dict); % Encode the data.dhsig = huffmandeco(hcode,dict); % Decode the code.
Huffman 编码
Huffman 编码c1:01c2:10c3:11c4:000c5:001
E.T.A.Hoffmann的德语小说《Der Sandmann》主要是讲的什么,故事大概说明一下
故事可分为两部分:第一部分以三封信开头,引出了三个人物:主人公纳塔内尔、他的未婚妻克拉拉以及克拉拉的哥哥罗塔。主人公给罗塔写信,信中提到了自己最近惶恐不安的原因:他认为自己最近遇到的晴雨表小贩科波拉是当年杀害父亲的“沙人”考普留斯,这次偶遇将成为不幸的开始。在信件中主角回忆了自己儿时的遭遇,儿时保姆讲述的“沙人”的恐怖故事,以及由于偷窥父亲和考普留斯的秘密实验被发现后造成的童年的创伤——他对考普留斯和失去眼睛的恐惧根植于此。此后父亲在实验中的离奇去世更让主角确信了考普留斯就是“沙人”,是不幸的罪魁祸首。误收到信件的克拉拉认为主角的父亲的死亡事件只是意外,并仔细探讨了“神秘力量”的存在问题,她劝导纳塔内尔不要继续为此忧郁。纳塔内尔回信为自己辩护,顺便提到大学教授斯帕兰扎尼和他奇怪的女儿奥琳匹娅。第二部分第三人称叙事者出现。自称主角朋友的叙述者以第三人称继续讲述故事。他先是对第一部分三个人物的关系进行补充,之后连上纳塔内尔放假回家后的情节:纳塔内尔变得忧郁,始终因为“沙人”事件焦虑不安,克拉拉与主角的爱情出现裂痕,两人分歧越来越大。回到大学后纳塔内尔痴迷用从科波拉那里买来的望远镜观察教授的女儿、神秘的奥琳匹娅,之后更是疯狂地爱上了这位美丽的女子,想向她求婚。最终发现奥琳匹娅竟是自动机器人后,主角失去理智,陷入疯狂。从疯人院出院后,在游览城市、登塔看风景时再次发疯,最终坠塔死亡。