设密码电文是由8个字母组成,每个字母在电文中出现的频率分别是7,19,2,6,32,3,21,10写出哈夫曼编码
霍夫曼树...还不懂!
1100 00 11110 1110 10 11111 01 1101
O/ \
/ \
/ \
/ \
(53) (40)
/ \ / \
/ \ / \
(32) (21) (21) (19)
/ \
/ \
(11) (10)
/ \
(6) (5)
/ \
(3) (2)
生成的赫夫曼树,根据左节点为0 右节点为1,从根到叶子的最短路径 如概率32的那个字符可以用00 概率21的那个01 ,概率19的11,概率3 的那个表示成10011.
还有//------------------头文件-------------------------------
#i nclude<iostream.h>
#i nclude<iomanip.h>
#i nclude<string.h>
#i nclude<ctype.h>
#i nclude<malloc.h>
#i nclude<stdio.h>
#i nclude<process.h>
typedef int TElemType;
int UINT_MAX=32767;
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,* HuffmanTree;
typedef char **HuffmanCode;
//-----------采用全局变量-----------------------
HuffmanTree HT;
HuffmanCode HC;
int *w,i,j,n;
char *z;
int flag=0;
//------------------清空键盘缓冲区---------------
//void Clear_Key_Buffer(void)
//{int offset;
//offset=peek(0x40,0x1a);
//pokeb(0x40,0x1c,offset);
//}
// -----------------求赫夫曼编码-----------------------
int min(HuffmanTree t,int i)
{ // 函数void select()调用
int j,flag;
unsigned int k=UINT_MAX; // 取k为不小于可能的值
for(j=1;j<=i;j++)
if(t[j].weight<k&&t[j].parent==0)
k=t[j].weight,flag=j;
t[flag].parent=1;
return flag;
}
//--------------------slect函数----------------------
void select(HuffmanTree t,int i,int &s1,int &s2)
{ // s1为最小的两个值中序号小的那个
int j;
s1=min(t,i);
s2=min(t,i);
if(s1>s2)
{
j=s1;
s1=s2;
s2=j;
}
}
// --------------算法6.12--------------------------
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{ // w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
int m,i,s1,s2,start;
unsigned c,f;
HuffmanTree p;
char *cd;
if(n<=1)
return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
(*p).parent=0;
for(i=n+1;i<=m;++i) // 建赫夫曼树
{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,s1,s2);
HT[s1].parent=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*));
// 分配n个字符编码的头指针向量([0]不用)
cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间
cd[n-1]='\0'; // 编码结束符
for(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));
// 为第i个字符编码分配空间
strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC
}
free(cd); // 释放工作空间
}
//--------------初始化赫夫曼链表---------------------------------
void init()
{
flag=1;
int num;
int num2;
/*char *num;
num=(char*)malloc(100*sizeof(char));
char *numBuffer;
numBuffer=(char*)malloc(100*sizeof(char));*/
cout<<"下面初始化赫夫曼链表"<<endl<<"请输入权值或字符的个数n(n>1且注意:必须以回车结束):";
/*shoud Clear_Key_Buffer;
gets(numBuffer);
gets(num);*/
cin>>num;
/*while(!(((int)(*num)>48&&(int)(*num)<=57)&&*(num+1)=='\0')&&!(((int)(*num)>48&&(int)(*num)<=57)&&((int)(*(num+1))>48&&(int)(*(num+1))<=57)&&*(num+2)=='\0'))
{
cout<<"bad guy!read and input again"<<endl;
gets(num);
}
if(*(num+1)=='\0')n=(int)(*num)-48;
else n=((int)(*num)-48)*10+(int)(*(num+1))-48;*/
n=num;
w=(int*)malloc(n*sizeof(int));
z=(char*)malloc(n*sizeof(char));
cout<<"\n请依次输入"<<n<<"个字符(字符型)\n注意:必须以回车结束:"<<endl;
//char *base;
char base[2];
//base=(char*)malloc(100*sizeof(char));
for(i=0;i<=n-1;i++)
{
cout<<endl<<"第"<<i+1<<"个字符:";
gets(base);
/*while(*(base+1)!='\0')
{
cout<<"bad guy!read and input again"<<endl;
gets(base);
}*/
*(z+i)=*base;
}
for(i=0;i<=n-1;i++)
{
cout<<setw(6)<<*(z+i);
}
cout<<"\n请依次输入"<<n<<"个权值(\n注意:必须以回车结束):"<<endl;
for(i=0;i<=n-1;i++)
{
cout<<endl<<"第"<<i+1<<"个字符的权值:";
cin>>num2;
*(w+i)=num2;
/*gets(base);
//--------报错重输语句-------------------------------
while(((int)(*base)<=48||(int)(*base)>57))
{
cout<<"bad guy!read and input again"<<endl;
gets(base);
}
while(((int)(*base)>48&&(int)(*base)<=57)&&((int)(*(base+1))<48||(int)(*(base+1))>57)&&*(base+1)!='\0')
{
cout<<"bad guy!read and input again"<<endl;
gets(base);
}
while((((int)(*base)>48&&(int)(*base)<=57)&&((int)(*(base+1))>=48&&(int)(*(base+1))<=57)&&((int)(*(base+2))<48||(int)(*(base+2))>57))&&*(base+2)!='\0')
{
cout<<"bad guy!read and input again"<<endl;
gets(base);
}
while(((int)(*base)>48&&(int)(*b+ase)<=57)&&((int)(*(base+1))>=48&&(int)(*(base+1))<=57)&&((int)(*(base+2))>=48&&(int)(*(base+2))<=57)&&*(base+3)!='\0')
{
cout<<"bad guy!read and input again"<<endl;
gets(base);
}
if(*(base+1)=='\0')*(w+i)=(int)(*base)-48;
else if(*(base+2)=='\0') *(w+i)=((int)(*base)-48)*10+(int)(*(base+1))-48;
else *(w+i)=((int)(*base)-48)*100+((int)(*(base+1))-48)*10+(int)(*(base+2))-48;*/
}
HuffmanCoding(HT,HC,w,n);
//------------------------打印编码-------------------------------------------
cout<<endl<<"字符对应的编码为:"<<endl;
for(i=1;i<=n;i++)
{
//cout<<"字符"<<*(z+i-1)<<"的编码";
puts(HC[i]);。
3.假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0....
假设这八个字母分别为:A、B、C、D、E、F、G、H,对应的频率为7、19、2、6、32、3、21、10。A(0010)B(10)C(00000)D(0001)E(01)F(00001)G(11)H(0011)赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,...
1.假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为...
在此以前,汉语声母没有专门的名称,人们用双声来表示声母,反切上字与被切字双声,表明两字有相同的声母。唐末僧人从梵文字母得到启发,给每一声类规定了一个代表字,这就是字母。敦煌出土守温字母残卷列“不芳并明??”30字母,后来有人“益以‘娘床邦滂微奉'六母”,就有36字母。
8个字符密码怎么设置
1、设置密码的时候,需要输入8个字符,一般来说,这里指的字符不包括汉字,而是通过英文输入法可以在键盘上直接输入的数字,字母,特殊字符等。2、数字: 键盘上方的0~9;字母:英文大写字母A~Z和英文小写字母a~z;特殊符号:常见的特殊符号包括:空格,~ ` ! @ # $ % ^ & * ( ) _ - + =...
假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别_百 ...
(1) 将w1、w2、wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加入森林;(4)重复(2)、(3)步,直到森林中只剩一...
8个字符密码怎么设置
1、设置密码的时候,需要输入8个字符,一般来说,这里指的字符不包括汉字,而是通过英文输入法可以在键盘上直接输入的数字,字母,特殊字符等。2、数字: 键盘上方的0~9;字母:英文大写字母A~Z和英文小写字母a~z;特殊符号:常见的特殊符号包括:空格,~ ` ! @ # $ % ^ ' ? \/ > . < , ...
8个字符密码怎么设置密码要8位怎么设置
1、设置密码的时候,需要输入8个字符,一般来说,这里指的字符不包括汉字,而是通过英文输入法可以在键盘上直接输入的数字,字母,特殊字符等。2、数字:键盘上方的0~9;字母:英文大写字母A~Z和英文小写字母a~z;特殊符号:常见的特殊符号包括:空格,~`!@#$%^&*_-+=|\\}]{[:;'?\/>.3、设置...
密码必须至少包含8个符,其中包括以下至少两种字符:大写字母、小写字母...
大写字母+小写字母 大写字母+数字 大写字母+符号 小写字母+数字 小写字母+符号 数字+符号 大写字母+小写字母+数字 大写字母+小写字母+符号 大写字母+数字和符号 小写字母+数字+符号 大写字母+小写字母+数字+符号 以上的组合,长度大于等于8个就行了 至少8-16个字符,至少1个大写字母,1个小写字母和1...
1.假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为...
在此以前,汉语声母没有专门的名称,人们用双声来表示声母,反切上字与被切字双声,表明两字有相同的声母。唐末僧人从梵文字母得到启发,给每一声类规定了一个代表字,这就是字母。敦煌出土守温字母残卷列“不芳并明……”30字母,后来有人“益以‘娘床邦滂微奉'六母”,就有36字母。
假定用于通讯的电文由8个字母ABCDEFGH组成。各字母在电文中出现的概率为...
typedef struct hauman { int data;int parent,ld,rd;}hcode;int w[]={7,19,2,6,32,3,21,10};void hum(hcode ht[],int n,int w[]){ int i, j,z;for(i=0;i<2*n;i++)\/\/初始化 { h[i].parent=h[i].ld=h[i]=0;if(i<n){h[i].data=w[i];} else { h...
8-10位字符!由字母大小写,数字,特殊符号三种以上组合是什么意思?
登录网站、电子邮箱和银行取款时输入的“密码”其实严格来讲应该仅被称作“口令”,因为它不是本来意义上的“加密代码”,但是也可以称为秘密的号码。其主要限定于个别人理解(如一则电文)的符号系统。如密码电报、密码式打字机。密码是按特定法则编成,用以对通信双方的信息进行明密变换的符号。换而言之...
谷申可氟: 11111111 110 11111110 1111110 11110 1110 10 111110
铁力市15366813997: 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别 - ?
谷申可氟: 平均码长=(4*0.09+3*0.15+4*0.04+4*0.07+2*0.28+4*0.08+2*0.21+3*0.18)/1.1=2.81.假设有n个权值,则构造出的哈夫曼树有n个叶子结点.n个权值分别设为 w1、w2、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、wn看成是有n 棵树的...
铁力市15366813997: 密码必须包括8个字符是什么意思 - ?
谷申可氟: 这句话的意思是当前所设的密码的长度不得少于8个字符. 出于安全考虑,很多安全系统的密码都会有一个密码长度限制,一般情况下最短长度不得少于8个字符. 设置密码时最好是用字母、数字、大小写、特殊符号混排,不要使用生日或电话号码之类做密码,这种内容的密码被破解的概率最大.
铁力市15366813997: 假设用于通信的电文由字符集{a,b,c,d,e,f,g,h,}中的字母构成,这8个字母在电文中出现的 - ?
谷申可氟: 题目:假设用于通信的电文由字符集{a,b,c,d,e,f,g,h,}中的字母构成,这8个字母在电文中出现的 频率分别为: {0.19, 0.21, 0.02, 0.03, 0.06, 0.07, 0.1, 0.32}.要求:画出哈夫曼树. 我从课本上面摘抄了一个题目,题目大概是上面这样的,我们这里只是详细的说明一下哈弗曼树要怎么构建.借用一下这个题目.分析:我们这里直接将小数整数化,容易看出大小来. 原文地址:http://blog.csdn.net/qingdujun/article/details/16860297
铁力市15366813997: 假设用于通讯的电文仅由8个字母e,b,f,d,g,a,c,h组成,字母在电文中出现的频率分别为:7,33,5,20,3,14 - ?
谷申可氟: 左边是哈夫曼编码,右边是哈夫曼树.自学成才!渣油!
铁力市15366813997: 哈夫曼编码码长怎么算 - ?
谷申可氟:[答案] 假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}.(1)为这8个字母设计哈夫曼编码.(2)若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编...
铁力市15366813997: c语言编译!给电文加密.加密规则是对于每一个字符,如果是字母,变换成其相应的其后 给电文加密.加密规则是对于每一个字符,如果是字母,变换成其相应... - ?
谷申可氟:[选项] A. 紧跟在Z的后面)的第4个字母.例如A变成E,a变成e,W变成A,X变成 B. ,Y变成 C. ,Z变成 D. 如果不是字母,则不进行变换. 输入格式 输入一行字符. 输出 输出相应的密码. 请注意行尾输出换行.
铁力市15366813997: c语言 密码电文 - ?
谷申可氟: 不好意思,刚才写的程序有点错误:现更正如下:(请编译人员不要删除!)#include <stdio.h>#include <string.h>#define N 100 void main() { char s[N]; int i; int a; printf("Input String:"); scanf("%s",s); for(i=0;i<=strlen(s);i++) { if(s[i]>='A'&&s[i]<='Z') s[i]=26-s[i]+64+1+64; else if(s[i]>='a'&&s[i]<='z') s[i]=26-s[i]+96+1+96; } printf("%s\n",s); }