当前位置:首页 » 操作系统 » 哈氏算法

哈氏算法

发布时间: 2022-06-27 22:43:54

Ⅰ 什么是哈夫曼算法

有一种树形结构叫哈夫曼树,用哈夫曼树的方法解编程题的算法就叫哈夫曼算法,其实也没有哈夫曼算法这个专有名词了拉,你这么问我就这么跟你讲把。它产生的代码是
#include"stdio.h"
#include"stdlib.h"
#include"string.h"

typedef char ElemType;
typedef struct
{
ElemType elem;
unsigned int m_weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;

typedef char** HuffmanCode;
typedef int Status;
typedef struct weight
{
char elem;
unsigned int m_weight;
}Weight; // save the information of the symbolizes;

void HuffmanCoding(HuffmanTree *,HuffmanCode *,Weight *,int);
void Select(HuffmanTree,int,int *,int *);
void OutputHuffmanCode(HuffmanTree,HuffmanCode,int);

Status main(void)
{
HuffmanTree HT;
HuffmanCode HC;
Weight *w;
char c; // the symbolizes;
int i,n; // the number of elements;
int wei; // the weight of a element;

printf("input the tatol number of the Huffman Tree:" );
scanf("%d",&n);
w=(Weight *)malloc(n*sizeof(Weight));
for(i=0;i<n;i++)
{
printf("input the element & its weight:");
scanf("%1s%d",&c,&wei);
w[i].elem=c;
w[i].m_weight=wei;
}

HuffmanCoding(&HT,&HC,w,n);
OutputHuffmanCode(HT,HC,n);
return 1;

}

void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,Weight *w,int n)
{
int i,m,s1,s2,start,c,f;
char *cd;
HuffmanTree p;
if(n<=1)
return;

m=2*n-1;
(*HT)=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;++i)
{
(*HT)[i].elem=w[i-1].elem;
(*HT)[i].m_weight=w[i-1].m_weight;
(*HT)[i].parent=(*HT)[i].lchild=(*HT)[i].rchild=0;
}

for(;i<=m;++i)
{
(*HT)[i].elem='0';
(*HT)[i].m_weight=(*HT)[i].parent=(*HT)[i].lchild=(*HT)[i].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].m_weight=(*HT)[s1].m_weight+(*HT)[s2].m_weight;
}

(*HC)=(HuffmanCode)malloc(n*sizeof(char*));
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));
strcpy((*HC)[i],&cd[start]);
}
}

void Select(HuffmanTree HT,int n,int *s1,int *s2)
{
int i;
(*s1)=(*s2)=0;
for(i=1;i<=n;i++)
{
if(HT[i].m_weight<HT[(*s2)].m_weight&&HT[i].parent==0&&(*s2)!=0)
{
if(HT[i].m_weight<HT[(*s1)].m_weight)
{
(*s2)=(*s1);
(*s1)=i;
}
else (*s2)=i;

}

if(((*s1)==0||(*s2)==0)&&HT[i].parent==0)
{
if((*s1)==0) (*s1)=i;
else if((*s2)==0)
{
if(HT[i].m_weight<HT[(*s1)].m_weight)
{
(*s2)=(*s1);
(*s1)=i;
}
else (*s2)=i;
} // end of else if
} // end of if
} // end of for

if((*s1)>(*s2))
{
i=(*s1);
(*s1)=(*s2);
(*s2)=i;
}
return;
}

void OutputHuffmanCode(HuffmanTree HT,HuffmanCode HC,int n)
{
int i;
printf("\nnumber---element---weight---huffman code\n");
for(i=1;i<=n;i++)
printf(" %d %c %d %s\n",i,HT[i].elem,HT[i].m_weight,HC[i]);
}

Ⅱ 哈夫曼算法的概述

