- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
void CreateHT(HTNode ht[],int n) { int i,j,k,lnode,rnode; float min1,min2; for (i=0;i2*n-1;i++) /*所有结点的相关域置初值-1*/ ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n;i2*n-1;i++) /*构造哈夫曼树*/ { min1=min2=32767; lnode=rnode=-1; for (k=0;k=i-1;k++) if (ht[k].parent==-1)/*未构造二叉树的结点中查找*/ { if (ht[k].weightmin1) { min2=min1;rnode=lnode; min1=ht[k].weight;lnode=k; } else if (ht[k].weightmin2) { min2=ht[k].weight;rnode=k; } } /*if*/ ht[lnode].parent=i;ht[rnode].parent=i; ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode;ht[i].rchild=rnode; } } 7.8.3 哈夫曼编码 具体构造方法如下:设需要编码的字符集合为{d1,d2,…,dn},各个字符在电文中出现的次数集合为{w1,w2,…,wn},以d1,d2,…,dn作为叶结点,以w1,w2,…,wn作为各根结点到每个叶结点的权值构造一棵二叉树,规定哈夫曼树中的左分支为0,右分支为1,则从根结点到每个叶结点所经过的分支对应的0和1组成的序列便为该结点对应字符的编码。这样的编码称为哈夫曼编码。 对应的哈夫曼编码如下: 1:000 3:001 5:01 7:1 为了实现构造哈夫曼编码的算法,设计存放每个结点哈夫曼编码的类型如下: typedef struct { char cd[N]; /*存放当前结点的哈夫曼码*/ int start; /*存放哈夫曼码在cd中的起始位置*/ } HCode; 根据哈夫曼树求对应的哈夫曼编码的算法如下: void CreateHCode(HTNode ht[],HCode hcd[],int n) { int i,f,c; HCode hc; for (i=0;in;i++) /*根据哈夫曼树求哈夫曼编码*/ { hc.start=n;c=i; f=ht[i].parent; while (f!=-1) /*循环直到无双亲结点即到达树根结点*/ { if (ht[f].lchild==c) /*当前结点是左孩子结点*/ hc.cd[hc.start--]=0; else /*当前结点是双亲结点的右孩子结点*/ hc.cd[hc.start--]=1; c=f;f=ht[f].parent; /*再对双亲结点进行同样的操作*/ } hc.start++;/*start指向哈夫曼编码最开始字符*/ hcd[i]=hc; } } 7.9 并查集 7.9.1 什么叫并查集 例如,如果已经得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系就十分复杂。在这种情况下,就需要应用并查集。为了将问题简化,将得到一些亲戚关系的信息,如Marry和Tom是亲戚,Tom和Ben是亲戚,等等。从这些信息中,可以推出Marry和Ben是亲戚。 输入:第一部分以N,M开始。N为问题涉及的人的个数(1≤N≤20000)。这些人的编号为1,2,3,…, N。下面有M行(1≤M≤1000000),每行有两个数ai, bi,表示已知ai和bi是亲戚。 第二部分以Q开始。以下Q行有Q个询问(1≤Q≤1000 000),每行为ci, di,表示询问ci和di是否为亲戚。 输出:对于每个询问ci, di,输出一行:若ci和di为亲戚,则输出“Yes
文档评论(0)