代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
动态哈夫曼压缩算法
作者:
刘地
/ 发布于
2013/10/11
/
768
#include <stdio.h> namespace huffman { const char leaf[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; typedef unsigned char byte; class node { public: node *Basic; node *Lside; node *Rside; long Symbol; byte Volume; public: node(){Basic=Lside=Rside=(node*)leaf;Symbol=1;} node(long n,const byte &t):Symbol(n),Volume(t){Basic=Lside=Rside=(node*)leaf;} }; node *original(node *t) { node *p,*r; for(r=t;r-t<256;r++) { r->Symbol=0; r->Volume=r-t; } for(p=t;p+1<r;p++,r++) { r->Symbol=0; r->Volume=0; r->Lside=p; p->Basic=r; p++; r->Rside=p; p->Basic=r; } return p; } node *maintain(node *r) { node *p,*q,*a,*b,*t; for(p=r->Basic;leaf!=(char*)p;p=r->Basic) { r=p; p=r->Lside; q=r->Rside; if(p->Symbol>q->Symbol) { r->Lside=q; r->Rside=p; t=p,p=q,q=t; } if(p->Symbol<q->Symbol) { a=q->Lside; b=q->Rside; if(b->Symbol>p->Symbol) { t=r->Basic; if(leaf!=(char*)t) { if(t->Lside==r)t->Lside=q;else t->Rside=q; } r->Rside=a; if(leaf!=(char*)a)a->Basic=r; r->Symbol=p->Symbol+a->Symbol; q->Basic=t; r->Basic=q; q->Symbol=r->Symbol+b->Symbol; p=r,r=q,q=b; if(p->Symbol>q->Symbol) { r->Lside=q; r->Rside=p; } else { r->Lside=p; r->Rside=q; } continue; } } r->Symbol=p->Symbol+q->Symbol; } return r; } void encode(const char *to,const char *from) { FILE *src=fopen(from,"rb"); FILE *hfm=fopen(to,"wb"); node *p,*q,*r; node arr[512]; bool t[256]; int i,j; byte c,o; if(src==NULL || hfm==NULL)return; original(arr); c=0,i=j=0; for(;;) { o=fgetc(src); if(feof(src))break; r=arr+byte(o); for(p=r;;p=q) { q=p->Basic; if(leaf==(char*)q) { break; } if(q->Lside==p) { t[i++]=0; } else { t[i++]=1; } } r->Symbol++; maintain(r); while(i) { i--; c= c<<1 | int(t[i]); j++; if(j==8) { putc(c,hfm); c=0,j=0; } } } if(j) { putc(c<<(8-j),hfm); } fclose(src); fclose(hfm); } void decode(const char *to,const char *from) { FILE *hfm=fopen(from,"rb"); FILE *dst=fopen(to,"wb"); node arr[512]; node *p,*q; char c; int i; if(hfm==NULL || dst==NULL)return; p=original(arr); for(;;) { c=fgetc(hfm); if(feof(hfm))break; for(i=7;i>=0;i--) { q = (c>>i)&1 ? p->Rside : p->Lside; if(leaf==(char*)q) { putc((char)p->Volume,dst); p->Symbol++; p=maintain(p); i++; } else p=q; } } if(leaf==(char*)p->Lside && leaf==(char*)p->Rside) { putc((char)p->Volume,dst); } fclose(hfm); fclose(dst); } }
试试其它关键字
动态哈夫曼
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
刘地
贡献的其它代码
(
3
)
.
动态哈夫曼压缩算法
.
右递归的超简单八皇后解决
.
n皇后问题的优化解法
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3