1.初始化: 根据给定的n个权值{w1,w2,…wn}构成n棵二叉树的集合F={T1,T2,..,Tn},其中每棵二叉树Ti中只有一个带权wi的根结点,左右子树均空。
2. 找最小树:在F中选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且至新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
3. 删除与加入:在F中删除这两棵树,并将新的二叉树加入F中。
4. 判断:重复前两步(2和3),直到F中只含有一棵树为止。该树即为哈夫曼树

Ⅲ 哈夫曼算法的定义

定义:它是由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。
因为这种树最早由哈夫曼(Huffman)研究,所以称为哈夫曼树,又叫最优二叉树。

Ⅳ 本人没有学过高等数学,是否可以通俗的解释一下哈系算法(hash)SHA-256的原理,最好能够具体点!谢谢!

【哈希算法】在【数据结构】课程里面有提及,它是散列表查找中的一种思想,当然与编程紧密相连。
能力有限,无法解释通透~~

Ⅳ 哈夫曼算法

计算过程如图所示:

Ⅵ 算法有哪些分类

算法分类编辑算法可大致分为:

基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。

Ⅶ 请描述哈夫曼算法,并用图描述构造哈夫曼树的过程。

1. 根据给定的n个权值{w1,w2,…wn}构成n棵二叉树的集合F={T1,T2,..,Tn},其中每棵二叉树Ti中只有一个带权wi的根结点,左右子树均空。
2. 在F中选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
3. 在F中删除这两棵树,并将新的二叉树加入F中。
4. 重复前两步(2和3),直到F中只含有一棵树为止。该树即为哈夫曼树
帮你贴过来了,网络
这东西实际用法是可以减少树的访问次数,因为他把频率高的点放在比较靠近根节点的地方,频率低的在下面,这样访问速度快。举个例子,比如四个点,他们的使用频率分别是1,2,3,4,然后构成的树就是
4
0 3
0 2
0 1
补:打不出树形结构...

Ⅷ 哈夫曼树算法

