哈夫曼树怎样保存?
我建立一个结构。
struct leaf{
int cChar;
long weight;
}
最多时有256个结构体变量。
每一个结构变量有8个字节。
原来我建立的结构体是这样的
struct leaf{
char cChar;
long weight;
}
但是我用sizeof(struct leaf)返回的是8,我担心写到文件后会有错,所以将char类型改成int类型。
我看了N遍jpeg图片的存储格式,硬是没看懂,
大家帮我出下主意呀。
你们写的哈夫曼树是怎样存的?
问题点数:0、回复次数:5Top
1 楼steedhorse(晨星)回复于 2003-06-03 09:54:01 得分 0
这是有余“字对齐”机制造成的。用的时候的确需要小心。
其实不用整数也无所谓,只要你分别保存两个分量。
Top
2 楼steedhorse(晨星)回复于 2003-06-03 09:58:08 得分 0
我的意思是说,对于你原来的leaf类型,如果有变量。
struct leaf lf;
则sizeof(lf)==8,但sizeof(lf.cChar)和sizeof(lf.weight)分别等于1和4(Win32系统中)。Top
3 楼laijunchen(来俊臣)回复于 2003-06-03 10:07:16 得分 0
不知大家有没有好的保存哈夫曼树的方法?
或者请看懂jpeg哈夫曼树存储方法的朋友给我说说怎样存。
因为像我这样存的话浪费了很多空间呀。Top
4 楼witcheese(狗餅)回复于 2003-06-03 10:08:58 得分 0
@@Top
5 楼cloudysunny(蓝天下的雨云)回复于 2003-06-03 12:07:49 得分 0
原来我建立的结构体是这样的
struct leaf{
char cChar;
long weight;
}
但是我用sizeof(struct leaf)返回的是8,我担心写到文件后会有错,所以将char类型改成int类型。
因为你没有声明使用紧凑模式,所有编译器会优化存储空间,让读取效率更高。
如果你想sizeof(leaf)=5,则需这样声明:
//这段是声明紧凑模式--可适用于WINDOWS、UNIX、LUNIX
#ifdef WIN32
#pragma pack(push)
#pragma pack(1)
#endif
#ifdef UNIX
#pragma options align=packed
#endif
#ifdef LINUX
#pragma pack(1)
#endif
struct leaf{
int cChar;
long weight;
}
//这段是取消紧凑模式,这样下面的定义则可以采用优化的存储,提高效率。
#ifdef WIN32
#pragma pack(pop)
#endif
#ifdef UNIX
#pragma options align=reset
#endif
#ifdef LINUX
#pragma pack()
#endif
....Top