题目的阐述:以N进制编码方式对一个英文字串中的字符进行编码,每个不同的字符其编码不同.使得由新的编码替代原串后总码长最小,且输入0,1,2,...,N-1构成的数字串后,依照该编码方式可以正确的对译出唯一的英文原串.如:N=3英文原串为ABBCBADDACE其对应的一种编码方式为A:00B:01C:020D:021E:022原串对译后的编码为000101020010002102100020022其码长为27若输入编码串0102002200则对应的英文原串为BCEA 分析: 假设英文原串中的字符存放于字符集S中,‖S‖=X,每个字符在字串中出现的概率为W[i],L[i]为字符i的编码长.依题意得,对S集合中的不同字符进行N进制编码后要求1)新字串的码长最短WPL=∑W[i]*L[i]
(i∈1..X)使得在WPL是所有编码方式中的最小值2)编码无二义性任意一字符编码都不为其它字符编码的前缀 此题以哈夫曼树来解答是非常适宜的.N为此哈夫曼树的分叉数,S字符集里的元素即为此N叉哈夫曼树的叶子,概率W[i]即为叶子结点的权重,从根结点到各叶子结点的路径长即为该叶子结点的编码长L[i].由哈夫曼树的思想可以知道哈夫曼树的建立是一步到位的贪心法,即权重越大的结点越靠近该树的根,这样,出现频率越大的字符其编码就越短.但具体应该怎样建立起此N叉哈夫曼树呢?我们首先以N=2为例:S={A,B,C,D}W=[3,1,2,1]首先从W中选出两个最小权,1,1,将其删去,并以2(即1+1)替代W=[3,2,2];再从新的W中取出两个最小权,2,2,将其删去,并以4(即2+2)替代W=[3,4];依此类推,直到W中只一个值时合并结束,此时W=[7]以上两两合并的过程即为二叉哈夫曼树的建立过程,每一次的合并即是将两棵子树归于一个根结点下,于是可以建立二叉树如下: m0åæ1mmA0åæ1mmC0åæ1mmBD MIN-WPL=3*1+1*3+2*2+1*3=13 从某一根结点出发走向其左子树标记为0,走向其右子树标记为1,则可以得到以下编码A,B,C,D对应的编码为A:0B:110C:10D:111
N=3时又是怎样一种情况呢?设S={A,B,C,D,E}W=[7,4,2,5,3}则按权重排序可得S={D,B,E,C,A}W=[7,5,4,3,2]那么此哈夫曼树的树形应为怎样呢?是以下的左图,还是右图,或是两者均不是mmåâæåæmmllmåæåæCAåælllllmADBEDåæ
lmBåællEC 显然,要带权路径长WPL最短,那么,此树的高度就应尽可能的小,由此可知将此树建成丰满N叉树是最合理的,于是我们尽量使树每一层都为N个分枝.对于这道题的情况,我们具体来分析.按照哈夫曼树的思想,首先从W中取出权最小的三个值,即2,3,4,并以9(2+3+4)来代替,得到新的W=[9,7,5];再将这三个值合并成9+7+5=21这个结点.于是得到三叉哈夫曼树如下:måâællmDBåâælllECAWPL=1*7+1*5+2*2+2*3+2*4=30以0..N-1依次标记每个根结点的N个分枝,则可以得到每个字符相对应的编码:A:22B:1C:21D:0E:20我们发现对于这种情况恰巧每层均为N个分枝,但事实上并非所有的N叉哈夫曼树都可得到每层N个分枝.例于当N=3,‖S‖=6时就不可能构成一棵每层都为三个分枝的三叉树.如何来处理这种情况呢?最简单的处理方式就是添加若干出现概率为0的空字符填补在N叉树的最下一层,这些权为0的虚结点并无实际意义但却非常方全便于这棵N叉树的建立.空字符的添加个数add的计算如下:Y=‖S‖mod(n-1)add=0(Y=1)add=1(Y=0)add=N-Y(Y>1) 虚结点的加入使得权重最小的N-add个字符构成了距根结点最远的分枝,使其它字符构成的N叉树保持了丰满的N叉结构.例:N=3S={A,B,C,D,E,F}W=[1,2,3,4,5,6}则y:=6mod(3-1)=0add=1于是构成N叉树如下:­为虚结点¡åâællmFEåâællmDCåâæBA­WPL=1*6+1*5+2*4+2*3+3*2+3*1+3*0=33对应编码为:A:221B:220C:21D:20E:1F:0

Ⅸ 本人没有学过高等数学,不知可有高手用最通俗的方法阐述什么是哈系算法(hash)

比如字典里按笔画数来查字,或是KTV里按歌名分三字歌,四字歌等,这样的一个把字转成笔画数或歌名分类的算法可以比喻成非常简单的哈希算法。

哈希算法不可逆:就好比“大”字变成笔画数后是3一样,你不能通过3来确定它就是大字。
哈希算法用于校验:好比“大”字是3画,你要是改变了这个字,变成了“太”字,于是结果是4画,从而你知道这个字被改动了。

哈希算法的碰撞:比如“大”“小”变成笔画后都是3,这就是产生了碰撞。

当然这上面的比喻是非常浅显的,也不是非常切合,只是助于理解一下概念。

热点内容
网页无法上传照片 发布:2024-05-22 04:34:04 浏览:193
奇特解压图解大全 发布:2024-05-22 04:04:38 浏览:648
学php8 发布:2024-05-22 03:56:56 浏览:739
紫米的充电宝wifi密码是多少 发布:2024-05-22 03:25:12 浏览:71
车内搞笑配置有哪些 发布:2024-05-22 03:16:03 浏览:892
php当前时间时间戳 发布:2024-05-22 02:59:58 浏览:200
dota未加密 发布:2024-05-22 02:55:09 浏览:928
java程序试题 发布:2024-05-22 02:50:09 浏览:57
android查看数据库工具mac 发布:2024-05-22 02:35:43 浏览:376
更改服务器地址有问题吗 发布:2024-05-22 02:17:58 浏览:42