ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久无码精品国产,亚洲国产精品18久久久久久,色欲久久久天天天综合网http://www.shnenglu.com/nchsea/zh-cnMon, 12 May 2025 05:35:56 GMTMon, 12 May 2025 05:35:56 GMT60夜深人é™åQŒå¼€å§‹å­¦ä¹?f¨¤n)äº?...http://www.shnenglu.com/nchsea/archive/2009/07/19/90478.htmlseaseaSat, 18 Jul 2009 17:32:00 GMThttp://www.shnenglu.com/nchsea/archive/2009/07/19/90478.htmlhttp://www.shnenglu.com/nchsea/comments/90478.htmlhttp://www.shnenglu.com/nchsea/archive/2009/07/19/90478.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/90478.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/90478.html
   1.整体了解
   2.语法¾l†èŠ‚
   3.实例
   4.应用



sea 2009-07-19 01:32 å‘表评论
]]>
åŒå­¦è®©æˆ‘å…Ïx³¨ä¸€ä¸‹GORMhttp://www.shnenglu.com/nchsea/archive/2009/05/08/82228.htmlseaseaFri, 08 May 2009 05:04:00 GMThttp://www.shnenglu.com/nchsea/archive/2009/05/08/82228.htmlhttp://www.shnenglu.com/nchsea/comments/82228.htmlhttp://www.shnenglu.com/nchsea/archive/2009/05/08/82228.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/82228.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/82228.html我别一ä½åŒå­¦å·²¾lå­¦ä¹?f¨¤n)groovy有一ŒD‰|—¶é—´äº†ã€?br />æˆ‘å´æ²¡æœ‰è·Ÿä¸Šã€?br />昨天架了一下环境,æ€È®—½Ž—是开始上路了.
好久没有æ–îC¸œè¥¿è¿›å¸äº†åQŒè¯»çš„书也是åŠé€”而废åQŒæ²¡æœ‰è¯»å®Œã€?br />䏿ƒ³èƒŒç€åŒ…袱上èµ\åQŒä¹Ÿä¸å¾è®®å¦‚æ­¤ã€?br />生活本æ¥å¾ˆç®€å•çš„åQŒæ€Žä¹ˆ½H然一下å­è§‰å¾—夿‚èµäh¥å‘¢ã€?br />䏿‡‚
䏿‡‚
çœŸçš„ä¸æ‡‚!


sea 2009-05-08 13:04 å‘表评论
]]>
ä¸è®¾è®¡ä¸ç”Ÿæ´»http://www.shnenglu.com/nchsea/archive/2009/04/17/80281.htmlseaseaFri, 17 Apr 2009 11:13:00 GMThttp://www.shnenglu.com/nchsea/archive/2009/04/17/80281.htmlhttp://www.shnenglu.com/nchsea/comments/80281.htmlhttp://www.shnenglu.com/nchsea/archive/2009/04/17/80281.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/80281.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/80281.html
我è¦è®¡åˆ’的将æ¥ï¼Œè‡›_°‘是三òqß_(d¨¢)¼

三年是个å?

毕业˜q™ä¸ªä¸‰å¹´åQŒæˆ‘没有什么戞®±ã€?br />
接下æ¥çš„三年呢?


sea 2009-04-17 19:13 å‘表评论
]]>
好久䏿¥http://www.shnenglu.com/nchsea/archive/2009/04/17/80235.htmlseaseaFri, 17 Apr 2009 05:54:00 GMThttp://www.shnenglu.com/nchsea/archive/2009/04/17/80235.htmlhttp://www.shnenglu.com/nchsea/comments/80235.htmlhttp://www.shnenglu.com/nchsea/archive/2009/04/17/80235.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/80235.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/80235.html

sea 2009-04-17 13:54 å‘表评论
]]>
å­¦JAVA必须知é“åQšæŠ½è±¡ç±»ä¸ŽæŽ¥å£çš„区别<è½?gt;http://www.shnenglu.com/nchsea/archive/2007/07/23/zhuanzai.htmlseaseaMon, 23 Jul 2007 02:26:00 GMThttp://www.shnenglu.com/nchsea/archive/2007/07/23/zhuanzai.htmlhttp://www.shnenglu.com/nchsea/comments/28613.htmlhttp://www.shnenglu.com/nchsea/archive/2007/07/23/zhuanzai.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/28613.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/28613.html阅读全文

sea 2007-07-23 10:26 å‘表评论
]]>
用SQL语å¥å®žçŽ°åˆ†é¡µçš„æ–¹æ³?/title><link>http://www.shnenglu.com/nchsea/archive/2007/07/23/sql.html</link><dc:creator>sea</dc:creator><author>sea</author><pubDate>Mon, 23 Jul 2007 01:38:00 GMT</pubDate><guid>http://www.shnenglu.com/nchsea/archive/2007/07/23/sql.html</guid><wfw:comment>http://www.shnenglu.com/nchsea/comments/28609.html</wfw:comment><comments>http://www.shnenglu.com/nchsea/archive/2007/07/23/sql.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/nchsea/comments/commentRss/28609.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/nchsea/services/trackbacks/28609.html</trackback:ping><description><![CDATA[     摘è¦: 用æ¥åˆ†é¡µçš„常用sql语奠 <a href='http://www.shnenglu.com/nchsea/archive/2007/07/23/sql.html'>阅读全文</a><img src ="http://www.shnenglu.com/nchsea/aggbug/28609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/nchsea/" target="_blank">sea</a> 2007-07-23 09:38 <a href="http://www.shnenglu.com/nchsea/archive/2007/07/23/sql.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>å¯ÒŽ(gu¨©)¯”mysql oracle db2 的部分ddl语法 <è½?gt;http://www.shnenglu.com/nchsea/archive/2006/11/27/15705.htmlseaseaMon, 27 Nov 2006 10:46:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/27/15705.htmlhttp://www.shnenglu.com/nchsea/comments/15705.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/27/15705.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/15705.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/15705.html

å¯ÒŽ(gu¨©)¯”mysql oracle db2 的部分ddl语法

廸™¡¨ã€åˆ é™¤è¡¨:mysql  oracle  db2基本相åŒ
create table test(id integer,name varchar(20),address varchar(20));
(oracle 多用varchar2åQŒä½†ä¹Ÿæ”¯æŒvarchar)
drop table test;

但是修改表就有很大的ä¸åŒäº?如下åQ?/p>

1,增加åˆ?相åŒ
alter table test add mail varchar(128);

2,删除�
oracle 与mysql相åŒ:alter table test drop column mail;
db2              :ä¸æä¾›åˆ é™¤åˆ—åŠŸèƒ½(解决办法是删除表åQŒé‡å»?

3,更改列å
oracle : alter table test rename column mail to mail2;
mysql  : alter talbe test change mail mail2 varchar(128);
db2    : ä¸æä¾›æ›´æ”¹åˆ—å功èƒ?解决办法åŒåˆ é™¤ï¼Œæˆ–者通过建立一个新视图解决)

4,更改列类�br />oracle :alter table test modify column (mail2 integer);
mysql  :alter table test modify column mail2 integer;
db2    :alter table test alter mail varchar(256) åªå¯ä»¥åŠ å®½ï¼Œä¸èƒ½æ›´æ”¹¾cÕdž‹

5,更改列的é™åˆ¶(主键ã€éž½I?
db2   :alter table test alter mail null/not null;
mysql :alter table test modify mail2 varchar(29) not null;
oracle:alter table test modify mail2 null/not null;

关于db2ä¸æä¾›è§£å†›_Šžæ³•ï¼Œå‚考这é‡?br />http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/0207adamache/0430_adamache3.html
截å–部分原文
-------------------------------------------------------------------------------
DROP COLUMNåQšDB2 ä¸å…许æ?zh¨¨n)¨åˆ é™¤ä¸€ä¸ªåˆ—。我å¯ä»¥æƒ›_ˆ°æ‚(zh¨¨n)¨å¸Œæœ›åˆ é™¤åˆ—的三个ç†ç”±ï¼š(x¨¬)
回收½Iºé—´åQšå¦‚æžœæ?zh¨¨n)¨å¸Œæœ›˜q™æ ·åšï¼Œå¯ä»¥å¯¼å‡ºæ‚(zh¨¨n)¨å¸Œæœ›ä¿å­˜çš„æ•°æ®åQŒåˆ é™¤é‚£ä¸ªè¡¨åQŒç”¨æ‚(zh¨¨n)¨éœ€è¦çš„é‚£äº›åˆ—é‡æ–°åˆ›å»ø™¡¨åQŒç„¶åŽè£…å…?br />˜q™ä¸ªè¡¨ã€‚这是å¦ä»£ä­h(hu¨¢n)高昂åQŸå½“然是åQŒä½†æ˜¯å›žæ”¶ç©ºé—´éœ€è¦è¿™æ ähˆ–è€?REORG TABLE。这些本æ¥å°±æ˜¯ä»£ä»·é«˜æ˜‚çš„æ“作ã€?

˜q™ä¸ªåˆ—ä¸å†æ˜¯è¡Œçš„逻辑部分åQšä¾‹å¦‚,æ‚(zh¨¨n)¨æ„识到æ‚(zh¨¨n)¨çš„雇员å¯èƒ½æœ‰ä¸¤ä¸ªåœ°å€åQŒåÆˆä¸”åœæ­¢è·Ÿítªé›‡å‘˜ï¼ˆemployeeåQ‰è¡¨ä¸­çš„地å€
åQˆé›‡å‘˜è¡¨å’Œé›‡å‘˜åœ°å€åQˆemployee_addressåQ‰è¡¨ä¹‹é—´çŽ°åœ¨æœ?n:m 关系åQ‰ã€‚在雇员表上创å¾ä¸€ä¸ªä¸åŒ…å«åœ°å€åˆ—的视图ã€?
如果æ‚(zh¨¨n)¨çœŸçš„è¦ç”¨æ–°å¥‡çš„æ–ÒŽ(gu¨©)³•åQŒå¯ä»¥ä‹Éç”?RENAME TABLE 命ä×o(h¨´)¾l™åŸºè¡¨ä¸€ä¸ªæ–°çš„å¿UŽÍ¼Œç„¶åŽž®†åŽŸå§‹è¡¨åä½œä¸ø™¯¥è§†å›¾çš?br />å称。æ?zh¨¨n)¨çš„视图也å¯ä»¥˜qžæŽ¥é›‡å‘˜è¡¨ä¸­çš„æœ‰ç”¨åˆ—和从雇员地å€èŽ·å¾—çš„åœ°å€ã€‚现在我们回åˆîCº†å…³ç³»çš„æ­£é“ã€?/p>

列å˜å®½äº†ã€‚如果它æ˜?VARCHARåQŒé‚£æ‚(zh¨¨n)¨è¿æ°”ä¸é”™ã€‚DB2 å…许æ‚(zh¨¨n)¨å°† VARCHAR 列最多加宽至表空é—ß_(d¨¢)¼ˆtablespaceåQ?br />中定义的™åµå¤§ž®å®½åº¦ï¼ˆ¾~ºçœçš?4K ™åµå¤§ž®äØ“(f¨´) 4,005åQŒè€Œåœ¨ 32K ™åµä¸Šæœ€å¤šäØ“(f¨´) 32,672åQ‰ï¼š(x¨¬)
---------------------------------------------------------------------------------

但是˜q‡ç¨‹ä¸­é—®ä¸€ä¸ªæœ‹å‹ï¼Œå¾—到的结论是å¯ä»¥æ”¹ï¼ŒçŸ›ç›¾å•Šç‘ô¾l­æ‰¾èµ„æ–™:
http://www-1.ibm.com/support/docview.wss?uid=swg21004049
部分截å–原文
-------------------------------------------------------------------------------
In DB2] Universal Databaseâ„?(DB2 UDB) Version 8.2, the Control Center automates
the process of altering a table where recreation of the table is necessary,
saving the user from performing a lengthy set of manual steps. Specifically,
the Control Center will automate the following operations: rename a column;
drop a column; change the data type of a column; change the length, scope,
or precision values for a column; change whether a column is nullable. If necessary,
the table that is being changed will be dropped and recreated, and DB2 UDB will
help the user restore any dependent objects and transform the existing data into
the target data type of each remaining column.
You cannot drop a column in DB2 UDB Version 8.1 or earlier. There are work-arounds.
 For example, you can increase the width of a VARCHAR column up to the largest
 column width supported by the page size used by the table (4005 bytes by default,
  but possibly as large as 32672 byes on 32K pages). The page size is chosen
  when the table space is created. To handle more complex changes:
  -----------------------------------------------------------------------------
  原æ¥DB2 UDB Version 8.1 or earlier䏿”¯æŒï¼Œ8.2æ‰å¼€å§‹æ”¯æŒã€?/p>

 

posted on 2006-11-22 15:41 dreamstone 阅读(365) 评论(0)  ¾~–辑 æ”¶è— 引用 æ”¶è—è‡?65Key 所属分¾c? 饭碗



sea 2006-11-27 18:46 å‘表评论
]]>
Command模å¼<è½?gt;http://www.shnenglu.com/nchsea/archive/2006/11/27/15704.htmlseaseaMon, 27 Nov 2006 10:38:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/27/15704.htmlhttp://www.shnenglu.com/nchsea/comments/15704.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/27/15704.html#Feedback1http://www.shnenglu.com/nchsea/comments/commentRss/15704.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/15704.html阅读全文

sea 2006-11-27 18:38 å‘表评论
]]>
zip 的压¾~©åŽŸç†ä¸Žå®žçް(è½?http://www.shnenglu.com/nchsea/archive/2006/11/17/15299.htmlseaseaFri, 17 Nov 2006 08:27:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/17/15299.htmlhttp://www.shnenglu.com/nchsea/comments/15299.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/17/15299.html#Feedback3http://www.shnenglu.com/nchsea/comments/commentRss/15299.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/15299.htmlæ— æŸæ•°æ®åŽ‹ç¾ƒæ˜¯ä¸€ä»¶å¥‡å¦™çš„äº‹æƒ…åQŒæƒ³ä¸€æƒ»I¼Œä¸€ä¸²ä“Qæ„的数æ®èƒ½å¤Ÿæ ÒŽ(gu¨©)®ä¸€å®šçš„è§„åˆ™è½¬æ¢æˆåªæœ‰åŽŸæ?1/2 - 1/5 长度的数æ®ï¼Œòq¶ä¸”能够按照相应的规则还原到原æ¥çš„æ ·å­ï¼Œå¬è“væ¥çœŸæ˜¯å¾ˆé…—÷€?br />åŠå¹´å‰ï¼Œè‹¦ç†¬˜q‡åˆå­?vc æ—‰™‚£ŒDµè‰°éš„¡š„学习(f¨¤n)曲线的我åQŒå¯¹ MFCã€SDK å¼€å§‹å¤±æœ›å’Œä¸æ»¡åQŒè¿™äº›è™½ç„¶ä¸½Ž—易学,但和 DHTML 没有实质上的区别åQŒéƒ½æ˜¯è°ƒç”¨å¾®è½¯æä¾›çš„å„ç§å„样的函敎ͼŒä¸éœ€è¦ä½ è‡ªå·±åŽÕdˆ›å»ÞZ¸€ä¸ªçª—å£ï¼Œå¤šçº¿½E‹ç¼–½E‹æ—¶åQŒä¹Ÿä¸éœ€è¦ä½ è‡ªå·±åŽÕdˆ†é…?CPU æ—‰™—´ã€‚我也嚘q‡é©±åŠ¨ï¼ŒåŒæ ·åQŒæœ‰DDKåQˆå¾®è½¯é©±åЍ开å‘包åQ‰ï¼Œå½“ç„¶åQŒä¹Ÿæœ?DDK 的“å‚考手册â€ï¼Œ˜qžä¸€ä¸ªæœ€½Ž€å•的数殾l“构都ä¸éœ€è¦ä½ è‡ªå·±åšï¼Œä¸€åˆ‡éƒ½æ˜¯å‡½æ•°ã€å‡½æ•°â€¦â€?
å¾®èÊY的高¾U§ç¨‹åºå‘˜¾~–写了函数让我们˜q™äº›æžåº”ç”¨çš„åŽ»è°ƒç”¨ï¼Œæˆ‘ä¸æƒ›_œ¨˜q™é‡Œè´¬ä½Žæžåº”用的人,正是˜q™äº›åº”用工程师连接è“v了科学和½C¾ä¼š(x¨¬)之间的桥æ¢ï¼Œž®†æ¥å¯ä»¥åšé”€å”®ï¼Œåšç®¡ç†ï¼Œç”¨è‡ªå·±é€æ¸¿U¯ç¯èµäh¥çš„æ™ºæ…§å’Œ¾l验在社ä¼?x¨¬)上打拼ã€?br />但是åQŒåœ¨æŠ€æœ¯ä¸Šæ¥è¯´åQŒè¯šå®žåœ°è¯ß_(d¨¢)¼Œ˜q™åƈä¸é«˜æ·±ï¼Œä¸æ˜¯å—?½W¬ä¸€‹¹çš„å…¬å¸å¦‚微软ã€Sybaseã€Oracle ½{‰æ€ÀL˜¯é¢å‘½C¾ä¼š(x¨¬)大众的,˜q™æ ·æ‰èƒ½æœ‰å·¨å¤§çš„å¸?j¨¬ng)场。但是他们往往也是站在½C¾ä¼š(x¨¬)的最™å¶å±‚的:(x¨¬)æ“作¾pÈ»Ÿã€ç¼–è¯‘å™¨ã€æ•°æ®åº“éƒ½å€¼å¾—ä¸€ä»£ä»£çš„ä¸“å®¶åŽ»ä¸æ–­ç ”究。这些å¸å›½èˆ¬çš„ä¼ä¸šä¹‹æ‰€ä»¥ä¼Ÿå¤§ï¼Œææ€•䏿˜¯â€œæœ‰¾l验â€ã€â€œèƒ½åƒè‹¦â€è¿™äº›ä¸­å›½ç‰¹è‰²çš„æ¦‚念所能涵盖的åQŒè‰°æ·Þqš„æŠ€æœ¯ä½“¾p…R€çŽ°ä»£çš„½Ž¡ç†å“²å­¦ã€å¼ºå¤§çš„å¸?j¨¬ng)场能力都是¾~ÞZ¸€ä¸å¯çš„å§ã€‚我们既然有志于技术,òq¶ä¸”正在èµäh­¥é˜¶æ®µåQŒä½•必急ä¸å¯è€åœ°è¦è{åŽÕdšâ€œç®¡ç†â€ï¼Œåšâ€œé’òq´æ‰ä¿Šâ€ï¼Œé‚£äº›æ‰€è°“的“æˆåŠŸäh士â€çš„æ ¹åº•能有几何åQŒè¿™æ ·å­‹¹®èºåQŒèƒ¸ä¸­çš„规模和格局能有多大åQ?br />
在我å‘现vcåªæ˜¯ä¸€ä¸ªç”¨é€”广泛的¾~–程工具åQŒåƈä¸èƒ½ä»£è¡¨â€œçŸ¥è¯†â€ã€â€œæŠ€æœ¯â€çš„æ—¶å€™ï¼Œæˆ‘有些失è½ï¼Œæ— æ‰€ä¸èƒ½çš„䏿˜¯æˆ‘åQŒè€Œæ˜¯ MFCã€SDKã€DDKåQŒæ˜¯å¾®èÊY的工½E‹å¸ˆåQŒä»–们åšçš„,正是我想åšçš„åQŒæˆ–者说åQŒæˆ‘也想æˆäØ“(f¨´)é‚£ç§å±‚次的ähåQŒçŽ°åœ¨æˆ‘çŸ¥é“了,他们是专å®Óž¼Œä½†è¿™ä¸ä¼š(x¨¬)是一个梦åQŒæœ‰ä¸€å¤©æˆ‘ä¼?x¨¬)åšåˆ°çš„åQŒäØ“(f¨´)什么ä¸èƒ½è¯´å‡ºæˆ‘的想法呢ã€?br />那时公å¸åšçš„¾pÈ»Ÿé‡Œæœ‰ä¸€ä¸ªåŽ‹¾~©æ¨¡å—,领导找了一ä¸?zlib 库,ä¸è®©æˆ‘自己åšåŽ‹ç¾ƒ½Ž—法åQŒç«™åœ¨å…¬å¸çš„立场上,我很ç†è§£åQŒçœŸçš„很ç†è§£åQŒè‡ªå·±åš½Ž—æ³•è¦å¤šä¹…啊。但那时自己心中éšè—的一份倔强é©×ƒ‹É我去å¯ÀL‰¾åŽ‹ç¾ƒåŽŸç†çš„资料,我完全没有æ„识到åQŒæˆ‘å›_°†æ‰“开一扇大门,˜q›å…¥ä¸€ä¸ªç¥žå¥‡çš„“数æ®ç»“æž„â€çš„世界。“计½Ž—机艺术â€çš„½W¬ä¸€¾U‰K˜³å…‰ï¼Œå±…然也照åˆîCº†æˆ‘这样一个åã^凡的人的íw«ä¸Šã€?br />
上é¢è¯´åˆ°â€œè®¡½Ž—机艺术â€ï¼Œæˆ–者进一步细化说“计½Ž—机¾~–程艺术â€ï¼Œå¬è“væ¥å¾ˆæ·±å¥¥åQŒå¾ˆé«˜é›…åQŒä½†æ˜¯åœ¨ž®†è¦˜q›å…¥ä¸“业的压¾~©ç®—法的研究æ—Óž¼Œæˆ‘è¦è¯·å¤§å®¶åšçš„第一件事情是åQšå¿˜æŽ‰è‡ªå·Þqš„òq´é¾„ã€å­¦åŽ†ï¼Œå¿˜æŽ‰è‡ªå·±çš„ç¤¾ä¼?x¨¬)èín份,忘掉¾~–程语言åQŒå¿˜æŽ‰â€œé¢å‘对象â€ã€â€œä¸‰å±‚æž¶æž„â€ç­‰ä¸€åˆ‡æœ¯è¯­ã€‚把自己当作一个å°å­©ï¼Œæœ‰ä¸€åŒæ±‚知的眼ç›åQŒå¯¹ä¸–界充满ä¸å€¦çš„ã€å•¾U¯çš„好奇åQŒå”¯ä¸€çš„å‰ææ˜¯ä¸€ä¸ªæ­£å¸¸çš„å…ähœ‰äººç±»ç†æ€§æ€ç»´èƒ½åŠ›çš„å¤§è„‘ã€?br />下颞®Þp®©æˆ‘们开始一ŒD능žå¥‡çš„压羃½Ž—法之旅å§ï¼š(x¨¬)


1. 原ç†éƒ¨åˆ†åQ?br />  有两¿UåÅžå¼çš„é‡å¤å­˜åœ¨äºŽè®¡½Ž—机数æ®ä¸­ï¼Œzip ž®±æ˜¯å¯¹è¿™ä¸¤ç§é‡å¤˜q›è¡Œäº†åŽ‹¾~©ã€?br />  一¿U是短语形å¼çš„é‡å¤ï¼Œå³ä¸‰ä¸ªå­—节以上的é‡å¤åQŒå¯¹äºŽè¿™¿Ué‡å¤ï¼Œzip用两个数字:(x¨¬)1.é‡å¤ä½ç½®è·å½“å‰åŽ‹¾~©ä½¾|®çš„è·ç¦»åQ?.é‡å¤çš„长度,æ¥è¡¨½Cø™¿™ä¸ªé‡å¤ï¼Œå‡è®¾˜q™ä¸¤ä¸ªæ•°å­—å„å ä¸€ä¸ªå­—节,于是数æ®ä¾¿å¾—åˆîCº†åŽ‹ç¾ƒåQŒè¿™å¾ˆå®¹æ˜“ç†è§£ã€?br />  一个字节有 0 - 255 å…?256 ¿Uå¯èƒ½çš„å–å€û|¼Œä¸‰ä¸ªå­—节æœ?256 * 256 * 256 å…׃¸€åƒå…­ç™‘Ö¤šä¸‡ç§å¯èƒ½çš„æƒ…况,更长的短语å–值的å¯èƒ½æƒ…况以指数方å¼å¢žé•¿ï¼Œå‡ºçްé‡å¤çš„æ¦‚率似乎æžä½Žï¼Œå®žåˆ™ä¸ç„¶åQŒå„¿U类型的数æ®éƒ½æœ‰å‡ºçްé‡å¤çš„們֑åQŒä¸€½‹‡è®ºæ–‡ä¸­åQŒäØ“(f¨´)æ•îC¸å¤šçš„æœ¯è¯­å€‘֑于é‡å¤å‡ºçŽŽÍ¼›ä¸€½‹‡å°è¯ß_(d¨¢)¼Œäººå和地å会(x¨¬)é‡å¤å‡ºçްåQ›ä¸€å¼ ä¸Šä¸‹æ¸å˜çš„背景囄¡‰‡åQŒæ°´òqÏx–¹å‘上的åƒç´ ä¼š(x¨¬)é‡å¤å‡ºçްåQ›ç¨‹åºçš„æºæ–‡ä»¶ä¸­åQŒè¯­æ³•关键字ä¼?x¨¬)é‡å¤å‡ºçŽŽÍ¼ˆæˆ‘ä»¬å†™ç¨‹åºæ—¶åQŒå¤šž®‘次å‰åŽcopyã€pasteåQŸï¼‰(j¨ª)åQŒä»¥å‡ å K 为å•ä½çš„éžåŽ‹¾~©æ ¼å¼çš„æ•°æ®ä¸­ï¼Œå€‘֑于大é‡å‡ºçŽ°çŸ­è¯­å¼çš„é‡å¤ã€‚绘q‡ä¸Šé¢æåˆ°çš„æ–¹å¼˜q›è¡ŒåŽ‹ç¾ƒåŽï¼ŒçŸ­è¯­å¼é‡å¤çš„們֑被完全破å,所以在压羃的结果上˜q›è¡Œ½W¬äºŒ‹Æ¡çŸ­è¯­å¼åŽ‹ç¾ƒä¸€èˆ¬æ˜¯æ²¡æœ‰æ•ˆæžœçš„ã€?br />  ½W¬äºŒ¿Ué‡å¤äØ“(f¨´)å•字节的é‡å¤åQŒä¸€ä¸ªå­—èŠ‚åªæœ?56¿Uå¯èƒ½çš„å–å€û|¼Œæ‰€ä»¥è¿™¿Ué‡å¤æ˜¯å¿…然的。其中,æŸäº›å­—节出现‹Æ¡æ•°å¯èƒ½è¾ƒå¤šåQŒå¦ä¸€äº›åˆ™è¾ƒå°‘åQŒåœ¨¾lŸè®¡ä¸Šæœ‰åˆ†å¸ƒä¸å‡åŒ€çš„們֑åQŒè¿™æ˜¯å®¹æ˜“ç†è§£çš„åQŒæ¯”如一ä¸?ASCII 文本文äšg中,æŸäº›½W¦å·å¯èƒ½å¾ˆå°‘用到åQŒè€Œå­—æ¯å’Œæ•°å­—则ä‹É用较多,å„å­—æ¯çš„使用频率也是ä¸ä¸€æ ïL(f¨¥ng)š„åQŒæ®è¯´å­—æ¯?e çš„ä‹É用概率最高;许多囄¡‰‡å‘ˆçްæ·Þp‰²è°ƒæˆ–‹¹…色调,æ·Þp‰²åQˆæˆ–‹¹…色åQ‰çš„åƒç´ ä½¿ç”¨è¾ƒå¤šåQˆè¿™é‡Œé¡ºä¾¿æä¸€ä¸‹ï¼š(x¨¬)png 囄¡‰‡æ ¼å¼æ˜¯ä¸€¿Uæ— æŸåŽ‹¾~©ï¼Œå…¶æ ¸å¿ƒç®—法就æ˜?zip ½Ž—法åQŒå®ƒå’?zip æ ¼å¼çš„æ–‡ä»¶çš„主è¦åŒºåˆ«åœ¨äºŽåQšä½œä¸ÞZ¸€¿U图片格å¼ï¼Œå®ƒåœ¨æ–‡äšg头处存放了图片的大å°ã€ä‹É用的颜色数等信æ¯åQ‰ï¼›ä¸Šé¢æåˆ°çš„短语å¼åŽ‹ç¾ƒçš„ç»“æžœä¹Ÿæœ‰è¿™¿U們֑åQšé‡å¤å€‘֑于出现在¼›Õd½“å‰åŽ‹¾~©ä½¾|®è¾ƒ˜q‘的地方åQŒé‡å¤é•¿åº¦å€‘֑于比较短åQ?0字节以内åQ‰ã€‚è¿™æ øP¼Œž®±æœ‰äº†åŽ‹¾~©çš„å¯èƒ½åQšç»™ 256 ¿U字节å–值釿–°ç¼–ç ï¼Œä½¿å‡ºçŽ°è¾ƒå¤šçš„å­—èŠ‚ä½¿ç”¨è¾ƒçŸ­çš„ç¼–ç ï¼Œå‡ºçŽ°è¾ƒå°‘çš„å­—èŠ‚ä‹É用较长的¾~–ç åQŒè¿™æ ·ä¸€æ¥ï¼Œå˜çŸ­çš„字节相对于å˜é•¿çš„字节更多,文äšg的总长度就ä¼?x¨¬)凞®‘,òq¶ä¸”åQŒå­—节ä‹É用比例越ä¸å‡åŒ€åQŒåŽ‹¾~©æ¯”例就­‘Šå¤§ã€?br />  在进一步讨论编ç çš„è¦æ±‚以åŠ(qi¨¢ng)办法å‰ï¼Œå…ˆæä¸€ä¸‹ï¼š(x¨¬)¾~–ç å¼åŽ‹¾~©å¿…™åÕdœ¨çŸ­è¯­å¼åŽ‹¾~©ä¹‹åŽè¿›è¡Œï¼Œå› äØ“(f¨´)¾~–ç å¼åŽ‹¾~©åŽåQŒåŽŸå…ˆå…«ä½äºŒ˜q›åˆ¶å€¼çš„字节ž®Þp¢«ç ´å了,˜q™æ ·æ–‡äšg中短语å¼é‡å¤çš„們֑也会(x¨¬)被破å(除éžå…ˆè¿›è¡Œè§£ç ï¼‰(j¨ª)。å¦å¤–,短语å¼åŽ‹¾~©åŽçš„结果:(x¨¬)那些剩下的未被匹é…çš„å•ã€åŒå­—节和得到匹é…çš„è·ç¦»ã€é•¿åº¦å€ég»ç„¶å…·æœ‰å–值分布ä¸å‡åŒ€æ€§ï¼Œå› æ­¤åQŒä¸¤¿U压¾~©æ–¹å¼çš„™åºåºä¸èƒ½å˜ã€?br />  在编ç å¼åŽ‹ç¾ƒåŽï¼Œä»¥è¿ž¾l­çš„å…«ä½ä½œäØ“(f¨´)一个字节,原先未压¾~©æ–‡ä»¶ä¸­æ‰€å…ähœ‰çš„字节å–å€ég¸å‡åŒ€çš„們֑被彻底破å,æˆäØ“(f¨´)éšæœºæ€§å–å€û|¼Œæ ÒŽ(gu¨©)®¾lŸè®¡å­¦çŸ¥è¯†ï¼Œéšæœºæ€§å–值具有å‡åŒ€æ€§çš„們֑åQˆæ¯”如抛¼‹¬å¸è¯•验åQŒæŠ›ä¸€åƒæ¬¡åQŒæ­£å颿œä¸Šçš„æ¬¡æ•°éƒ½æŽ¥è¿‘äº?500 ‹Æ¡ï¼‰(j¨ª)。因此,¾~–ç å¼åŽ‹¾~©åŽçš„结果无法冘q›è¡Œ¾~–ç å¼åŽ‹¾~©ã€?br />  短语å¼åŽ‹¾~©å’Œ¾~–ç å¼åŽ‹¾~©æ˜¯ç›®å‰è®¡ç®—机科学界研究出的仅有的两¿Uæ— æŸåŽ‹¾~©æ–¹æ³•,它们都无法é‡å¤è¿›è¡Œï¼Œæ‰€ä»¥ï¼ŒåŽ‹ç¾ƒæ–‡äšgæ— æ³•å†æ¬¡åŽ‹ç¾ƒåQˆå®žé™…上åQŒèƒ½å夘q›è¡Œçš„压¾~©ç®—法是ä¸å¯æƒŒ™±¡çš„ï¼Œå› äØ“(f¨´)最¾lˆä¼š(x¨¬)压羃åˆ?0 字节åQ‰ã€?br />=====================================

åQˆè¡¥å……)(j¨ª)

压羃文äšgæ— æ³•å†æ¬¡åŽ‹ç¾ƒæ˜¯å› ä¸ºï¼š(x¨¬)
1. 短语å¼åŽ‹¾~©åŽ»æŽ‰äº†ä¸‰ä¸ªå­—èŠ‚ä»¥ä¸Šçš„é‡å¤ï¼ŒåŽ‹ç¾ƒåŽçš„¾l“果中包å«çš„æ˜¯æœªåŒšw…çš„å•åŒå­—节,和匹é…è·¼›…R€é•¿åº¦çš„¾l„åˆã€‚这个结果当然ä»ç„¶å¯èƒ½åŒ…å«ä¸‰ä¸ªå­—节以上的é‡å¤åQŒä½†æ˜¯æ¦‚率æžä½Žã€‚å› ä¸ÞZ¸‰ä¸ªå­—节有 256 * 256 * 256 å…׃¸€åƒå…­ç™‘Ö¤šä¸‡ç§å¯èƒ½çš„æƒ…况,一åƒå…­ç™¾ä¸‡åˆ†ä¹‹ä¸€çš„æ¦‚率导致匹é…çš„è·ç¦»å¾ˆé•¿åQŒéœ€è¦äºŒ˜q›åˆ¶æ•?4使¥è¡¨ç¤º˜q™ä¸ªåŒšw…è·ç¦»åQŒå†åŠ ä¸ŠåŒšw…长度ž®Þp¶…˜q‡äº†ä¸‰ä¸ªå­—节åQŒå¾—ä¸å¿å¤±ã€‚所以åªèƒ½åŽ‹¾~©æŽ‰åŽŸå§‹æ–‡äšg中“自然存在的åQŒåƈéžéšæœºçš„çŸ­è¯­å¼é‡å¤å€‘Ö‘â€ã€?br />2.¾~–ç å¼åŽ‹¾~©åˆ©ç”¨å„个å•字节使用频率ä¸ä¸€æ ïL(f¨¥ng)š„們֑åQŒä‹É定长¾~–ç å˜äØ“(f¨´)ä¸å®šé•¿ç¼–ç ï¼Œ¾l™ä‹É用频率高的字节更短的¾~–ç åQŒä‹É用频率低的字节更长的¾~–ç åQŒè“v到压¾~©çš„æ•ˆæžœã€‚如果把¾~–ç å¼åŽ‹¾~©çš„â€œç»“æžœâ€æŒ‰ç…?ä½ä½œä¸?字节åQŒé‡æ–°ç»Ÿè®¡å„字节的ä‹É用频率,应该是大致相½{‰çš„。因为新的字节ä‹Éç”¨é¢‘çŽ‡æ˜¯éšæœºçš„。相½{‰çš„频率å†åŽ»å˜æ¢å­—节长短是没有æ„义的åQŒå› ä¸ºå˜çŸ­çš„字节没有比å˜é•¿çš„字节更多ã€?br />
=======================================

  短语å¼é‡å¤çš„們֑和字节å–值分布ä¸å‡åŒ€çš„們֑是å¯ä»¥åŽ‹¾~©çš„基础åQŒä¸¤¿U压¾~©çš„™åºåºä¸èƒ½äº’æ¢çš„原因也说了åQŒä¸‹é¢æˆ‘们æ¥çœ‹ç¼–ç å¼åŽ‹ç¾ƒçš„è¦æ±‚åŠ(qi¨¢ng)æ–ÒŽ(gu¨©)³•åQ?br />
首先åQŒäØ“(f¨´)了ä‹É用ä¸å®šé•¿çš„ç¼–ç è¡¨½Cºå•个字½W¦ï¼Œ¾~–ç å¿…é¡»½W¦åˆâ€œå‰¾~€¾~–ç â€çš„è¦æ±‚åQŒå³è¾ƒçŸ­çš„ç¼–ç å†³ä¸èƒ½æ˜¯è¾ƒé•¿ç¼–ç çš„å‰ç¼€åQŒå˜q‡æ¥è¯´å°±æ˜¯ï¼Œä»ÖM½•一个字½W¦çš„¾~–ç åQŒéƒ½ä¸æ˜¯ç”±å¦ä¸€ä¸ªå­—½W¦çš„¾~–ç åŠ ä¸Šè‹¥å¹²ä½?0 æˆ?1 ¾l„æˆåQŒå¦åˆ™è§£åŽ‹ç¾ƒ½E‹åºž®†æ— æ³•è§£ç ã€?br />看一下剾~€¾~–ç çš„一个最½Ž€å•的例å­åQ?br />

½W¦å· ¾~–ç 
A 0
B 10
C 110
D 1110
E 11110

有了上é¢çš„ç è¡¨ï¼Œä½ ä¸€å®šå¯ä»¥è½»æ‘Öœ°ä»Žä¸‹é¢è¿™ä¸²äºŒ˜q›åˆ¶‹¹ä¸­åˆ†èöL出真正的信æ¯å†…容了:(x¨¬)

1110010101110110111100010 - DABBDCEAAB

è¦æž„造符åˆè¿™ä¸€è¦æ±‚的二˜q›åˆ¶¾~–ç ä½“ç³»åQŒäºŒå‰æ ‘(w¨¨i)æ˜¯æœ€ç†æƒ³çš„选择。考察下题q™æ£µäºŒå‰æ ?w¨¨i)ï¼?x¨¬)

        �root)
       0  |   1
       +-------+--------+
    0  | 1   0  |  1
    +-----+------+  +----+----+
    |     |  |     |
    a      |  d     e
     0  |  1
     +-----+-----+
     |     |
     b     c

è¦ç¼–ç çš„字符æ€ÀL˜¯å‡ºçŽ°åœ¨æ ‘(w¨¨i)å¶ä¸ŠåQŒå‡å®šä»Žæ ¹å‘æ ?w¨¨i)å¶è¡Œèµ°çš„过½E‹ä¸­åQŒå·¦è½¬äØ“(f¨´)0åQŒå³è½¬äØ“(f¨´)1åQŒåˆ™ä¸€ä¸ªå­—½W¦çš„¾~–ç ž®±æ˜¯ä»Žæ ¹èµ°åˆ°è¯¥å­—½W¦æ‰€åœ¨æ ‘(w¨¨i)å¶çš„è·¯å¾„ã€‚æ­£å› äØ“(f¨´)字符åªèƒ½å‡ºçŽ°åœ¨æ ‘(w¨¨i)å¶ä¸ŠåQŒä“Q何一个字½W¦çš„路径都ä¸ä¼?x¨¬)是å¦ä¸€å­—符路径的剾~€è·¯å¾„åQŒç¬¦åˆè¦æ±‚çš„å‰ç¼€¾~–ç ä¹Ÿå°±æž„造æˆåŠŸäº†åQ?br />
a - 00 b - 010 c - 011 d - 10 e - 11


æŽ¥ä¸‹æ¥æ¥çœ‹ç¼–ç å¼åŽ‹ç¾ƒçš„è¿‡½E‹ï¼š(x¨¬)
ä¸ÞZº†½Ž€åŒ–问题,å‡å®šä¸€ä¸ªæ–‡ä»¶ä¸­åªå‡ºçŽîCº† aåQŒbåQŒcåQŒd åQŒe五ç§å­—符åQŒå®ƒä»¬çš„出现‹Æ¡æ•°åˆ†åˆ«æ˜?br />a : 6‹Æ?br />b : 15‹Æ?br />c : 2‹Æ?br />d : 9‹Æ?br />e : 1‹Æ?br />如果用定长的¾~–ç æ–¹å¼ä¸ø™¿™å››ç§å­—符¾~–ç åQ?a : 000 b : 001 c : 010 d : 011 e : 100
那么整个文äšg的长度是 3*6 + 3*15 + 3*2 + 3*9 + 3*1 = 99

ç”¨äºŒå‰æ ‘(w¨¨i)表示˜q™å››¿Uç¼–ç ?其中å¶å­èŠ‚ç‚¹ä¸Šçš„æ•°å­—æ˜¯å…¶ä½¿ç”¨‹Æ¡æ•°åQŒéžå¶å­èŠ‚ç‚¹ä¸Šçš„æ•°å­—æ˜¯å…¶å·¦å³å­©å­ä½¿ç”¨‹Æ¡æ•°ä¹‹å’Œ):

          �br />           |
      +---------33---------+
      |        |
   +----32---+      +----1---+
   |    |      |    |
+-21-+    +-11-+    +--1--+  
|   |    |   |    |   |
6   15  2  9    1   

åQˆå¦‚æžœæŸä¸ªèŠ‚ç‚¹åªæœ‰ä¸€ä¸ªå­èŠ‚ç‚¹åQŒå¯ä»¥åŽ»æŽ‰è¿™ä¸ªå­èŠ‚ç‚¹ã€‚ï¼‰(j¨ª)

         �br />         |
        +------33------+
       |     |
    +-----32----+     1
    |      |
  +--21--+  +--11--+
  |   |  |   |
  6   15 2    9

çŽ°åœ¨çš„ç¼–ç æ˜¯åQ?a : 000 b : 001 c : 010 d : 011 e : 1 ä»ç„¶½W¦åˆâ€œå‰¾~€¾~–ç â€çš„è¦æ±‚ã€?br />
½W¬ä¸€æ­¥ï¼š(x¨¬)如果å‘现下层节点的数字大于上层节点的数字åQŒå°±äº¤æ¢å®ƒä»¬çš„ä½¾|®ï¼Œòq‰™‡æ–°è®¡½Ž—éžå¶å­èŠ‚ç‚¹çš„å€¹{€?br />先交æ?1å’?åQŒç”±äº?1个字节羃短了一ä½ï¼Œ1个字节增长了一ä½ï¼Œæ€ÀL–‡ä»¶ç¾ƒçŸ­äº†10ä½ã€?br />
           �br />            |
       +----------33---------+
       |        |
   +-----22----+     +----11----+
   |      |     |     |
+--21--+    1      2     9
|     |
6   15

å†äº¤æ?5å’?ã€?å’?åQŒæœ€¾lˆå¾—到这æ ïL(f¨¥ng)š„æ ?w¨¨i)ï¼?x¨¬)

           �br />            |
       +----------33---------+
       |        |
     +-----18----+    +----15----+
    |      |    |     |
  +--3--+    15   6     9
  |   |
  2   1

˜q™æ—¶æ‰€æœ‰ä¸Šå±‚节点的数值都大于下层节点的数å€û|¼Œä¼ég¹Žæ— æ³•å†è¿›ä¸€æ­¥åŽ‹¾~©äº†ã€‚但是我们把æ¯ä¸€å±‚的最ž®çš„两个节点¾l“åˆèµäh¥åQŒå¸¸ä¼?x¨¬)å‘çŽîC»æœ‰åŽ‹¾~©ä½™åœ°ã€?br />
½W¬äºŒæ­¥ï¼š(x¨¬)把æ¯ä¸€å±‚的最ž®çš„两个节点¾l“åˆèµäh¥åQŒé‡æ–°è®¡½Ž—相兌™Š‚点的倹{€?br />
在上é¢çš„æ ?w¨¨i)中åQŒç¬¬ä¸€ã€äºŒã€å››ä¸‰å±‚éƒ½åªæœ‰ä¸€æˆ–äºŒä¸ªèŠ‚ç‚¹ï¼Œæ— æ³•é‡æ–°¾l„åˆåQŒä½†½W¬ä¸‰å±‚上有四个节点,我们把最ž®çš„3å’?¾l“åˆèµäh¥åQŒåÆˆé‡æ–°è®¡ç®—相关节点的å€û|¼ŒæˆäØ“(f¨´)下题q™æ£µæ ?w¨¨i)ã€?br />
           �br />            |
       +----------33---------+
       |         |
    +------9-----+    +----24----+
    |      |    |     |
   +--3--+    6   15    9
   |   |
  2  1

ç„¶åŽåQŒå†é‡å¤åšç¬¬ä¸€æ­¥ã€?br />˜q™æ—¶½W¬äºŒå±‚çš„9ž®äºŽ½W¬ä¸‰å±‚çš„15åQŒäºŽæ˜¯å¯ä»¥äº’æ¢ï¼Œæœ?个字节增长了一ä½ï¼Œ15个字节羃短了一ä½ï¼Œæ–‡äšg总长度刾~©çŸ­äº?ä½ã€‚ç„¶åŽé‡æ–°è®¡½Ž—相兌™Š‚点的倹{€?br />
           �br />            |
       +----------33---------+
       |        |
       15     +----18----+ 
            |    |
         +------9-----+   9
         |      |
         +--3--+   6
         |   |
         2  1

˜q™æ—¶å‘现所有的上层节点都大于下层节点,æ¯ä¸€å±‚上最ž®çš„ä¸¤ä¸ªèŠ‚ç‚¹è¢«åÆˆåœ¨äº†ä¸€èµøP¼Œä¹Ÿä¸å¯èƒ½å†äñ”生比åŒå±‚其他节点更å°çš„父节点了ã€?br />
˜q™æ—¶æ•´ä¸ªæ–‡äšg的长度是 3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63

˜q™æ—¶å¯ä»¥çœ‹å‡º¾~–ç å¼åŽ‹¾~©çš„ä¸€ä¸ªåŸºæœ¬å‰æï¼š(x¨¬)å„èŠ‚ç‚¹ä¹‹é—´çš„å€ÆD¦ç›¸å·®æ¯”较æ‚(zh¨¨n)¬æ®ŠåQŒä»¥ä½¿æŸä¸¤ä¸ªèŠ‚ç‚¹çš„å’Œž®äºŽåŒå±‚或下层的å¦ä¸€ä¸ªèŠ‚ç‚¹ï¼Œ˜q™æ ·åQŒäº¤æ¢èŠ‚ç‚ÒŽ(gu¨©)‰æœ‰åˆ©ç›Šã€?br />所以归根结底,原始文äšg中的字节使用频率必须相差较大åQŒå¦åˆ™å°†æ²¡æœ‰ä¸¤ä¸ªèŠ‚ç‚¹çš„é¢‘çŽ‡ä¹‹å’Œå°äºŽåŒå±‚或下层其他节点的频率,也就无法压羃。å之,相差得越æ‚(zh¨¨n)¬æ®ŠåQŒä¸¤ä¸ªèŠ‚ç‚¹çš„é¢‘çŽ‡ä¹‹å’Œæ¯”åŒå±‚或下层节点的频率å°å¾—越多,交æ¢èŠ‚ç‚¹ä¹‹åŽçš„利益也­‘Šå¤§ã€?br />
在这个例å­ä¸­åQŒç»˜q‡ä¸Šé¢ä¸¤æ­¥ä¸æ–­é‡å¤ï¼Œå¾—åˆ°äº†æœ€ä¼˜çš„äºŒå‰æ ?w¨¨i),但ä¸èƒ½ä¿è¯åœ¨æ‰€æœ‰æƒ…况下åQŒéƒ½èƒ½é€šè¿‡˜q™ä¸¤æ­¥çš„é‡å¤å¾—åˆ°æœ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒä¸‹é¢æ¥çœ‹å¦ä¸€ä¸ªä¾‹å­ï¼š(x¨¬)

                         æ ?br />                         ï½?br />              åQ‹ï¼åQï¼åQï¼åQï¼åQï¼åQ‘ï¼™åQï¼åQï¼åQï¼åQï¼åQ?br />              |                   ï½?br />      åQ‹ï¼åQï¼åQï¼åQ1åQ’ï¼åQï¼åQï¼åQ+            åQ?br />      |              ï½?br />  åQ‹ï¼åQï¼åQ•ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€ã€€ã€€åQ‹ï¼åQï¼åQ—ï¼åQï¼åQ?br />  |       |      |       ï½?br />åQ‹ï¼åQ’ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ“ï¼åQ‹ã€€ã€€åQ‹ï¼åQ“ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ”ï¼åQ?br />|   |   |   |  |   |   |   ï½?br />åQ‘   åQ‘   åQ‘   åQ’  åQ‘   åQ’   åQ’   åQ?br />
˜q™ä¸ªä¾‹å­ä¸­ï¼Œæ‰€æœ‰ä¸Šå±‚节炚wƒ½å¤§äºŽ½{‰äºŽä¸‹å±‚节点åQŒæ¯ä¸€å±‚最ž®çš„两个节点¾l“åˆåœ¨äº†ä¸€èµøP¼Œä½†ä»ç„¶å¯ä»¥è¿›ä¸€æ­¥ä¼˜åŒ–:(x¨¬)


                         æ ?br />                         ï½?br />              åQ‹ï¼åQï¼åQï¼åQï¼åQï¼åQ‘ï¼™åQï¼åQï¼åQï¼åQï¼åQ?br />              |                   ï½?br />      åQ‹ï¼åQï¼åQï¼åQ1åQ’ï¼åQï¼åQï¼åQ+            åQ?br />      |              ï½?br />  åQ‹ï¼åQï¼åQ”ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€ã€€ã€€åQ‹ï¼åQï¼åQ˜ï¼åQï¼åQ?br />  |       |      |       ï½?br />åQ‹ï¼åQ’ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ’ï¼åQ‹ã€€ã€€åQ‹ï¼åQ”ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ”ï¼åQ?br />|   |   |   |  |   |   |   ï½?br />åQ‘   åQ‘   åQ‘   åQ‘  åQ’   åQ’   åQ’   åQ?br />
通过最低一层的½W¬ï¼”½W¬ï¼•个节点对æ¢ï¼Œ½W¬ï¼“层的åQ˜å¤§äºŽç¬¬åQ’层的7ã€?br />到这里,我们得出˜q™æ ·ä¸€ä¸ªç»“论:(x¨¬)一‹‚‰|œ€ä¼˜äºŒå‰ç¼–ç æ ‘(w¨¨i)åQˆæ‰€æœ‰ä¸Šå±‚节炚wƒ½æ— æ³•和下层节点交æ¢ï¼‰(j¨ª)åQŒå¿…™åȬ¦åˆè¿™æ ·ä¸¤ä¸ªæ¡ä»Óž¼š(x¨¬)
åQ‘.所有上层节炚wƒ½å¤§äºŽ½{‰äºŽä¸‹å±‚节点ã€?br />åQ’.æŸèŠ‚ç‚¹ï¼Œè®‘Ö…¶è¾ƒå¤§çš„å­èŠ‚ç‚¹ä¸ºï½åQŒè¾ƒ?y¨­u)®çš„å­èŠ‚ç‚¹äØ?f¨´)n,ï½ä¸‹çš„ä“Q一层的所有节炚wƒ½åº”大于等于n下的该层的所有节ç‚V€?br />
当符åˆè¿™ä¸¤ä¸ªæ¡äšgæ—Óž¼Œä»ÖM¸€å±‚都无法产生更å°çš„节点去和下层节点交æ¢ï¼Œä¹Ÿæ— æ³•äñ”生更大的节点åŽÕd’Œä¸Šå±‚节点交æ¢ã€?br />
上é¢çš„ä¸¤ä¸ªä¾‹å­æ˜¯æ¯”较½Ž€å•çš„åQŒå®žé™…的文äšg中,一个字节有256¿Uå¯èƒ½çš„å–å€û|¼Œæ‰€ä»¥äºŒå‰æ ‘(w¨¨i)çš„å¶å­èŠ‚ç‚¹å¤šè¾?56个,需è¦ä¸æ–­çš„调整æ ?w¨¨i)åÅžåQŒæœ€¾lˆçš„æ ?w¨¨i)åÅžå¯èƒ½éžå¸¸å¤æ‚åQŒæœ‰ä¸€¿Uéžå¸¸ç²¾å·§çš„½Ž—法å¯ä»¥å¿«é€Ÿåœ°å»ø™“v一‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒè¿™¿U算法由D.HuffmanåQˆæˆ´Â·éœå¤«æ›û|¼‰(j¨ª)æå‡ºåQŒä¸‹é¢æˆ‘们先æ¥ä»‹¾léœå¤«æ›¼½Ž—法的步骤,然åŽå†æ¥è¯æ˜Žé€šè¿‡˜q™ä¹ˆ½Ž€å•的步骤得出的树(w¨¨i)形确实是一‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)ã€?br />
éœå¤«æ›¼ç®—法的步骤是这æ ïL(f¨¥ng)š„åQ?br />
·从å„个节点中扑ևºæœ€ž®çš„两个节点åQŒç»™å®ƒä»¬å»ÞZ¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒå€égØ“(f¨´)˜q™ä¸¤ä¸ªèŠ‚ç‚¹ä¹‹å’Œã€?br />·然åŽä»ŽèŠ‚ç‚¹åºåˆ—中去除˜q™ä¸¤ä¸ªèŠ‚ç‚¹ï¼ŒåŠ å…¥å®ƒä»¬çš„çˆ¶èŠ‚ç‚¹åˆ°åºåˆ—中ã€?br />
é‡å¤ä¸Šé¢ä¸¤ä¸ªæ­¥éª¤åQŒç›´åˆ°èŠ‚ç‚¹åºåˆ—中åªå‰©ä¸‹å”¯ä¸€ä¸€ä¸ªèŠ‚ç‚V€‚这时一‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)ž®±å·²¾l徿ˆäº†åQŒå®ƒçš„æ ¹ž®±æ˜¯å‰©ä¸‹çš„这个节ç‚V€?br />
ä»ä»¥ä¸Šé¢çš„例孿¥çœ‹éœå¤«æ›¼æ ?w¨¨i)的建立˜q‡ç¨‹ã€?br />最åˆçš„节点åºåˆ—是这æ ïL(f¨¥ng)š„åQ?br />a(6)  b(15)  c(2)  d(9)  e(1)

把最ž®çš„cå’Œe¾l“åˆèµäh¥
                   | (3)
a(6)   b(15)   d(9)   +------+------+
              |      |
              c     e

䏿–­é‡å¤åQŒæœ€¾lˆå¾—到的æ ?w¨¨i)是˜q™æ ·çš„:(x¨¬)

       �br />        |
   +-----33-----+
   |     |
   15   +----18----+   
       |       |
       9  +------9-----+
          |      |
         6     +--3--+
              |   |
              2  1

˜q™æ—¶å„个字符的编ç é•¿åº¦å’Œå‰é¢æˆ‘们说过的方法得到的¾~–ç é•¿åº¦æ˜¯ç›¸åŒçš„åQŒå› è€Œæ–‡ä»¶çš„æ€»é•¿åº¦ä¹Ÿæ˜¯ç›¸åŒçš„åQ?3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63

考察éœå¤«æ›¼æ ‘(w¨¨i)çš„å¾ç«‹è¿‡½E‹ä¸­çš„æ¯ä¸€æ­¥çš„èŠ‚ç‚¹åºåˆ—çš„å˜åŒ–:(x¨¬)

6  15 2 9 1
6  15 9 3
15 9  9
15 18
33

䏋颿ˆ‘们用逆推法æ¥è¯æ˜Žå¯¹äºŽå„ç§ä¸åŒçš„节点åºåˆ—,用éœå¤«æ›¼½Ž—法建立èµäh¥çš„æ ‘(w¨¨i)æ€ÀL˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQ?br />
寚wœå¤«æ›¼æ ?w¨¨i)的建立˜q‡ç¨‹˜q用逆推法:(x¨¬)
当这个过½E‹ä¸­çš„节点åºåˆ—åªæœ‰ä¸¤ä¸ªèŠ‚ç‚ÒŽ(gu¨©)—¶åQˆæ¯”如å‰ä¾‹ä¸­çš?5å’?8åQ‰ï¼Œè‚¯å®šæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒä¸€ä¸ªç¼–ç äØ“(f¨´)0åQŒå¦ä¸€ä¸ªç¼–ç äØ“(f¨´)1åQŒæ— æ³•冘q›ä¸€æ­¥ä¼˜åŒ–ã€?br />ç„¶åŽå¾€å‰æ­¥˜q›ï¼ŒèŠ‚ç‚¹åºåˆ—䏭䏿–­åœ°å‡å°‘一个节点,增加两个节点åQŒåœ¨æ­¥è¿›˜q‡ç¨‹ä¸­å°†å§‹ç»ˆä¿æŒæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒè¿™æ˜¯å› ä¸ºï¼š(x¨¬)
1.按照éœå¤«æ›¼æ ‘(w¨¨i)çš„å¾ç«‹è¿‡½E‹ï¼Œæ–°å¢žçš„两个节ç‚ÒŽ(gu¨©)˜¯å½“å‰èŠ‚ç‚¹åºåˆ—中最ž®çš„两个åQŒå…¶ä»–çš„ä»ÖM½•两个节点的父节点都大于(或等于)(j¨ª)˜q™ä¸¤ä¸ªèŠ‚ç‚¹çš„çˆ¶èŠ‚ç‚¹ï¼Œåªè¦å‰ä¸€æ­¥æ˜¯æœ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒå…¶ä»–çš„ä»ÖM½•两个节点的父节点ž®×ƒ¸€å®šéƒ½å¤„在它们的父节点的上层或åŒå±‚åQŒæ‰€ä»¥è¿™ä¸¤ä¸ªèŠ‚ç‚¹ä¸€å®šå¤„åœ¨å½“å‰äºŒå‰æ ‘(w¨¨i)的最低一层ã€?br />2.˜q™ä¸¤ä¸ªæ–°å¢žçš„节点是最ž®çš„åQŒæ‰€ä»¥æ— æ³•和其他上层节点å¯ÒŽ(gu¨©)¢ã€‚ç¬¦åˆæˆ‘们å‰é¢è¯´çš„æœ€ä¼˜äºŒå‰æ ‘(w¨¨i)的第一个æ¡ä»¶ã€?br />3.åªè¦å‰ä¸€æ­¥æ˜¯æœ€ä¼˜äºŒå‰æ ‘(w¨¨i)åQŒç”±äºŽè¿™ä¸¤ä¸ªæ–°å¢žçš„节ç‚ÒŽ(gu¨©)˜¯æœ€ž®çš„åQŒå³ä½¿åŒå±‚有其他节点åQŒä¹Ÿæ— æ³•å’ŒåŒå±‚其他节炚w‡æ–°ç»“åˆï¼Œäº§ç”Ÿæ¯”它们的父节ç‚ÒŽ(gu¨©)›´ž®çš„上层节点æ¥å’ŒåŒå±‚的其他节点对æ¢ã€‚它们的父节点å°äºŽå…¶ä»–节点的父节点,它们åˆå°äºŽå…¶ä»–所有节点,åªè¦å‰ä¸€æ­¥ç¬¦åˆæœ€ä¼˜äºŒå‰æ ‘(w¨¨i)的第二个æ¡äšgåQŒåˆ°˜q™ä¸€æ­¥ä»ž®†ç¬¦åˆã€?br />
˜q™æ ·ä¸€æ­¥æ­¥é€†æŽ¨ä¸‹åŽ»åQŒåœ¨˜q™ä¸ª˜q‡ç¨‹ä¸­éœå¤«æ›¼æ ?w¨¨i)æ¯ä¸€æ­¥éƒ½å§‹ç»ˆä¿æŒç€æ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)ã€?br />
ç”׃ºŽæ¯ä¸€æ­¥éƒ½ä»ŽèŠ‚ç‚¹åºåˆ—中删除两个节点åQŒæ–°å¢žä¸€ä¸ªèŠ‚ç‚¹ï¼Œéœå¤«æ›¼æ ‘(w¨¨i)çš„å¾ç«‹è¿‡½E‹å…±éœ€ (原始节点æ•?- 1) 步,所以éœå¤«æ›¼½Ž—法ä¸å¤±ä¸ÞZ¸€¿U精巧的¾~–ç å¼åŽ‹¾~©ç®—法ã€?br />

附:(x¨¬)对于 huffman æ ?w¨¨i),《计½Ž—机½E‹åºè®¾è®¡è‰ºæœ¯ã€‹ä¸­æœ‰å®Œå…¨ä¸åŒçš„è¯æ˜ŽåQŒå¤§æ„是˜q™æ ·çš„:(x¨¬)
åQ‘.二剾~–ç æ ?w¨¨i)的内部节点åQˆéžå¶å­èŠ‚ç‚¹åQ‰æ•°½{‰äºŽå¤–部节点åQˆå¶å­èŠ‚ç‚¹ï¼‰(j¨ª)æ•°å‡åQ‘ã€?br />åQ’.二剾~–ç æ ?w¨¨i)的外部节点的加æƒèµ\径长度(å€ég¹˜ä»¥èµ\径长度)(j¨ª)之和åQŒç­‰äºŽæ‰€æœ‰å†…部节点å€ég¹‹å’Œã€‚(˜q™ä¸¤æ¡éƒ½å¯ä»¥é€šè¿‡å¯¹èŠ‚ç‚ÒŽ(gu¨©)•°˜q用数学归纳法æ¥è¯æ˜ŽåQŒç•™¾l™å¤§å®¶åš¾lƒä¹ (f¨¤n)。)(j¨ª)
åQ“.å¯?huffman æ ?w¨¨i)的建立˜q‡ç¨‹˜q用逆推åQŒå½“åªæœ‰ä¸€ä¸ªå†…部节ç‚ÒŽ(gu¨©)—¶åQŒè‚¯å®šæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘(w¨¨i)ã€?br />åQ”ï¼Žå¾€å‰æ­¥˜q›ï¼Œæ–°å¢žä¸¤ä¸ªæœ€ž®çš„外部节点åQŒå®ƒä»¬ç»“åˆåœ¨ä¸€èµ·äñ”生一个新的内部节点,当且仅当原先的内部节炚w›†åˆæ˜¯æžå°åŒ–çš„åQŒåŠ å…¥è¿™ä¸ªæ–°çš„å†…éƒ¨èŠ‚ç‚¹åŽä»æ˜¯æžå°åŒ–çš„ã€‚ï¼ˆå› äØ“(f¨´)最ž®çš„两个节点¾l“åˆåœ¨ä¸€èµøP¼Œòq¶å¤„于最低层åQŒç›¸å¯¹äºŽå®ƒä»¬åˆ†åˆ«å’Œå…¶ä»–åŒå±‚或上层节点¾l“åˆåœ¨ä¸€èµøP¼Œè‡›_°‘ä¸ä¼š(x¨¬)增加加æƒè·¯å¾„长度。)(j¨ª)
åQ•.éšç€å†…部节点数é€ä¸ªå¢žåŠ åQŒå†…部节炚w›†åˆæ€È»´æŒæžž®åŒ–ã€?br />
[ 本帖ç”?ncs 最åŽç¼–辑于 2006-3-3 14:54 ]

æœçƒ¦(ch¨³)更多相关主题的帖å­? zip åŽŸç† Â 

å‘表äº?2006-3-3 14:49  资料短消æ?/a> 
åQ’.实现部分
  如果世界上从没有一个压¾~©ç¨‹åºï¼Œæˆ‘们看了å‰é¢çš„压¾~©åŽŸç†ï¼Œž®†æœ‰ä¿¡å¿ƒä¸€å®šèƒ½ä½œå‡ºä¸€ä¸ªå¯ä»¥åŽ‹¾~©å¤§å¤šæ•°æ ¼å¼ã€å†…容的数æ®çš„程åºï¼Œå½“æˆ‘ä»¬ç€æ‰‹è¦åšè¿™æ ·ä¸€ä¸ªç¨‹åºçš„æ—¶å€™ï¼Œä¼?x¨¬)å‘çŽ°æœ‰å¾ˆå¤šçš„éš¾é¢˜éœ€è¦æˆ‘们去一个个解决åQŒä¸‹é¢å°†é€ä¸ªæè¿°˜q™äº›éšùN¢˜åQŒåÆˆè¯¦ç»†åˆ†æž zip ½Ž—法是如何解册™¿™äº›éš¾é¢˜çš„åQŒå…¶ä¸­å¾ˆå¤šé—®é¢˜å¸¦æœ‰æ™®éæ„义,比如查找匚w…åQŒæ¯”如数¾l„排åºç­‰½{‰ï¼Œ˜q™äº›éƒ½æ˜¯è¯´ä¸ž®½çš„è¯é¢˜åQŒè®©æˆ‘们深入其中åQŒåšä¸€ç•ªæ€è€ƒã€?br />
我们å‰é¢è¯´è¿‡åQŒå¯¹äºŽçŸ­è¯­å¼é‡å¤åQŒæˆ‘们用“é‡å¤è·å½“å‰ä½ç½®çš„è·¼› Z€å’Œâ€œé‡å¤çš„长度â€è¿™ä¸¤ä¸ªæ•°å­—æ¥è¡¨½Cø™¿™ä¸€ŒDµé‡å¤ï¼Œä»¥å®žçŽ°åŽ‹¾~©ï¼ŒçŽ°åœ¨é—®é¢˜æ¥äº†åQŒä¸€ä¸ªå­—节能表示的数字大ž®äØ“(f¨´) 0 åQ?55åQŒç„¶è€Œé‡å¤å‡ºçŽ°çš„ä½ç½®å’Œé‡å¤çš„长度都å¯èƒ½è¶…˜q?255åQŒäº‹å®žä¸ŠåQŒäºŒ˜q›åˆ¶æ•°çš„使•°¼‹®å®šä¸‹æ¥åŽï¼Œæ‰€èƒ½è¡¨½Cºçš„æ•°å­—大å°çš„范围是有é™çš„,nä½çš„二˜q›åˆ¶æ•°èƒ½è¡¨ç¤ºçš„æœ€å¤§å€¼æ˜¯åQ’的n次方å‡åQ‘ï¼Œå¦‚æžœä½æ•°å–得太大åQŒå¯¹äºŽå¤§é‡çš„短匹é…,å¯èƒ½ä¸ä½†èµ·ä¸åˆ°åŽ‹¾~©ä½œç”¨ï¼Œå而增大了最¾lˆçš„¾l“果。针对这¿U情况,有两¿Uä¸åŒçš„½Ž—法æ¥è§£å†Œ™¿™ä¸ªé—®é¢˜ï¼Œå®ƒä»¬æ˜¯ä¸¤¿Uä¸åŒçš„æ€èµ\。一¿Uç§°ä¸?lz77 ½Ž—法åQŒè¿™æ˜¯ä¸€¿U很自然的æ€èµ\åQšé™åˆ¶è¿™ä¸¤ä¸ªæ•°å­—的大ž®ï¼Œä»¥å–得折è¡ïL(f¨¥ng)š„压羃效果。例如跼›Õd– 15 ä½ï¼Œé•¿åº¦å?8 ä½ï¼Œ˜q™æ ·åQŒè·¼›Èš„æœ€å¤§å–å€égØ“(f¨´) 32 k - 1åQŒé•¿åº¦çš„æœ€å¤§å–å€égØ“(f¨´) 255åQŒè¿™ä¸¤ä¸ªæ•°å­—å?23 ä½ï¼Œæ¯”三个字节少一ä½ï¼Œæ˜¯ç¬¦åˆåŽ‹¾~©çš„è¦æ±‚的。让我们在头脑中惌™±¡ä¸€ä¸?lz77 ½Ž—法压羃˜q›è¡Œæ—¶çš„æƒ…况åQŒä¼š(x¨¬)å‡ºçŽ°æœ‰æ„æ€çš„æ¨¡åž‹åQ?br />
   最˜qœåŒ¹é…ä½¾|®ï¼åQžã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€å½“å‰å¤„ç†ä½ç½®åQ>
───┸─────────────────╂─────────────åQžåŽ‹¾~©è¿›è¡Œæ–¹å?br />   已压¾~©éƒ¨åˆ†ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€â”ƒã€€ã€€ã€€ã€€æœªåŽ‹¾~©éƒ¨åˆ?br />
  在最˜qœåŒ¹é…ä½¾|®å’Œå½“å‰å¤„ç†ä½ç½®ä¹‹é—´æ˜¯å¯ä»¥ç”¨æ¥æŸ¥æ‰‘ÖŒ¹é…的“字典â€åŒºåŸŸï¼Œéšç€åŽ‹ç¾ƒçš„è¿›è¡Œï¼Œâ€œå­—å…¸â€åŒºåŸŸä»Žå¾…压¾~©æ–‡ä»¶çš„å¤´éƒ¨ä¸æ–­åœ°å‘åŽæ»‘动,直到辑ֈ°æ–‡äšg的尾部,短语å¼åŽ‹¾~©ä¹Ÿž®Þq»“æŸäº†ã€?br />  解压¾~©ä¹Ÿéžå¸¸½Ž€å•:(x¨¬)

         ┎────────拯‚´â”€â”€â”€â”€â”€â”€â”€â”€â”?br /> 匚w…ä½ç½®ã€€ã€€ã€€ã€€â”ƒã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€å½“å‰å¤„ç†ä½ç½®ã€€ã€€â”?br />   ┃<──匚w…长度──åQžâ”ƒã€€ã€€ã€€ã€€ã€€ã€€ã€€â” â”€â”€â”€â”€â”€âˆ¨â”€â”€â”€â”€â”?br />───┸──────────┸───────╂──────────┸─åQžè§£åŽ‹è¿›è¡Œæ–¹å?br />   已解压部分              ┃    未解压部åˆ?br />
ã€€ã€€ä¸æ–­åœîC»ŽåŽ‹ç¾ƒæ–‡äšg中读出匹é…ä½¾|®å€¼å’ŒåŒšw…长度å€û|¼ŒæŠŠå·²è§£åŽ‹éƒ¨åˆ†çš„åŒ¹é…内å®ÒŽ(gu¨©)‹·è´åˆ°è§£åŽ‹æ–‡äšgž®ùNƒ¨åQŒé‡åˆ°åŽ‹¾~©æ–‡ä»¶ä¸­é‚£äº›åŽ‹ç¾ƒæ—¶æœªèƒ½å¾—åˆ°åŒ¹é…,而是直接ä¿å­˜çš„å•ã€åŒå­—节åQŒè§£åŽ‹æ—¶åªè¦ç›´æŽ¥æ‹¯‚´åˆ°æ–‡ä»¶å°¾éƒ¨å³å¯ï¼Œç›´åˆ°æ•´ä¸ªåŽ‹ç¾ƒæ–‡äšg处ç†å®Œæ¯•ã€?br />  lz77½Ž—法模型也被¿UîCØ“(f¨´)â€œæ»‘åŠ¨å­—å…¸â€æ¨¡åž‹æˆ–“滑动窗å£â€æ¨¡åž‹ã€?br />ã€€ã€€å¦æœ‰ä¸€¿Ulzw½Ž—法对待压羃文äšg中存在大é‡ç®€å•匹é…的情况˜q›è¡Œäº†å®Œå…¨ä¸åŒçš„½Ž—法设计åQŒå®ƒåªç”¨ä¸€ä¸ªæ•°å­—æ¥è¡¨ç¤ºä¸€ŒD늟­è¯­ï¼Œä¸‹é¢æ¥æ˜qîC¸€ä¸‹lzw的压¾~©è§£åŽ‹è¿‡½E‹ï¼Œç„¶åŽæ¥ç»¼åˆæ¯”较两者的适用情况ã€?br />  lzw的压¾~©è¿‡½E‹ï¼š(x¨¬)
1) åˆå§‹åŒ–一个指定大ž®çš„å­—å…¸åQŒæŠŠ 256 ¿U字节å–值加入字典ã€?br />2) 在待压羃文äšg的当å‰å¤„ç†ä½¾|®å¯»æ‰‘Öœ¨å­—典中出现的最长匹é…,输出该匹é…在字典中的åºå·ã€?br />3) 如果字典没有辑ֈ°æœ€å¤§å®¹é‡ï¼ŒæŠŠè¯¥åŒšw…加上它在待压¾~©æ–‡ä»¶ä¸­çš„下一个字节加入字典ã€?br />4) 把当å‰å¤„ç†ä½¾|®ç§»åˆ°è¯¥åŒšw…åŽã€?br />5) é‡å¤ 2ã€?ã€? 直到文äšg输出完毕ã€?br />
  lzw 的解压过½E‹ï¼š(x¨¬)
1) åˆå§‹åŒ–一个指定大ž®çš„å­—å…¸åQŒæŠŠ 256 ¿U字节å–值加入字典ã€?br />2) 从压¾~©æ–‡ä»¶ä¸­™åºåºè¯Õd‡ºä¸€ä¸ªå­—å…¸åºåøP¼Œæ ÒŽ(gu¨©)®è¯¥åºåøP¼ŒæŠŠå­—å…æ€¸­ç›¸åº”çš„æ•°æ®æ‹·è´åˆ°è§£åŽ‹æ–‡äšgž®ùNƒ¨ã€?br />3) 如果字典没有辑ֈ°æœ€å¤§å®¹é‡ï¼ŒæŠŠå‰ä¸€ä¸ªåŒ¹é…内容加上当å‰åŒ¹é…çš„½W¬ä¸€ä¸ªå­—节加入字典ã€?br />4) é‡å¤ 2ã€? 两步直到压羃文äšg处ç†å®Œæ¯•ã€?br />
  ä»?lzw 的压¾~©è¿‡½E‹ï¼Œæˆ‘们å¯ä»¥å½’纳出它ä¸åŒäº?lz77 ½Ž—法的一些主è¦ç‰¹ç‚¹ï¼š(x¨¬)
1) 对于一ŒD늟­è¯­ï¼Œå®ƒåªè¾“出一个数字,å›_­—å…æ€¸­çš„åºå—÷€‚(˜q™ä¸ªæ•°å­—çš„ä½æ•°å†³å®šäº†å­—典的最大容é‡ï¼Œå½“å®ƒçš„ä½æ•°å–得太大时åQŒæ¯”å¦?24 ä½ä»¥ä¸Šï¼Œå¯¹äºŽçŸ­åŒ¹é…å å¤šæ•°çš„æƒ…况,压羃率å¯èƒ½å¾ˆä½Žã€‚å–得太ž®æ—¶åQŒæ¯”å¦?8 ä½ï¼Œå­—典的容é‡å—到é™åˆ¶ã€‚æ‰€ä»¥åŒæ ·éœ€è¦å–èˆã€‚)(j¨ª)
2) 对于一个短语,比如 abcd åQŒå½“它在待压¾~©æ–‡ä»¶ä¸­½W¬ä¸€‹Æ¡å‡ºçŽ°æ—¶åQŒab 被加入字典,½W¬äºŒ‹Æ¡å‡ºçŽ°æ—¶åQŒabc 被加入字典,½W¬ä¸‰‹Æ¡å‡ºçŽ°æ—¶åQŒabcd æ‰ä¼š(x¨¬)被加入字典,对于一些长匚w…åQŒå®ƒå¿…须高频率地出现åQŒåƈ且字典有较大的容é‡ï¼Œæ‰ä¼š(x¨¬)被最¾lˆå®Œæ•´åœ°åŠ å…¥å­—å…¸ã€‚ç›¸åº”åœ°åQŒlz77 åªè¦åŒšw…在“字典区域â€ä¸­å­˜åœ¨åQŒé©¬ä¸Šå°±å¯ä»¥ç›´æŽ¥ä½¿ç”¨ã€?br />3) è®?lzw 的“字典åºå·â€å– n ä½ï¼Œå®ƒçš„æœ€å¤§é•¿åº¦å¯ä»¥è¾¾åˆ?2 çš?n ‹Æ¡æ–¹åQ›è®¾ lz77 的“匹é…长度â€å– n ä½ï¼Œâ€œåŒ¹é…è·¼› Z€å– d ä½ï¼Œå®ƒçš„æœ€å¤§é•¿åº¦ä¹Ÿæ˜?2 çš?n ‹Æ¡æ–¹åQŒä½†˜q˜è¦å¤šè¾“å‡?d ä½ï¼ˆd 臛_°‘ä¸å°äº?nåQ‰ï¼Œä»Žç†è®ÞZ¸Šè¯?lzw æ¯è¾“å‡ÞZ¸€ä¸ªåŒ¹é…åªè¦?n ä½ï¼Œä¸ç®¡æ˜¯é•¿åŒšw…˜q˜æ˜¯çŸ­åŒ¹é…ï¼ŒåŽ‹ç¾ƒçŽ‡è¦æ¯?lz77 高至ž®‘一å€ï¼Œä½†å®žé™…上åQŒlzw çš„å­—å…æ€¸­çš„匹é…长度的增长ç”׃ºŽå„匹é…互相打断,很难辑ֈ°æœ€å¤§å€¹{€‚而且虽然 lz77 æ¯ä¸€ä¸ªåŒ¹é…都è¦å¤šè¾“出 d ä½ï¼Œä½?lzw æ¯ä¸€ä¸ªåŒ¹é…都è¦ä»Žå•字节开始增长è“våQŒå¯¹äºŽç§¾cȹ多的匚w…åQŒlzw 居于劣势ã€?br />  å¯ä»¥çœ‹å‡ºåQŒåœ¨å¤šæ•°æƒ…况下,lz77 拥有更高的压¾~©çއåQŒè€Œåœ¨å¾…压¾~©æ–‡ä»¶ä¸­å ç»å¤§å¤šæ•°çš„æ˜¯äº›½Ž€å•的匚w…æ—Óž¼Œlzw 更具优势åQŒGIF ž®±æ˜¯é‡‡ç”¨äº?lzw ½Ž—法æ¥åŽ‹¾~©èƒŒæ™¯å•一ã€å›¾å½¢ç®€å•的囄¡‰‡ã€‚zip 是用æ¥åŽ‹¾~©é€šç”¨æ–‡äšg的,˜q™å°±æ˜¯å®ƒé‡‡ç”¨å¯¹å¤§å¤šæ•°æ–‡äšg有更高压¾~©çއçš?lz77 ½Ž—法的原因ã€?br />
  接下æ?zip ½Ž—法ž®†è¦è§£å†³åœ¨â€œå­—典区域â€ä¸­å¦‚何高速查找最长匹é…的问题ã€?br />
åQˆæ³¨åQšä»¥ä¸‹å…³äºŽæŠ€æœ¯ç»†èŠ‚çš„æè¿°æ˜¯ä»¥ gzip 的公开æºä»£ç äØ“(f¨´)基础的,如果需è¦å®Œæ•´çš„代ç åQŒå¯ä»¥åœ¨ gzip 的官方网ç«?www.gzip.org 下è²ã€‚ä¸‹é¢æåˆ°çš„æ¯ä¸€ä¸ªé—®é¢˜ï¼Œéƒ½é¦–先介¾l最直观½Ž€å•的解决æ–ÒŽ(gu¨©)³•åQŒç„¶åŽæŒ‡å‡ø™¿™¿U方法的弊端所在,最åŽä»‹¾l?gzip é‡‡ç”¨çš„åšæ³•,˜q™æ ·ä¹Ÿè®¸èƒ½ä‹É读者对 gzip çœ‹ä¼¼å¤æ‚ã€ä¸ç›´è§‚çš„åšæ³•çš„æ„义有更好的ç†è§£ã€‚)(j¨ª)
最直观的æœç´¢æ–¹å¼æ˜¯™åºåºæœçƒ¦(ch¨³)åQšä»¥å¾…压¾~©éƒ¨åˆ†çš„½W¬ä¸€ä¸ªå­—节与½H—å£ä¸­çš„æ¯ä¸€ä¸ªå­—èŠ‚ä¾‹Æ¡æ¯”è¾ƒï¼Œå½“æ‰¾åˆîC¸€ä¸ªç›¸½{‰çš„字节æ—Óž¼Œå†æ¯”较厾l­çš„字节…â€?é历了窗å£åŽå¾—出最长匹é…。gzip 用的是被¿UîC½œâ€œå“ˆå¸Œè¡¨â€çš„æ–ÒŽ(gu¨©)³•æ¥å®žçŽ°è¾ƒé«˜æ•ˆçš„æœç´¢ã€‚“哈希(hashåQ‰â€æ˜¯åˆ†æ•£çš„æ„æ€ï¼ŒæŠŠå¾…æœçƒ¦(ch¨³)çš„æ•°æ®æŒ‰ç…§å­—节值分散到一个个“桶â€ä¸­åQŒæœç´¢æ—¶å†æ ¹æ®å­—节值到相应的“桶â€ä¸­åŽÕd¯»æ‰¾ã€‚短语å¼åŽ‹ç¾ƒçš„æœ€çŸ­åŒ¹é…䨓(f¨´) 3 个字节,gzip ä»?3 个字节的å€ég½œä¸ºå“ˆå¸Œè¡¨çš„烦(ch¨³)引,ä½?3 个字节共æœ?2 çš?24 ‹Æ¡æ–¹¿Uå–å€û|¼Œéœ€è¦?16M 个桶åQŒæ¡¶é‡Œå­˜æ”„¡š„是窗å£ä¸­çš„ä½¾|®å€û|¼Œ½H—å£çš„大ž®äØ“(f¨´) 32KåQŒæ‰€ä»¥æ¯ä¸ªæ¡¶è‡›_°‘è¦æœ‰å¤§äºŽä¸¤ä¸ªå­—节的空é—ß_(d¨¢)¼Œå“ˆå¸Œè¡¨å°†å¤§äºŽ 32MåQŒä½œä¸?90 òq´ä»£å¼€å‘çš„½E‹åºåQŒè¿™ä¸ªè¦æ±‚是太大了,而且éšç€½H—å£çš„移动,哈希表里的数æ®ä¼š(x¨¬)䏿–­˜q‡æ—¶åQŒç»´æŠ¤è¿™ä¹ˆå¤§çš„表åQŒä¼š(x¨¬)é™ä½Ž½E‹åºçš„æ•ˆçŽ‡ï¼Œgzip å®šä¹‰å“ˆå¸Œè¡¨äØ“(f¨´) 2 çš?15 ‹Æ¡æ–¹åQ?2KåQ‰ä¸ªæ¡Óž¼Œòq¶è®¾è®¡äº†ä¸€ä¸ªå“ˆå¸Œå‡½æ•°æŠŠ 16M ¿Uå–值对应到 32K 个桶中,ä¸åŒçš„倯D¢«å¯¹åº”到相åŒçš„æ¡¶ä¸­æ˜¯ä¸å¯é¿å…çš„åQŒå“ˆå¸Œå‡½æ•°çš„ä»ÕdŠ¡æ˜?1.使儿Uå–值尽å¯èƒ½å‡åŒ€åœ°åˆ†å¸ƒåˆ°å„个桶中åQŒé¿å…许多ä¸åŒçš„值集中到æŸäº›æ¡¶ä¸­åQŒè€Œå¦ä¸€äº›æ˜¯½Iºæ¡¶åQŒä‹Éæœçƒ¦(ch¨³)的效率é™ä½Žã€?.函数的计½Ž—å°½å¯èƒ½åœ°ç®€å•ï¼Œå› äØ“(f¨´)æ¯æ¬¡â€œæ’å…¥â€å’Œâ€œæœå¯ Z€å“ˆå¸Œè¡¨éƒ½è¦æ‰§è¡Œå“ˆå¸Œå‡½æ•°åQŒå“ˆå¸Œå‡½æ•°çš„夿‚度直接媄(ji¨£ng)å“程åºçš„æ‰§è¡Œæ•ˆçއåQŒå®¹æ˜“æƒ³åˆ°çš„å“ˆå¸Œå‡½æ•°æ˜¯å– 3 个字节的左边åQˆæˆ–匙¾¹åQ?5 ä½äºŒ˜q›åˆ¶å€û|¼Œä½†è¿™æ ·åªè¦å·¦è¾¹ï¼ˆæˆ–å³è¾¹ï¼‰(j¨ª)2 个字节相åŒï¼Œž®×ƒ¼š(x¨¬)被放到åŒä¸€ä¸ªæ¡¶ä¸­ï¼Œè€?2 个字节相åŒçš„æ¦‚率是比较高的,ä¸ç¬¦åˆâ€œåã^å‡åˆ†å¸ƒâ€çš„è¦æ±‚。gzip 采用的算法是åQšA(4,5) + A(6,7,8) ^ B(1,2,3) + B(4,5) + B(6,7,8) ^ C(1,2,3) + C(4,5,6,7,8) åQˆè¯´æ˜Žï¼š(x¨¬)A æŒ?3 个字节中的第 1 个字节,B 指第 2 个字节,C 指第 3 个字节,A(4,5) 指第一个字节的½W?4,5 ä½äºŒ˜q›åˆ¶ç ï¼Œâ€œ^â€æ˜¯äºŒè¿›åˆ¶ä½çš„异或æ“作,â€?â€æ˜¯â€œè¿žæŽ¥â€è€Œä¸æ˜¯â€œåŠ â€ï¼Œâ€œ^â€ä¼˜å…ˆäºŽâ€?â€ï¼‰(j¨ª)˜q™æ ·ä½?3 个字节都ž®½é‡â€œå‚与â€åˆ°æœ€åŽçš„¾l“果中æ¥åQŒè€Œä¸”æ¯ä¸ª¾l“æžœå€?h 都等äº?((å‰?个h << 5) ^ c)å–å³ 15 ä½ï¼Œè®¡ç®—也还½Ž€å•ã€?
哈希表的具体实现也值得探讨,因䨓(f¨´)æ— æ³•é¢„å…ˆçŸ¥é“æ¯ä¸€ä¸ªâ€œæ¡¶â€ä¼š(x¨¬)存放多少个元素,所以最½Ž€å•çš„åQŒä¼š(x¨¬)惛_ˆ°ç”¨é“¾è¡¨æ¥å®žçްåQšå“ˆå¸Œè¡¨é‡Œå­˜æ”„¡€æ¯ä¸ªæ¡¶çš„½W¬ä¸€ä¸ªå…ƒç´ ï¼Œæ¯ä¸ªå…ƒç´ é™¤äº†å­˜æ”¾ç€è‡ªèínçš„å€û|¼Œ˜q˜å­˜æ”„¡€ä¸€ä¸ªæŒ‡é’ˆï¼ŒæŒ‡å‘åŒä¸€ä¸ªæ¡¶ä¸­çš„下一个元素,å¯ä»¥™åºç€æŒ‡é’ˆé“¾æ¥é历该桶中的æ¯ä¸€ä¸ªå…ƒç´ ï¼Œæ’入元素æ—Óž¼Œå…ˆç”¨å“ˆå¸Œå‡½æ•°½Ž—出该放到第几个桶中åQŒå†æŠŠå®ƒæŒ‚到相应链表的最åŽã€‚这个方案的¾~ºç‚¹æ˜¯é¢‘¾J地甌™¯·å’Œé‡Šæ”‘Ö†…存会(x¨¬)é™ä½Ž˜q行速度åQ›å†…å­˜æŒ‡é’ˆçš„å­˜æ”¾å æ®äº†é¢å¤–的内存开销。有更少内存开销和更快速的æ–ÒŽ(gu¨©)³•æ¥å®žçŽ°å“ˆå¸Œè¡¨åQŒåƈ且ä¸éœ€è¦é¢‘¾J的内存甌™¯·å’Œé‡Šæ”¾ï¼š(x¨¬)gzip 在内存中甌™¯·äº†ä¸¤ä¸ªæ•°¾l„ï¼Œä¸€ä¸ªå« head[]åQŒä¸€ä¸ªå« pre[]åQŒå¤§ž®éƒ½ä¸?32KåQŒæ ¹æ®å½“å‰ä½¾|?strstart 开始的 3 个字节,用哈希函数计½Ž—出åœ?head[] 中的ä½ç½® ins_håQŒç„¶åŽæŠŠ head[ins_h] ä¸­çš„å€ÆD®°å…?pre[strstart]åQŒå†æŠŠå½“å‰ä½¾|?strstart è®°å…¥ head[ins_h]。éšç€åŽ‹ç¾ƒçš„è¿›è¡Œï¼Œhead[]é‡Œè®°è½½ç€æœ€˜q‘çš„å¯èƒ½çš„匹é…çš„ä½ç½®åQˆå¦‚果有匚w…çš„è¯åQŒhead[ins_h]ä¸äØ“(f¨´) 0åQ‰ï¼Œpre[]中的所有佾|®ä¸ŽåŽŸå§‹æ•°æ®çš„ä½¾|®ç›¸å¯¹åº”åQŒä½†æ¯ä¸€ä¸ªä½¾|®ä¿å­˜çš„值是å‰ä¸€ä¸ªæœ€˜q‘çš„å¯èƒ½çš„匹é…çš„ä½ç½®ã€‚(“å¯èƒ½çš„匚w…â€æ˜¯æŒ‡å“ˆå¸Œå‡½æ•°è®¡½Ž—出çš?ins_h 相åŒã€‚)(j¨ª)™åºç€ pre[] 中的指示找下去,直到é‡åˆ° 0åQŒå¯ä»¥å¾—到所有匹é…在原始数æ®ä¸­çš„ä½ç½®åQ? 表示ä¸å†æœ‰æ›´˜qœçš„匚w…ã€?br />  接下æ¥å¾ˆè‡ªç„¶åœ°è¦è§‚察 gzip 具体是如何判断哈希表中数æ®çš„˜q‡æ—¶åQŒå¦‚何清ç†å“ˆå¸Œè¡¨çš„ï¼Œå› äØ“(f¨´) pre[] 里åªèƒ½å­˜æ”?32K 个元素,所以这™å¹å·¥ä½œæ˜¯å¿…é¡»è¦åšçš„ã€?br />  gzip 从原始文件中è¯Õd‡ºä¸¤ä¸ª½H—å£å¤§å°çš„内容(å…?64K 字节åQ‰åˆ°ä¸€å—内存中åQŒè¿™å—内存也是一个数¾l„,¿UîC½œ Window[]åQ›ç”³è¯?head[]ã€pre[] òq¶æ¸…é›Óž¼›strstart ¾|®äØ“(f¨´) 0。然å?gzip è¾ÒŽ(gu¨©)œç´¢è¾¹æ’å…¥åQŒæœç´¢æ—¶é€šè¿‡è®¡ç®— ins_håQŒæ£€æŸ?head[] ä¸­æ˜¯å¦æœ‰åŒšw…åQŒå¦‚果有匚w…åQŒåˆ¤æ–?strstart å‡?head[] 中的ä½ç½®æ˜¯å¦å¤§äºŽ 1 个窗å£çš„大å°åQŒå¦‚果大äº?1 个窗å£çš„大å°åQŒå°±ä¸åˆ° pre[] 中去æœçƒ¦(ch¨³)äº†ï¼Œå› äØ“(f¨´) pre[] 中ä¿å­˜çš„ä½ç½®æ›´è¿œäº†ï¼Œå¦‚æžœä¸å¤§äºŽï¼Œž®±é¡ºç€ pre[] 的指½Cºåˆ° Window[] 中é€ä¸ªåŒšw…ä½ç½®å¼€å§‹ï¼Œé€ä¸ªå­—节与当å‰ä½¾|®çš„æ•°æ®æ¯”较åQŒä»¥æ‰‘Ö‡ºæœ€é•¿åŒ¹é…,pre[] 中的ä½ç½®ä¹Ÿè¦åˆ¤æ–­æ˜¯å¦­‘…出一个窗å£ï¼Œå¦‚é‡åˆ°è¶…å‡ÞZ¸€ä¸ªçª—å£çš„ä½ç½®æˆ–è€?0 ž®×ƒ¸å†æ‰¾ä¸‹åŽ»åQŒæ‰¾ä¸åˆ°åŒšw…ž®Þp¾“出当å‰ä½¾|®çš„å•个字节到å¦å¤–的内存åQˆè¾“å‡ºæ–¹æ³•åœ¨åŽæ–‡ä¸­ä¼š(x¨¬)介ç»åQ‰ï¼Œòq¶æŠŠ strstart æ’入哈希表,strstart 递增åQŒå¦‚果找åˆîCº†åŒšw…åQŒå°±è¾“出匚w…ä½ç½®å’ŒåŒ¹é…长度这两个数字到å¦å¤–的内存中,òq¶æŠŠ strstart 开始的åQŒç›´åˆ?strstart + 匚w…长度 为止的所有佾|®éƒ½æ’入哈希表,strstart += 匚w…长度。æ’å…¥å“ˆå¸Œè¡¨çš„æ–¹æ³•äØ“(f¨´)åQ?br />pre[strstart % 32K] = head[ins_h];
head[ins_h] = strstart;
å¯ä»¥çœ‹å‡ºåQŒpre[] 是åó@环利用的åQŒæ‰€æœ‰çš„ä½ç½®éƒ½åœ¨ä¸€ä¸ªçª—å£ä»¥å†…,但æ¯ä¸€ä¸ªä½¾|®ä¿å­˜çš„å€ég¸ä¸€å®šæ˜¯ä¸€ä¸ªçª—å£ä»¥å†…的。在æœçƒ¦(ch¨³)æ—Óž¼Œhead[] å’?pre[] 中的ä½ç½®å€¼å¯¹åº”到 pre[] 时也è¦?% 32K。当 Window[] 中的原始数殞®†è¦å¤„ç†å®Œæ¯•æ—Óž¼Œè¦æŠŠ Window[] 中åŽä¸€½H—的数æ®å¤åˆ¶åˆ°å‰ä¸€½H—,å†è¯»å?32K 字节的数æ®åˆ°åŽä¸€½H—,strstart -= 32KåQŒéåŽ?head[]åQŒå€¼å°äºŽç­‰äº?32K 的,¾|®äØ“(f¨´) 0åQŒå¤§äº?32K 的,-= 32KåQ›pre[] å?head[] 一样处ç†ã€‚ç„¶åŽåŒå‰é¢ä¸€æ ·å¤„ç†æ–°ä¸€½H—的数æ®ã€?br />  分æžåQšçŽ°åœ¨å¯ä»¥çœ‹åˆŽÍ¼Œè™½ç„¶ 3 个字节有 16M ¿Uå–å€û|¼Œä½†å®žé™…上一个窗å£åªæœ?32K 个å–å€¼éœ€è¦æ’入哈希表åQŒç”±äºŽçŸ­è¯­å¼é‡å¤çš„å­˜åœ¨ï¼Œå®žé™…åªæœ‰ < 32K ¿Uå–值æ’入哈希表çš?32K 个“桶â€ä¸­åQŒè€Œä¸”哈希函数åˆç¬¦åˆâ€œåã^å‡åˆ†å¸ƒâ€çš„è¦æ±‚åQŒæ‰€ä»¥å“ˆå¸Œè¡¨ä¸­å®žé™…存在的“冲½Hâ€ä¸€èˆ¬ä¸ä¼?x¨¬)多åQŒå¯¹æœçƒ¦(ch¨³)效率的媄(ji¨£ng)å“ä¸å¤§ã€‚å¯ä»¥é¢„计,在“一般情况â€ä¸‹åQŒæ¯ä¸ªâ€œæ¡¶â€ä¸­å­˜æ”¾çš„æ•°æ®ï¼Œæ­£æ˜¯æˆ‘ä»¬è¦æ‰¾çš„。哈希表在儿Uæœç´¢ç®—法中åQŒå®žçŽ°ç›¸å¯¹çš„æ¯”è¾ƒ½Ž€å•,å®ÒŽ(gu¨©)˜“ç†è§£åQŒâ€œåã^凿œç´¢é€Ÿåº¦â€æœ€å¿«ï¼Œå“ˆå¸Œå‡½æ•°çš„设计是æœçƒ¦(ch¨³)速度的关键,åªè¦½W¦åˆâ€œåã^å‡åˆ†å¸ƒâ€å’Œâ€œè®¡½Ž—简å•â€ï¼Œž®±å¸¸å¸¸èƒ½æˆäØ“(f¨´)è¯¸ç§æœçƒ¦(ch¨³)½Ž—法中的首选,所以哈希表是最‹¹è¡Œçš„一¿Uæœç´¢ç®—法。但在æŸäº›ç‰¹ŒDŠæƒ…况下åQŒå®ƒä¹Ÿæœ‰¾~ºç‚¹åQŒæ¯”如:(x¨¬)1.当键ç ?k ä¸å­˜åœ¨æ—¶åQŒè¦æ±‚找出å°äº?k çš„æœ€å¤§é”®ç æˆ–大于 k 的最ž®é”®ç ï¼Œå“ˆå¸Œè¡¨æ— æ³•有效率地满­‘Œ™¿™¿Uè¦æ±‚ã€?.哈希表的“åã^凿œç´¢é€Ÿåº¦â€æ˜¯å»ºç«‹åœ¨æ¦‚率论的基¼‹€ä¸Šçš„åQŒå› ä¸ÞZº‹å…ˆä¸èƒ½é¢„知待æœçƒ¦(ch¨³)的数æ®é›†åˆï¼Œæˆ‘们åªèƒ½â€œä¿¡èµ–â€æœç´¢é€Ÿåº¦çš„“åã^å‡å€¼â€ï¼Œè€Œä¸èƒ½â€œä¿è¯â€æœç´¢é€Ÿåº¦çš„“上é™â€ã€‚在åŒäh¾cÀL€§å‘½æ”¸å…³çš„应用中åQˆå¦‚åŒÈ–—或宇航领域)(j¨ª)åQŒå°†æ˜¯ä¸åˆé€‚的。这些情况åŠ(qi¨¢ng)其他一些特ŒDŠæƒ…况下åQŒæˆ‘们必™åÀL±‚助其他“åã^å‡é€Ÿåº¦â€è¾ƒä½Žï¼Œä½†èƒ½æ»¡èƒö相应的特ŒDŠè¦æ±‚çš„½Ž—法。(è§ã€Šè®¡½Ž—机½E‹åºè®¾è®¡è‰ºæœ¯ã€‹ç¬¬3å?排åºä¸ŽæŸ¥æ‰¾ï¼‰(j¨ª)。幸而“在½H—å£ä¸­æœç´¢åŒ¹é…字节串â€ä¸å±žäºŽç‰ÒŽ(gu¨©)®Šæƒ…况ã€?br />
æ—‰™—´ä¸ŽåŽ‹¾~©çŽ‡çš„åã^衡:(x¨¬)
gzip 定义了几¿Uå¯ä¾›é€‰æ‹©çš?levelåQŒè¶Šä½Žçš„ level 压羃旉™—´­‘Šå¿«ä½†åŽ‹¾~©çއ­‘Šä½ŽåQŒè¶Šé«˜çš„ level 压羃旉™—´­‘Šæ…¢ä½†åŽ‹¾~©çއ­‘Šé«˜ã€?br />ä¸åŒçš?level 对下é¢å››ä¸ªå˜é‡æœ‰ä¸åŒçš„å–å€û|¼š(x¨¬)

nice_length
max_chain
max_lazy
good_length

nice_lengthåQšå‰é¢è¯´˜q‡ï¼Œæœçƒ¦(ch¨³)匚w…æ—Óž¼Œ™åºç€ pre[] 的指½Cºåˆ° Window[] 中é€ä¸ªåŒšw…ä½ç½®å¼€å§‹ï¼Œæ‰‘Ö‡ºæœ€é•¿åŒ¹é…,但在˜q™è¿‡½E‹ä¸­åQŒå¦‚æžœé‡åˆîC¸€ä¸ªåŒ¹é…的长度辑ֈ°æˆ–è¶…˜q?nice_lengthåQŒå°±ä¸å†è¯•图å¯ÀL‰¾æ›´é•¿çš„匹é…。最低的 level 定义 nice_length ä¸?8åQŒæœ€é«˜çš„ level 定义 nice_length ä¸?258åQˆå³ä¸€ä¸ªå­—节能表示的最大短语匹é…é•¿åº?3 + 255åQ‰ã€?br />
max_chainåQšè¿™ä¸ªå€ÆD§„定了™åºç€ pre[] 的指½Cºå¾€å‰å›žæº¯çš„æœ€å¤§æ¬¡æ•°ã€‚最低的 level 定义 max_chain ä¸?4åQŒæœ€é«˜çš„ level 定义 max_chain ä¸?4096。当 max_chain å’?nice_length 有冲½Hæ—¶åQŒä»¥å…ˆè¾¾åˆ°çš„为准ã€?br />
max_lazyåQšè¿™é‡Œæœ‰ä¸€ä¸ªæ‡’惰匹é…(lazy matchåQ‰çš„æ¦‚念åQŒåœ¨è¾“出当å‰ä½ç½®åQˆstrstartåQ‰çš„匚w…之å‰åQŒgzip ä¼?x¨¬)去找下一个佾|®ï¼ˆstrstart + 1åQ‰çš„匚w…åQŒå¦‚果下一个匹é…的长度比当å‰åŒ¹é…的长度更长åQŒgzip ž®±æ”¾å¼ƒå½“å‰åŒ¹é…,åªè¾“出当å‰ä½¾|®å¤„的首个字节,然åŽå†æŸ¥æ‰?strstart + 2 处的匚w…åQŒè¿™æ ïL(f¨¥ng)š„æ–¹å¼ä¸€ç›´å¾€åŽæ‰¾åQŒå¦‚æžœåŽä¸€ä¸ªåŒ¹é…比å‰ä¸€ä¸ªåŒ¹é…更长,ž®±åªè¾“出å‰ä¸€ä¸ªåŒ¹é…的首字节,直到é‡åˆ°å‰ä¸€ä¸ªåŒ¹é…长于åŽä¸€ä¸ªåŒ¹é…,æ‰è¾“出å‰ä¸€ä¸ªåŒ¹é…ã€?br />gzip 作者的æ€èµ\是,如果åŽä¸€ä¸ªåŒ¹é…比å‰ä¸€ä¸ªåŒ¹é…更长,ž®Þq‰ºç‰²å‰ä¸€ä¸ªåŒ¹é…çš„é¦–å­—èŠ‚æ¥æ¢å–åŽé¢çš„大于等äº?çš„é¢å¤–的匚w…长度ã€?br />max_lazy 规定了,如果匚w…的长度达到或­‘…过了这个å€û|¼Œž®Þq›´æŽ¥è¾“出,ä¸å†½Ž¡åŽä¸€ä¸ªåŒ¹é…æ˜¯å¦æ›´é•Ñ€‚最低的4¾U?level ä¸åšæ‡’æƒ°åŒšw…åQŒç¬¬5¾U?level 定义 max_lazy ä¸?4åQŒæœ€é«˜çš„ level 定义 max_lazy ä¸?258ã€?br />
good_lengthåQšè¿™ä¸ªå€ég¹Ÿå’Œæ‡’æƒ°åŒ¹é…æœ‰å…»I¼Œå¦‚æžœå‰ä¸€ä¸ªåŒ¹é…长度达到或­‘…过 good_lengthåQŒé‚£åœ¨å¯»æ‰‘Ö½“å‰çš„æ‡’惰匚w…æ—Óž¼Œå›žæº¯çš„æœ€å¤§æ¬¡æ•°å‡ž®åˆ° max_chain çš?1/4åQŒä»¥å‡å°‘当å‰çš„æ‡’惰匹é…花费的旉™—´ã€‚第5¾U?level 定义 good_length ä¸?4åQˆè¿™ä¸€¾U§ç­‰äºŽå¿½ç•¥äº† good_lengthåQ‰ï¼Œæœ€é«˜çš„ level 定义 good_length ä¸?32ã€?br />
分æžåQšæ‡’æƒ°åŒ¹é…æœ‰å¿…è¦å—?å¯ä»¥æ”¹è¿›å—?
gzip 的作者是无æŸåŽ‹ç¾ƒæ–šw¢çš„专å®Óž¼Œä½†æ˜¯ä¸–界上没有ç»å¯¹çš„æƒå¨åQŒå¾çˆ±å¾å¸ˆï¼Œæ›´çˆ±çœŸç†ã€‚我觉得 gzip 的作者对懒惰匚w…的考虑¼‹®å®žä¸å¤Ÿå‘¨è¯¦ã€‚åªè¦æ˜¯˜q›è¡Œäº†è®¤çœŸå®¢è§‚的分æžåQŒè°éƒ½æœ‰æƒåˆ©æå‡ºè‡ªå·±çš„è§‚ç‚V€?br />采用懒惰匚w…åQŒéœ€è¦å¯¹åŽŸå§‹æ–‡äšg的更多的ä½ç½®æŸ¥æ‰¾åŒšw…åQŒæ—¶é—´è‚¯å®šå¢žåŠ äº†è®¸å¤šå€ï¼Œä½†åŽ‹¾~©çŽ‡çš„æé«˜åœ¨æ€ÖM½“上å分有é™ã€‚åœ¨å‡ ç§æƒ…况下,它å而增长了短语压羃的结果,所以如果一定è¦ç”¨æ‡’惰匹é…,也应该改˜q›ä¸€ä¸‹ç®—æ³•ï¼Œä¸‹é¢æ˜¯å…·ä½“的分æžã€?br />1. ˜qžç®‹3‹Æ¡ä»¥ä¸Šæ‰¾åˆîCº†æ›´é•¿çš„匹é…,ž®×ƒ¸åº”该å•个输出å‰é¢çš„那些字节,而应该作为匹é…输出ã€?br />2. 于是åQŒå¦‚果连¾l­æ‰¾åˆ°æ›´é•¿çš„匚w…的次数大于第一个匹é…的长度åQŒå¯¹äºŽç¬¬ä¸€ä¸ªåŒ¹é…ï¼Œç›¸å½“äºŽæ²¡æœ‰åšæ‡’惰匚w…ã€?br />3. 如果ž®äºŽ½W¬ä¸€ä¸ªåŒ¹é…的长度但大äº?åQŒå°±æ²¡æœ‰å¿…è¦ä½œæ‡’惰匹é…ï¼Œå› äØ“(f¨´)输出的æ€ÀL˜¯ä¸¤ä¸ªåŒšw…ã€?br />4. 所以找åˆîC¸€ä¸ªåŒ¹é…åŽåQŒæœ€å¤šåªéœ€è¦å‘åŽåš 2 ‹Æ¡æ‡’惰匹é…,ž®±å¯ä»¥å†³å®šæ˜¯è¾“出½W¬ä¸€ä¸ªåŒ¹é…,˜q˜æ˜¯è¾“出1åQˆæˆ– 2åQ‰ä¸ªé¦–字节加åŽé¢çš„匹é…了ã€?br />5. 于是åQŒå¯¹äºŽä¸€ŒDµåŽŸå§‹å­—èŠ‚ä¸²åQŒå¦‚æžœä¸åšæ‡’æƒ°åŒ¹é…æ—¶è¾“出两个匚w…åQˆå¯¹äºŽæ¯ä¸ªåŒ¹é…,è·ç¦»å?5ä½äºŒ˜q›åˆ¶æ•ŽÍ¼Œé•¿åº¦å?ä½äºŒ˜q›åˆ¶æ•ŽÍ¼ŒåŠ è“væ¥çº¦å?字节åQŒè¾“å‡ÞZ¸¤ä¸ªåŒ¹é…约需è¦?字节åQ‰ï¼Œåšäº†æ‡’惰匚w…如果有改˜q›çš„è¯ï¼Œž®†æ˜¯è¾“出1æˆ?个å•字节加上1个匹é…(也就是约4æˆ?字节åQ‰ã€‚è¿™æ øP¼Œæ‡’惰匚w…å¯ä»¥ä½¿æŸäº›çŸ­è¯­åŽ‹¾~©çš„¾l“æžœå†ç¾ƒçŸ?/3åˆ?/6ã€?br />6. å†è§‚察这样一个例å­ï¼š(x¨¬)
1232345145678[当å‰ä½ç½®]12345678
ä¸ç”¨æ‡’惰匚w…åQŒçº¦è¾“出6字节åQŒç”¨æ‡’惰匚w…åQŒçº¦è¾“出7字节åQŒç”±äºŽä‹É用了懒惰匚w…åQŒæŠŠæ›´åŽé¢çš„ä¸€ä¸ªåŒ¹é…æ‹†æˆäº†ä¸¤ä¸ªåŒšw…。(如果 678 正好能归入å†åŽé¢çš„一个匹é…,那懒惰匹é…å¯èƒ½æ˜¯æœ‰ç›Šçš„。)(j¨ª)
7. ¾l¼åˆè€ƒè™‘å„ç§å› ç´ åQˆåŒ¹é…数和未匚w…çš„å•åŒå­—节在原始文äšg中所å çš„æ¯”例åQŒåŽä¸€ä¸ªåŒ¹é…长度大于å‰ä¸€ä¸ªåŒ¹é…长度的概率åQŒç­‰½{‰ï¼‰(j¨ª)åQŒç»˜q‡æ”¹˜q›çš„æ‡’惰匚w…½Ž—法åQŒå¯¹æ€Èš„压羃率å³ä½¿æœ‰è´¡çŒ®åQŒä¹Ÿä»æ˜¯å¾ˆå°çš„,而且也ä»ç„¶å¾ˆæœ‰å¯èƒ½ä¼š(x¨¬)é™ä½ŽåŽ‹ç¾ƒçŽ‡ã€‚å†è€ƒè™‘到时间的¼‹®å®šçš„æ˜Žæ˜„¡š„增加与压¾~©çŽ‡çš„ä¸¼‹®å®šçš„å¾®å¼Þqš„增益åQŒä¹Ÿè®¸æœ€å¥½çš„æ”¹è¿›æ˜¯æžœæ–­åœ°æ”‘Ö¼ƒæ‡’惰匚w…ã€?/div>
™å‰™ƒ¨




 
å‘表äº?2006-3-3 14:49  资料短消æ?/a> 
gzip 在完æˆçŸ­è¯­å¼åŽ‹ç¾ƒåŽï¼Œž®†è{入编ç å¼åŽ‹ç¾ƒçš„é˜¶ŒDüc(di¨£n)€‚这个阶ŒD늚„å®žçŽ°æ˜¯å¾ˆå¤æ‚的,å¯ÒŽ(gu¨©)œ€¾lˆçš„压羃率至关é‡è¦ï¼Œæˆ‘会(x¨¬)详细解说 gzip çš„åšæ³•。gzip 是开放æºä»£ç çš„æ— æŸåŽ‹¾~©ç¨‹åºä¸­æœ€è‘—å的,其中的秿U技巧很有å¯å‘æ„义,但是他是比较早期的程åºï¼ŒçŽ°åœ¨æœ‰å¾ˆå¤šçš„½E‹åºå·²ç»åœ¨åŽ‹¾~©çŽ‡ä¸Šè¶…˜q‡äº†å®ƒï¼Œæ‰€ä»¥æˆ‘ä¼?x¨¬)æ ¹æ®è‡ªå·±å¯¹æ— æŸåŽ‹ç¾ƒçš„åŸºæœ¬è§„å¾‹çš„ç†è§£æå‡ºå¯¹å®ƒçš„æ”¹˜q›ã€?br />
¾~–ç å¼åŽ‹¾~©çš„几点考虑åQ?br />1. huffman ½Ž—法压羃率的关键是å„节点值的差异è¦å¤§åQŒè¿™æ ·å°±è¦æ±‚分段¾~–ç è¾“出。因为æŸäº›æ®µè½ä¸­æŸäº›èŠ‚ç‚¹çš„å‡ºçŽ°é¢‘çŽ‡è¾ƒé«˜ï¼Œå¦ä¸€äº›æ®µè½ä¸­˜q™äº›èŠ‚ç‚¹å‡ºçŽ°é¢‘çŽ‡è¾ƒä½ŽåQŒå¦‚æžœä¸åˆ†æ®µè¾“出åQŒé¢‘率的差异ä¼?x¨¬)被彼此抉|¶ˆåQŒè€Œä¸åŒæ®µè½ä¸­åQŒèŠ‚ç‚¹çš„å‡ºçŽ°é¢‘çŽ‡ä¸åŒæ˜¯å¸¸æœ‰çš„ã€?br />  è¦å†³å®šåˆ†ŒD늚„大å°åQŒå¿…™å»è§£å†³ä¸€å¯¹çŸ›ç›¾ï¼š(x¨¬)上é¢çš„分æžä¼¼ä¹Žè¦æ±‚段è½è¶Šž®è¶Šå¥½ï¼Œä½†ç”±äºŽè¦ä¿å­˜ç è¡¨ä»¥å¯¹ huffman 压羃¾l“æžœ˜q›è¡Œè§£åŽ‹åQŒæ¯ä¸ªæ®µè½éƒ½è¦ä¿å­˜ä¸€ä»½ä¸åŒçš„ç è¡¨åQŒæ‰€ä»¥æ®µè½å–得太ž®ï¼Œä¿å­˜äº†ç è¡¨åŽå¾—ä¸å¿å¤±åQŒè¿™æ øP¼Œä¼ég¹Žåˆè¦æ±‚段è½è¦ž®½é‡å¤§ï¼Œä½¿ç è¡¨çš„ä¿å­˜ä»½æ•°ž®½é‡ž®‘ã€?br />  gzip 采å–了这æ ïL(f¨¥ng)š„½{–ç•¥æ¥ç¡®å®šæ®µè½çš„大å°åQšlz77 压羃æ¯äñ”ç”?4kåQˆå°åQ‰çš„æ•°æ®åQŒå°±åˆ¤æ–­çŽ°åœ¨å¯ÒŽ(gu¨©)œª¾~–ç éƒ¨åˆ†˜q›è¡Œ¾~–ç è¾“出是å¦åˆé€‚,最多积压到 32kåQˆå¤§åQ‰çš„æ—¶å€™ï¼Œå¿…定˜q›è¡Œå¼ºåˆ¶è¾“出åQŒå› ä¸ºåã^庸的数殿U¯åŽ‹å¾—å¤ªå¤šï¼ŒåŽé¢å³ä‹É有好的数æ®ï¼Œé¢‘率¾lŸè®¡åœ¨ä¸€èµøP¼Œä¹Ÿä¼š(x¨¬)被åã^庸化ã€?br />  判断当å‰è¾“出åˆé€‚与å¦çš„æ¡äšg是:(x¨¬)1)用预先设定好的å„节点长度和å„节点实际的出现次敎ͼŒè®¡ç®—压羃¾l“果的大概å€û|¼Œçœ‹è¿™ä¸ªå€¼æ˜¯å¦å°äºŽæœªåŽ‹ç¾ƒæ—¶çš„ 1/2ã€?)看目å‰äØ“(f¨´)止的匚w…数是å¦å°äºŽæœªåŒšw…的字节数åQŒå› ä¸?lz77 压羃产生的数æ®åŒ…括“匹é…â€å’Œâ€œæœªåŒšw…的原始字节â€ï¼ŒŒDµè½é—´çš„节点频率差异主è¦ä½“现在“未匚w…的原始字节â€ä¸­ã€?br />  上é¢çš„åˆ¤æ–­åªæ˜¯ä¸€¿U“猜‹¹‹â€ï¼ŒçœŸæ­£çš„ç²¾¼‹®çš„计算需è¦èбè´ÒŽ(gu¨©)›´å¤šçš„æ—‰™—´ã€?br />  我觉å¾?gzip 的策略å¯ä»¥æ”¹˜q›ï¼Œæˆ‘çš„½{–略是:(x¨¬)1)输出的时机是压羃率的关键之一åQŒçŽ°åœ¨è®¡½Ž—机的速度和ä¹(ji¨¦)å年代时已ç»ä»Šéžæ˜”比åQŒçŽ°åœ¨å®Œå…¨æœ‰æ¡äšgé‡‡ç”¨çœŸæ­£çš„å¾ huffman æ ?w¨¨i)çš„æ–Ò?gu¨©)³•得到å„节点的ç é•¿åQŒä½œ¾_„¡¡®çš„判断ã€?)ä¸åº”该与未压¾~©çš„åŽŸå§‹æ•°æ®æ¯”较åQŒè€Œåº”该与 lz77 è¾“å‡ºçš„æ•°æ®æ¯”较,å¦åˆ™è®¡ç®—出的压羃比很大一部分是短语å¼åŽ‹ç¾ƒçš„åŠŸåŠŸë€?)ç”׃ºŽé‡‡ç”¨äº†çœŸæ­£çš„å»?huffman æ ?w¨¨i)çš„æ–Ò?gu¨©)³•åQŒä¸ç”¨å†åŽÕdšåŒšw…æ•îC¸ŽæœªåŒ¹é…的字节数的比较åQŒå› ä¸ºé‚£åªæ˜¯ä¸€¿U猜‹¹‹ã€?)æ¯?4k 的数æ®éƒ½å•独¾lŸè®¡é¢‘率åQŒå¦‚果是åˆé€‚çš„åQŒå°±å…ˆè¾“å‡ÞZ¹‹å‰çš„¿U¯åŽ‹åQˆå¦‚果有的è¯åQ‰ï¼Œå†è¾“出当å‰çš„ 4kåQŒè¿™æ ·å¯ä»¥é¿å…当å‰çš„æ•°æ®è¢«ç§¯åŽ‹çš„æ•°æ®òq›_º¸åŒ–。如果ä¸åˆé€‚,ž®±æŠŠå½“å‰çš„频率归入到¿U¯åŽ‹çš„æ•°æ®ï¼ˆå¦‚果有)(j¨ª)的频率中åQŒå†åˆ¤æ–­æ˜¯å¦åˆé€‚,如ä»ä¸åˆé€‚就暂缓输出åQŒå¦åˆ™ä¸€èµ¯‚¾“出,˜q™å’Œ gzip 的作法是一æ ïL(f¨¥ng)š„。说明:(x¨¬)几段差的数殿U¯åŽ‹åˆîC¸€èµ·ä»æœ‰å¯èƒ½æˆä¸ºå¥½çš„æ•°æ®ï¼Œæ¯”如 01ã€?02ã€â€¦â€¦ç§¯åŽ‹åœ¨ä¸€èµøP¼Œ0 çš„é¢‘çŽ‡é€æ¸é«˜å‡ºäº†å…¶ä»–字节ã€?)如果愿æ„付出更多的时é—ß_(d¨¢)¼Œåœ¨æŠŠå½“å‰çš„频率归入之å‰çš„频率æ—Óž¼Œå¯ä»¥å…ˆå’Œä¹‹å‰ 4k 的频率åˆòqÓž¼Œå¦‚æžœä¸åˆé€‚,和之å‰?8k 的频率åˆòqÓž¼Œ˜q™æ ·é€æ¸å¾€å‰åˆòq?4kåQŒé¿å…å‰é¢ä¸å¥½çš„æ•°æ®æ‹–ç¯åˆåƈåŽçš„好的数æ®ã€?)有了å‰é¢çš„æœºåˆÓž¼Œ32k 的强制输出点å¯ä»¥å–消ã€?)˜q›ä¸€æ­¥çš„æ”¹è¿›åQšå½“è¦è¾“出时åQŒåªè¾“出¿U¯åŽ‹çš„ä¸å¥½çš„部分åQŒå¥½çš„æ•°æ®å…ˆç•™ç€åQŒç­‰åŽé¢çš?4kåQŒå¦‚果新的加入åŽåQŒä»æ˜¯å¥½çš„æ•°æ®ï¼Œž®±å†½{‰ï¼Œå¦‚æžœä¼?x¨¬)é™ä½ŽåŽ‹¾~©çއåQŒæ‰è¾“å‡ºå¥½çš„éƒ¨åˆ†ã€‚è¿™æ øP¼Œè®©å¥½çš„æ•°æ®å¤§ŒD늚„输出åQŒå¯ä»¥å‡ž®‘ç è¡¨çš„ä¿å­˜ä»½æ•°ã€?)å†è¿›ä¸€æ­¥çš„æ”¹è¿›åQšåçš„æ•°æ®æ”¾åœ¨ä¸€èµ·å¯èƒ½ä¼š(x¨¬)æé«˜åŽ‹ç¾ƒçŽ‡ï¼Œå¥½çš„æ•°æ®æ”‘Öœ¨ä¸€èµ·ä¹Ÿå¯èƒ½æ›´å¥½åQŒå½“ç„?d¨°ng)ž¼Œä¸¤ç§æƒ…况也都有å¯èƒ½é™ä½ŽåŽ‹¾~©çއåQŒæ‰€ä»¥å‰é¢åˆ¤æ–­â€œå¥½â€è¿˜æ˜¯â€œä¸å¥½â€ï¼Œâ€œåˆé€‚â€è¿˜æ˜¯â€œä¸åˆé€‚â€çš„æ ‡å‡†åº”该从æŸä¸€ä¸ªå›ºå®šçš„压羃率标准改å˜äØ“(f¨´)åQšæé«˜äº†åŽ‹ç¾ƒçŽ‡è¿˜æ˜¯é™ä½Žäº†åŽ‹ç¾ƒçŽ‡ã€‚ï¼ˆæé«˜çš„幅度应该至ž®‘抵消多ä¿å­˜ä¸€ä»½ç è¡¨çš„æŸå¤±åQ›é™ä½Žçš„òq…度也应该至ž®‘抵消少ä¿å­˜ä¸€ä»½ç è¡¨çš„得益åQ?)¾l¼åˆå‰é¢çš„分æžï¼Œ¼‹®å®šåˆ†æ®µå¤§å°çš„策略最¾lˆè°ƒæ•´äØ“(f¨´)åQšå½“新的数æ®å’Œå‰é¢çš„æœªåˆ‡åˆ†æ•°æ®æ”¾åœ¨ä¸€èµäh—¶åQŒä¸¤è€…中ä»ÖM½•一方å—到æŸå¤±ï¼Œéƒ½åº”该设¾|®åˆ‡åˆ†ç‚¹åQŒç§¯ç´¯äº†ä¸¤ä¸ªåˆ†æ®µåŽï¼Œé€šè¿‡è®¡ç®—åQŒå½“切分带æ¥çš„æ”¶ç›Šå¤§äºŽå°‘ä¿å­˜ä¸€ä»½ç è¡¨æ—¶åQŒæ‰è¾“出å‰ä¸€ŒDµï¼Œå¦åˆ™å–消它们之间的切分点。这个策略实际上å¯ä»¥æ¶ëŠ›–å‰é¢æåˆ°çš„æ‰€æœ‰æ”¹˜q›ï¼Œå› äØ“(f¨´)æ¯ä¸ªå®žé™…的分ŒDµä¹‹ä¸­çš„æ•°æ®æˆ–者相互促˜q›ï¼Œæˆ–è€…å½¼æ­¤ç¨æœ‰å¦¨å®»I¼Œä½†å¥½˜q‡å¤šä¿å­˜ä¸€ä»½ç è¡¨ï¼›è€Œæ¯ä¸¤ä¸ªç›”R‚»çš„分ŒDµä¹‹é—´çš„æ•°æ®å½¼æ­¤å¦¨å®³åQŒæŠµæ¶ˆäº†ž®‘ä¿å­˜ä¸€ä»½ç è¡¨çš„æ”¶ç›Šã€‚这个策略简å•直观地体现了我们设¾|®åˆ†ŒD늚„åˆè¡·åQšå°±æ˜¯åˆ†ŒDµè¾“出必™å»èƒ½æé«˜åŽ‹ç¾ƒçŽ‡ã€?br />
2. 如果ä¸è€ƒè™‘ç è¡¨åQŒhuffman ½Ž—法能得到最短的¾~–ç å¼åŽ‹¾~©ç»“果,但是˜q™ç§½Ž—法必须ä¿å­˜ç è¡¨ä»¥ä¾¿è§£åŽ‹¾~©ï¼Œæ‰€ä»¥ä¸èƒ½ä¿è¯ç»“果是最佳的。gzip é¢„å…ˆæ‹Ÿå®šäº†ä¸€å¥—é€šç”¨çš„é™æ€çš„¾~–ç åQŒå½“è¦è¾“å‡ÞZ¸€ä¸ªæ®µè½æ—¶åQŒæ¯”è¾?huffman 压羃¾l“果加ç è¡¨çš„é•¿åº¦å’Œé™æ€ç¼–ç çš„压羃¾l“果长度åQŒå†å†›_®šç”¨å“ª¿Uæ–¹æ³•è¾“å‡ø™¿™ä¸ªæ®µè½ã€‚陿€ç¼–ç ä¸éœ€è¦å¾æ ?w¨¨i),计算压羃¾l“果长度时耗时很少。如果å„节点的频率的差异很å°åQŒhuffman 压羃¾l“果加ç è¡¨å而增大了¾l“æžœåQŒé™æ€ç¼–ç ä¹Ÿä¸åˆé€‚ï¼ŒåŒæ ·å¢žå¤§äº†ç»“果,gzip ž®Þq›´æŽ¥ä¿å­?lz77 的原始输出。由于输å‡ÞZ¸€ä¸ªæ®µè½æ—¶åQŒå¢žåŠ äº†é™æ€ç¼–ç çš„æ–ÒŽ(gu¨©)¡ˆåQŒä‹É输出的实际长度和之剼‹®å®šåˆ†æ®µç‚ÒŽ(gu¨©)—¶è®¡ç®—的值å¯èƒ½ä¸åŒï¼Œé‚£ä¹ˆå‰é¢è®¡ç®—出的˜q™ä¸ªåˆ†æ®µç‚ÒŽ(gu¨©)˜¯å¦ä»æ˜¯æ­£¼‹®çš„åQŸå‰é¢çš„分段½{–略是å¦éœ€è¦è°ƒæ•ß_(d¨¢)¼Ÿ
  分æžåQ?)陿€ç¼–ç çš„å„èŠ‚ç‚¹ç¼–ç æ˜¯ä¸å˜çš„,对于ŒDµè½çš„åˆòq¶æ˜¯æ— æ‰€è°“çš„åQŒä¸¤ä¸ªè¿ž¾l­æ®µè½å³ä½‰Kƒ½é‡‡ç”¨é™æ€ç¼–ç ï¼Œä¹Ÿä¸ç”¨åˆòqÓž¼Œå› äØ“(f¨´)åˆåƈåŽç»“果长度是ä¸ä¼š(x¨¬)å˜çš„ã€?)所以åªå¯¹ä¸€¿U情况å¯èƒ½æœ‰å½±å“åQšä¸€ä¸ªæ®µè½ä¸­æ‹†åˆ†å‡ÞZ¸€äº›éƒ¨åˆ†ç”¨ huffman ¾~–ç åQŒå¦ä¸€äº›éƒ¨åˆ†ç”¨é™æ€ç¼–ç ï¼ŒåŽ‹ç¾ƒ¾l“果更好。当˜q™ç§æƒ…况å‘生æ—Óž¼Œåˆ™å¿…有一些部分的优势节点åQˆé¢‘率高的节点)(j¨ª)ä¸Žé™æ€ç¼–ç é¢„先拟定的优势节点相近åQŒé‡‡ç”¨é™æ€ç¼–ç åŽæœ‰ç¨è®¸æ”¹å–„ï¼Œå…¶ä»–éƒ¨åˆ†åˆ™ä¸Žé™æ€ç¼–ç é¢„å…ˆæ‹Ÿå®šçš„ä¼˜åŠ¿èŠ‚ç‚¹æœ‰ä¸€å®šåˆ†æ­§ï¼Œé‡‡ç”¨é™æ€ç¼–ç åŽä¼?x¨¬)有½E许ä¸åˆ©ã€‚之所以说“ç¨è®¸â€ï¼Œæ˜¯å› ä¸ºæˆ‘们已知åŒä¸€ä¸ªæ®µè½é‡Œçš„å„éƒ¨åˆ†æ•°æ®æˆ–è€…äº’ç›æ€¿ƒ˜q›ï¼Œæˆ–者仅有ç¨è®¸å¦¨å®»I¼Œè¯´æ˜Žå®ƒä»¬çš„优势节ç‚ÒŽ(gu¨©)˜¯å¤§è‡´­‘‹åŒçš„。考虑到拆分åŽå¯èƒ½è¦å¤šä¿å­˜å‡ ä†¾ç è¡¨åQŒæ‹†åˆ†å¸¦æ¥æ”¶ç›Šçš„å¯èƒ½æ€§å’Œ½E‹åº¦æ˜¯å¾ˆž®çš„åQŒè€Œä¸”è®¡ç®—çš„å¤æ‚度较大åQŒæ‰€ä»¥å‰é¢çš„æ‹†åˆ†½{–ç•¥å¯ä»¥ä¸ä½œè°ƒæ•´ã€?br />  至于直接ä¿å­˜ lz77 的原始输出,å¯ä»¥çœ‹ä½œé™æ€ç¼–ç çš„一¿U特ŒDŠåÅžå¼ï¼Œåªä¸˜q‡å®ƒå‡å®šå„节点的频率相近åQŒæ²¡æœ‰ä¼˜åŠ¿èŠ‚ç‚V€‚它å¯ä»¥å¥—ç”¨é™æ€ç¼–ç çš„分æžåQŒæ¥è¯æ˜Žä¸åª„(ji¨£ng)å“å‰é¢å·²¾l制定的分段½{–ç•¥ã€?br />
3.采用 huffman ¾~–ç åQŒå¿…™åÀL·±å…¥ç ”½I¶ç è¡¨çš„ä¿å­˜æ–¹å¼ã€?br />  åªè¦è®¡ç®—一下采用简å•çš„æ–¹å¼æ¥ä¿å­˜ç è¡¨ï¼Œéœ€è¦å¤šå¤§çš„½Iºé—´åQŒå°±çŸ¥é“˜q™æ˜¯ä¸€ä¸ªæŒ‘战ã€?br />  ½Ž€å•地ä¿å­˜ç è¡¨çš„æ–¹æ³•是™åºåºåœîC¿å­˜æ¯ä¸€ä¸ªå€¼çš„ç é•¿å’Œç¼–ç ã€‚之所以è¦ä¿å­˜ç é•¿åQŒæ˜¯å› äØ“(f¨´)¾~–ç æ˜¯ä¸å®šé•¿çš„,没有ç é•¿åQŒè§£åŽ‹æ—¶æ— æ³•æ­£ç¡®è¯Õd–¾~–ç ã€‚ç é•¿å¿…™åÀL˜¯å®šé•¿çš„,也就是说必须é™åˆ¶ huffman æ ?w¨¨i)的最大层敎ͼŒä½¿ç é•¿çš„使•°èƒ½æ°å¥½è¡¨½Cø™¿™ä¸ªå±‚数。é™åˆ?huffman æ ?w¨¨i)的最大层数的æ–ÒŽ(gu¨©)³•是:(x¨¬)如果规定的最大层æ•îCØ“(f¨´) nåQŒåˆ™åœ?n - 1 层找åˆîC¸€ä¸ªå¶å­èŠ‚ç‚?aåQˆå¦‚æž?n - 1 层没有å¶å­èŠ‚ç‚¹ï¼Œž®±é€å±‚地往上寻找,直到扑ֈ°ä¸€ä¸ªå¶å­èŠ‚ç‚¹ï¼‰(j¨ª)åQŒåœ¨èŠ‚ç‚¹ a 的佾|®æ”¾ä¸€ä¸ªéžå¶å­èŠ‚ç‚¹ AåQŒä‹É a æˆäØ“(f¨´) A çš„å­èŠ‚ç‚¹åQŒæŠŠæŸä¸ª­‘…过 n 层的å¶å­èŠ‚ç‚¹ b æä¸Šæ¥ä½œä¸?A çš„å¦ä¸€ä¸ªå­èŠ‚ç‚¹åQŒæ­¤æ—?b 的父节点 B åªå‰©ä¸‹ä¸€ä¸ªå­èŠ‚ç‚¹ cåQŒå–æ¶?BåQŒæŠŠ c 攑֜¨ B 的佾|®ï¼Œé‡å¤˜q™æ ·çš„过½E‹ï¼Œç›´åˆ°æ‰€æœ?n 层以下的节点都被æä¸Šæ¥ã€‚之所以è¦ä»?n - 1 层开始é€å±‚往上找åQŒæ˜¯å› äØ“(f¨´)下层的节炚w¢‘率å°åQŒç é•¿å˜åŒ–åŽçš„媄(ji¨£ng)å“å°ã€‚å‡è®¾æ¯ä¸€å±‚节点的频率相近åQŒé‚£ä¹ˆä¸Šå±‚父节点的频率是其下层å­èŠ‚ç‚¹çš„ä¸¤å€ï¼Œ½W?11 å±‚èŠ‚ç‚¹çš„é¢‘çŽ‡åªæœ‰½W¬ä¸€å±‚节炚w¢‘率的 1 / 1024åQŒæ‰€ä»¥åº”该从下往上找ã€?br />  现在ž®±å¼€å§‹è®¡½Ž—ç è¡¨å¤§ž®ï¼š(x¨¬)
  对于 256 个原始字节å€û|¼Œé™åˆ¶å®ƒçš„ huffman æ ?w¨¨i)的层数ä?0 åQ?15åQŒç é•¿å°±éœ€è¦?4 ä½ï¼Œ256 个ç é•‰Kœ€è¦?4 bit * 256 = 128 字节åQ›è€?256 个新¾~–ç éœ€è¦è‡³ž®?256 å­—èŠ‚ã€‚ï¼ˆå½“äºŒå‰æ ‘(w¨¨i)的所有å¶å­èŠ‚ç‚šwƒ½æ”‘Öœ¨½W?8 å±?—â€?ä¸ç®—根节点一层,正好能放ä¸?2 çš?8 ‹Æ¡æ–¹ = 256 个å¶å­èŠ‚ç‚¹ï¼Œå…¶ä¸­ä»ÖM½•一个å¶å­èŠ‚ç‚¹å¾€ä¸Šå‡åQŒè‡³ž®‘造æˆä¸¤ä¸ªå¶å­èŠ‚ç‚¹å¾€ä¸‹é™ã€‚æ¢ä¸€ä¸ªè§’度说åQŒå¦‚果在½W?8 层以上存在一个å¶å­èŠ‚ç‚?aåQŒåœ¨èŠ‚ç‚¹ a 的佾|®æ”¾ä¸€ä¸ªéžå¶å­èŠ‚ç‚¹ AåQŒä‹É a æˆäØ“(f¨´) A çš„å­èŠ‚ç‚¹åQŒæŠŠæŸä¸ª­‘…过 8 层的å¶å­èŠ‚ç‚¹ b æä¸Šæ¥ä½œä¸?A çš„å¦ä¸€ä¸ªå­èŠ‚ç‚¹åQŒæ­¤æ—?b 的父节点 B åªå‰©ä¸‹ä¸€ä¸ªå­èŠ‚ç‚¹ cåQŒå–æ¶?BåQŒæŠŠ c 攑֜¨ B 的佾|®ï¼Œæ­¤æ—¶ a 增长了一ä½ï¼Œc ¾~©çŸ­äº†ä¸€ä½ï¼Œb ¾~©çŸ­äº†è‡³ž®‘一ä½ï¼Œ¾~–ç çš„åã^å‡ä½é•¿ç¾ƒçŸ­ã€‚所以,当第 8 层以上ä¸å­˜åœ¨å¶å­èŠ‚ç‚¹åQŒæ‰€æœ‰å¶å­èŠ‚ç‚šwƒ½æ”‘Öœ¨½W?8 层时åQŒç¼–ç çš„òq›_‡ä½é•¿è¾‘Öˆ°æœ€çŸ?—â€?8ä½ã€‚)(j¨ª)˜q™å¥—ç è¡¨å…±éœ€è‡›_°‘ 128 + 256 = 384 字节ã€?br />  256 个“匹é…长度â€çš„æƒ…况与原始字节值相åŒï¼Œä¸¤å¥—ç è¡¨å…±éœ€è‡›_°‘ 384 * 2 = 768 字节ã€?br />  对于 32k 个“匹é…è·¼› Z€ï¼Œå¦‚æžœé™åˆ¶è¯?huffman æ ?w¨¨i)的层数ä?0 åQ?31åQŒä¿å­˜æ¯ä¸ªå€¼çš„ç é•¿éœ€è¦?5 ä½ï¼Œæ–°ç¼–ç çš„òq›_‡é•¿åº¦­‘…过 15 ä½ã€‚ï¼ˆå› äØ“(f¨´)所有å¶å­èŠ‚ç‚šwƒ½æ”‘Öœ¨½W?15 å±?—â€?ä¸ç®—根节点一层,正好能放ä¸?2 çš?15 ‹Æ¡æ–¹ = 32k 个å¶å­èŠ‚ç‚V€‚)(j¨ª)˜q™å¥—ç è¡¨è¦è¶…˜q?0k 字节åQ?(5 + 15) * 32k / 8 = 80k åQ‰ã€?br />  å‰é¢è®¨è®ºåˆ†æ®µ½{–略时已¾l说˜q‡ï¼Œä¸ÞZº†é¿å…个段è½é—´èŠ‚ç‚¹é¢‘çŽ‡å·®å¼‚è¢«äº’ç›¸æŠµæ¶ˆï¼Œè¦æ±‚ŒDµè½åˆ’分ž®½é‡¾l†è‡´ã€å‡†¼‹®ï¼Œæœ€ž®çš„ŒDµè½å¯ä»¥ä»…䨓(f¨´) 4kåQŒè€Œé‡‡ç”¨ä¸Šé¢è¿™¿U简å•的方å¼åQŒç è¡¨è¦­‘…过 80kåQŒæ˜¾ç„¶æ˜¯æ— æ³•接å—çš„ã€?br />  对ç è¡¨çš„ä¿å­˜æ–¹å¼çš„æ·±å…¥ç ”½IÓž¼Œ¼‹®å®žæ˜¯ä¸ªæ— æ³•¾l•å¼€çš„æŒ‘æˆ˜ï¼Œå¦‚æžœä¸æ”»å…‹è¿™ä¸ªéš¾å…»I¼Œ¾~–ç å¼åŽ‹¾~©æ— æ³•è¿›è¡Œä¸‹åŽ»ï¼æŒ‘战ä¼?x¨¬)带æ¥ä¹­‘£ï¼Œå›°éš¾ä¼š(x¨¬)æ¿€å‘豪情。我们所è¦åšçš„æ˜¯åQšè§‚å¯?gzip 如何一步步地通过¾Jå¤ä½†åˆå·§å¦™çš„åšæ³•解册™¿™ä¸ªéš¾é¢˜ï¼Œå¯¹å…¶ä¸­çš„åšæ³•çš„é“ç†åŠ¡æ±‚çŸ¥å…¶ç„¶ã€çŸ¥å…¶æ‰€ä»¥ç„¶åQŒé€šè¿‡è§‚å¯Ÿã€æ€è€ƒï¼ŒæŠŠæ¡æ— æŸåŽ‹ç¾ƒå†…åœ¨çš„ã€æ·±å±‚çš„ã€æœ¬è´¨çš„规律åQ事实上åQŒå¯¹ gzip çš„è¿™äº›åšæ³•进行阅读(æºä»£ç ï¼‰(j¨ª)ã€åˆ†æžã€æŒ–掘其中的智慧åQŒæœ¬íw«å°±æ˜¯ä¸€ä¸ªå¯¹æ™ºæ…§ã€è€åŠ›ã€ä¹ƒè‡›_†³å¿ƒçš„长期的挑战,我接å—了˜q™ä¸ªæŒ‘战åQŒåƈ把它æè¿°ã€è§£é‡Šå‡ºæ¥ï¼Œè¯»è€…é¢å¯¹çš„æŒ‘战是花费较长期的时间去阅读ã€ç†è§£ï¼Œå¸Œæœ›è¯»è€…完全有è€åŠ›ã€è±ªæƒ…ã€å…´­‘£æ¥æŽ¥å—˜q™ä¸ªæŒ‘战åQŒæ·±åŒ–自å·Þqš„æŠ€æœ¯å±‚‹Æ¡ã€æ€ç»´å±‚次ã€?br />
3.1 åªä¿å­˜ç é•¿ï¼Œòq¶å¢žåŠ ä¸€äº›ç‰¹ŒDŠçš„倹{€?br />
3.1.1 æŠ?huffman æ ?w¨¨i)çš„æ¯ä¸€å±‚上的å¶å­èŠ‚ç‚šwƒ½æ¢åˆ°è¯¥å±‚的左边,按照其原始å€ég»Žž®åˆ°å¤§ä¾‹Æ¡æŽ’列,éžå¶å­èŠ‚ç‚¹åˆ™é›†ä¸­åœ¨è¯¥å±‚å³è¾¹ï¼Œ˜q™æ—¶ä»æ˜¯ä¸€‹‚µäºŒå‰æ ‘(w¨¨i)åQŒå¾—到的¾~–ç ä»ç¬¦åˆå‰¾~€¾~–ç çš„è¦æ±‚。æ¯ä¸ªå¶å­èŠ‚ç‚¹çš„¾~–ç é•¿åº¦ä¸å˜åQŒæ‰€ä»¥åŽ‹¾~©çŽ‡ä¹Ÿä¸å˜ã€‚ä»…éœ€è¦æŒ‰ç…§åŽŸå§‹å€ég»Žž®åˆ°å¤§ä¾‹Æ¡ä¿å­˜æ¯ä¸ªå€¼çš„ç é•¿åQŒè§£åŽ‹æ—¶ž®±å¯ä»¥è¿˜åŽŸè¿™å¥—ç¼–ç è¡¨åQŒè¿˜åŽŸæ–¹æ³•æ˜¯åQšç é•¿äØ“(f¨´) n 的第一个值的¾~–ç æ˜¯ç é•¿äØ“(f¨´) n - 1 的最åŽä¸€ä¸ªå€¼çš„¾~–ç åŠ?1åQŒåƈ左移一ä½ï¼ˆä¹Ÿå°±æ˜¯è¯´åQŒåœ¨¾~–ç æœ€åŽåŠ ä¸?0åQ‰ï¼Œè€Œç é•¿äØ“(f¨´) n 的其他值的¾~–ç æ˜¯å‰ä¸€ä¸ªç é•¿äØ“(f¨´) n 的值的¾~–ç åŠ?1ã€‚ä»Žä¸Šé¢æ‰€è¯´çš„æ ?w¨¨i)的角度æ¥è§£é‡Šï¼Œæ¯ä¸€å±‚çš„½W¬ä¸€ä¸ªå¶å­èŠ‚ç‚ÒŽ(gu¨©)˜¯å…¶ä¸Šå±‚最åŽä¸€ä¸ªå¶å­èŠ‚ç‚¹çš„åŒ™¾¹ä¸€ä¸ªèŠ‚ç‚¹çš„å·¦å­èŠ‚ç‚¹åQŒæ‰€ä»¥å®ƒçš„ç¼–ç æ˜¯ä¸Šå±‚最åŽä¸€ä¸ªå¶å­èŠ‚ç‚¹çš„¾~–ç åŠ?1 òq¶å·¦¿UÖM¸€ä½ï¼Œè€Œæ¯ä¸€å±‚上的å¶å­èŠ‚ç‚šwƒ½ç´§å¯†æŽ’列åQŒæ‰€ä»¥é™¤äº†ç¬¬ä¸€ä¸ªå¶å­èŠ‚ç‚¹å¤–åQŒå…¶ä»–å¶å­èŠ‚ç‚¹çš„¾~–ç éƒ½æ˜¯å‰ä¸€ä¸ªå¶å­èŠ‚ç‚¹çš„¾~–ç åŠ?1。编½E‹ä¸Šçš„实现方法是åQšé历ç è¡¨ï¼Œå¾—到æ¯ä¸ªç é•¿(n)上有多少个å€û|¼Œè®¡ç®—出æ¯ä¸ªç é•¿ä¸Š½W¬ä¸€ä¸ªå€¼çš„¾~–ç åQŒæ”¾åœ¨æ•°¾l?bit_len[]ä¸­ï¼Œå†æ¬¡é历ç è¡¨åQŒä¾‹Æ¡æ ¹æ®æ¯ä¸ªå€¼çš„ç é•¿(n)åQŒèµ‹äºˆå®ƒçš„ç¼–ç äØ“(f¨´)该ç é•¿ä¸Šçš„å‰ä¸€ä¸ªå€¼çš„¾~–ç  (bit_len[n]) åŠ?1åQŒbit_len[n] ++ã€?br />  ç”׃ºŽåªéœ€è¦ä¿å­˜ç é•¿ï¼ŒçŽ°åœ¨ç è¡¨ç”Þp¶…˜q?80k 字节å‡å°åˆ°çº¦ 20k 字节ã€?br />
3.1.2 如何åªä¿å­˜åœ¨ŒDµè½ä¸­å‡ºçŽ°è¿‡çš„èŠ‚ç‚¹ï¼ˆæœ‰æ•ˆèŠ‚ç‚¹åQ‰çš„¾~–ç åQ?br />  一ä¸?ASCⅡ文本,128 以åŽçš„值是ä¸ä¼š(x¨¬)在文件中出现的,按照 3.1.1 的方法,ç è¡¨ä¸­åŽåŠéƒ¨åˆ†ï¼ˆéƒ½æ˜¯ 0åQ‰åœ¨è§£åŽ‹¾~©æ—¶æ˜¯ç”¨ä¸åˆ°çš„ã€‚äØ“(f¨´)了é¿å…è¿™¾cÀLµªè´¹ï¼Œåªä¿å­˜æœ‰æ•ˆèŠ‚ç‚¹ï¼ˆç é•¿ä¸äØ“(f¨´) 0 的节点)(j¨ª)åQŒä¸€¿U方法是ä¿å­˜æœ‰æ•ˆèŠ‚ç‚¹çš„åŽŸå§‹å€¼å’Œæ–°ç¼–ç çš„ç é•¿åQŒå½“有效节点­‘…过所有节点的1/4åQŒè¿™¿U方法ä¿å­˜çš„ç è¡¨çš„大ž®ä¼š(x¨¬)­‘…过 3.1.1 的方法ã€?br />  gzip 采用的方法是åQšåœ¨ 3.1.1 的基¼‹€ä¸Šï¼ŒäºŽè‹¥òq²ç§ç é•¿ä¹‹å¤–åQŒå¢žåŠ ä¸€äº›ç‰¹ŒDŠçš„å€û|¼Œä»–们表示当å‰ä¸ÞZ¹‹å‰ä¸€ä¸ªç é•¿æˆ– 0 ç é•¿åQˆæ— æ•ˆèŠ‚ç‚¹ï¼‰(j¨ª)çš„é‡å¤ï¼Œé‡åˆ°˜q™ç§å€û|¼Œé‚£åŽé¢çš„一个数字表½Cºé‡å¤çš„‹Æ¡æ•°ã€‚第一¿Uå€ég»£è¡¨å½“å‰äØ“(f¨´)之å‰ä¸€ä¸ªç é•¿çš„é‡å¤ 3 åQ?6 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 2 bit 为具体的é‡å¤‹Æ¡æ•°åQ›ç¬¬äºŒç§å€ég»£è¡¨å½“å‰äØ“(f¨´) 0 ç é•¿çš„é‡å¤?3 åQ?10 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 3 bit 为具体的é‡å¤‹Æ¡æ•°åQ›ç¬¬ä¸‰ç§å€ég»£è¡¨å½“å‰äØ“(f¨´) 0 ç é•¿çš„é‡å¤?11 åQ?138 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 7 bit 为具体的é‡å¤‹Æ¡æ•°ã€‚é™åˆ¶æœ€ž®é‡å¤æ¬¡æ•îCØ“(f¨´) 3åQŒå¯ä»¥ç¡®ä¿è¿™¿U方法得到的ç è¡¨ä¸ä¼š(x¨¬)大过 3.1.1。第一¿U值é™åˆ¶æœ€å¤§é‡å¤æ¬¡æ•îCØ“(f¨´) 6åQŒæ˜¯å› äØ“(f¨´)˜qžç®‹ 6 个å€ég»¥ä¸Šçš„ç é•¿ç›¸ç­‰åQˆè¯´æ˜Žé¢‘率å分接˜q‘)(j¨ª)的情况ä¸å¸¸è§åQŒåš˜q™ä¸ªé™åˆ¶å¯ä»¥èŠ‚çœé™„加 bitåQ›ç¬¬äºŒç¬¬ä¸‰ç§å€¼åŒºåˆ†é‡å¤æ¬¡æ•°çš„范围åQŒä¹Ÿæ˜¯äØ“(f¨´)了节çœé™„åŠ?bitã€‚åœ¨åªæœ‰ž®‘数有效节点的情况下åQŒè¿™¿U方法åªéœ€è¦ä¿å­˜è¾ƒ?y¨­u)®‘的数æ®åQŒåŒæ—¶ä¹Ÿå…ähœ‰½Ž€å•的去é‡å¤çš„作用ã€?br />  如果最大ç é•¿æ˜¯ 15åQ? åQ?15 å…?16 ¿Uå€û|¼Œä¸€ä¸ªç é•‰Kœ€è¦?4 ä½ï¼ŒåŠ ä¸Šä¸Šé¢ 3 ¿Uå€û|¼Œå…?19 ¿Uå€û|¼Œéœ€è¦?5 ä½ï¼Œåœ¨é‡å¤ä¸å¤šæ—¶åQŒåŠ äº†è¿™ 3 ¿Uå€û|¼Œæ˜¯ä¸æ˜¯ä¼š(x¨¬)增大ç è¡¨åQŸå…¶å®žä¸ç”¨æ‹…心,gzip ä¼?x¨¬)对ç è¡¨å†è¿›è¡Œä¸€‹Æ?huffman 压羃åQŒæ ¹æ®è¿™ 19 ¿U值的频率分酾l™å®ƒä»¬å¯å˜ç é•¿çš„¾~–ç åQŒä¸ä¼?x¨¬)造戋¹ªè´¹åQŒç”±äºŽæ¶‰å?qi¨¢ng)到一些其他情况,对ç è¡¨çš„å†ç¼–ç åŽ‹¾~©åœ¨åŽé¢˜q˜ä¼š(x¨¬)详细介ç»åQ?br />
3.2 把原始字节值和匚w…长度值å¾åœ¨ä¸€‹‚‰| ‘(w¨¨i)上ã€?br />  现在先考虑å¦ä¸€ä¸ªé—®é¢˜ï¼š(x¨¬)å¦‚ä½•ä½¿è§£åŽ‹æ—¶èƒ½åŒºåˆ†å½“å‰æ˜¯ä¸€ä¸ªæœªåŒšw…的字节,˜q˜æ˜¯ä¸€ä¸ªåŒ¹é…?未匹é…字节值和匚w…长度ã€åŒ¹é…è·¼›ÀL˜¯ä¸‰æ£µä¸åŒçš?huffman æ ?w¨¨i),它们的编ç äº’ç›æ€¸½W¦åˆå‰ç¼€¾~–ç çš„è¦æ±‚,部分节点甚至å¯èƒ½¾~–ç ç›¸åŒåQŒè§£åŽ‹æ—¶å¦‚ä½•åŒºåˆ†åQ?br />  ½W¬ä¸€¿U方法是用标志ä½ã€‚输出压¾~©ç»“果时åQŒé™¤äº†è¾“出æ¯ä¸€ŒD늚„ç è¡¨ã€é‡æ–°ç¼–ç åŽçš„æ•°æ®æµåQŒè¿˜è¦ä¿å­˜å¯¹åº”于˜q™ä¸€ŒD‰|•°æ®çš„æ ‡å¿—使µåQŒæµä¸­çš„æ¯ä¸€ä½?0 æˆ?1 è¡¨ç¤ºå½“å‰æ˜¯ä¸€ä¸ªæœªåŒšw…的字节,˜q˜æ˜¯ä¸€ä¸ªåŒ¹é…ã€?br />  ½W¬äºŒ¿U方法是¾l™åŽŸå§‹å­—èŠ‚å€¼å’ŒåŒšw…长度å€ég¸åŒçš„¾~–ç åQŒåƈ½W¦åˆå‰ç¼€¾~–ç çš„è¦æ±‚ã€‚æœ€å¥½çš„åšæ³•是把它们建在一‹‚‰| ‘(w¨¨i)上,以确ä¿å®ƒä»¬ç¬¦åˆå‰¾~€¾~–ç çš„è¦æ±‚,òq¶ç”±å®ƒä»¬çš„频率楼‹®å®šå„自的ç é•Ñ€?br />  ½W¬ä¸€¿U方法相当于原始字节值和匚w…长度值的¾~–ç éƒ½å¢žé•¿ä¸€ä½ã€?br />  ½W¬äºŒ¿U方法中˜q™ä¸¤å¥—节点的ç é•¿å˜åŒ–è¦æ ¹æ®å…·ä½“节点å„自的频率而定ã€?br />  ¾l过分æžåQŒç¬¬äºŒç§æ–ÒŽ(gu¨©)³•更好åQŒå› ä¸ºç¬¬ä¸€¿U方法å¯ä»¥çœ‹ä½œæ˜¯½W¬äºŒ¿U方法的å˜ç§åQŒç›¸å½“于½Ž€å•地在两‹‚?huffman æ ?w¨¨i)的根节点上å†åŠ ä¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒè¿™æ äh˜¾ç„¶æ˜¯ä¸èƒ½ä¿è¯æœ€ä½³çš„¾l“果的ã€?br />
3.3 把匹é…长度ã€åŒ¹é…è·¼›Õd˜ä¸ºé•¿åº¦èŒƒå›´ã€è·¼›»èŒƒå›ß_(d¨¢)¼Œå‡å°‘节点ã€?br />  ¾l过上é¢å¯¹ä¿å­˜ç è¡¨çš„æ–ÒŽ(gu¨©)³•的改˜q›åŽåQŒçŽ°åœ¨ç è¡¨è¿˜æœ‰å¤šå¤§ï¼Ÿ
  ç”׃ºŽæœ‰äº†ä¸Šé¢ä»‹ç»çš„去é‡å¤æœºåˆ¶åQŒç è¡¨çš„实际大å°å’ŒèŠ‚ç‚¹çš„é‡å¤æƒ…况有关åQŒå¦‚果有很多˜qžç®‹ 3 个以上节点的ç é•¿ç›¸ç­‰çš„æƒ…况出玎ͼŒæˆ–有很多˜qžç®‹ 3 个以上的无效节点的情况出玎ͼŒç è¡¨å¯èƒ½æ˜¯å¾ˆž®çš„åQŒä½†ä½œäØ“(f¨´)通用的无æŸåŽ‹¾~©ç®—法,必须考虑é‡å¤ä¸å¤šçš„æƒ…å†üc(di¨£n)€‚“匹é…è·¼› Z€æ˜¯ç è¡¨ä¸­æœ€ä¸»è¦çš„部分,我们æ¥åˆ†æžä¸€ä¸‹å®ƒçš„é‡å¤æƒ…况,“匹é…è·¼› Z€å…±æœ?32k 个å–å€û|¼Œå¦‚果一个段è½ä¸åˆ?32kåQŒâ€œåŒ¹é…è·¼› Z€çš„æœ‰æ•ˆèŠ‚ç‚¹æ•°å½“ç„¶æ˜¯ä¸å¯èƒ½åˆ° 32k 的,æ€è€ƒä¸€ä¸‹ï¼Œå¯ä»¥çŸ¥é“åQŒå®ƒçš„æœ‰æ•ˆèŠ‚ç‚ÒŽ(gu¨©)•°å’Œè¿™æ ·å‡ ä¸ªå› ç´ æœ‰å…»I¼š(x¨¬)一ŒD‰|œ‰å¤šé•¿åQŒæ®µè½ä¸­åŒšw…æ•°å’ŒæœªåŒ¹é…æ•°çš„æ¯”例,军_®šäº†å®ƒæœ‰å¤šž®‘个å€û|¼Œå†åŠ ä¸Šè¿™äº›å€¼çš„é‡å¤æ€§ï¼Œå†›_®šäº†å®ƒæœ‰å¤šž®‘个有效节点。å†åˆ†æžä¸€ä¸‹è¿™äº›å€¼çš„é‡å¤æ€§ï¼š(x¨¬)ä¸åŒäºŽåŽŸå§‹å­—èŠ‚å’Œâ€œåŒ¹é…长度â€éƒ½åªæœ‰ 256 个å–å€û|¼Œå®ƒæœ‰ 32k 个å–å€û|¼Œç›¸åŒçš„åŒ¹é…æœ‰ç›¸åŒçš„匹é…长度但ä¸ä¸€å®šæœ‰ç›¸åŒçš„匹é…è·¼›»ï¼Œæ‰€ä»¥å®ƒçš„åŽ»å€ÆDŒƒå›´å¹¿åQŒé‡å¤çŽ‡ä½Žï¼Œæœ‰æ•ˆèŠ‚ç‚¹å¤šã€‚è™½ç„¶å®žé™…çš„æƒ…å†µæ— æ³•é¢„æµ‹åQŒä½†æˆ‘们å¯ä»¥åšä¸€äº›â€œå¤§è‡´åˆç†â€çš„å‡è®¾åQŒä»¥ä¾¿å¯¹ç è¡¨çš„大ž®æœ‰ä¸€ä¸ªåŸºæœ¬çš„æ¦‚念åQŒå‡å¦‚短语å¼åŽ‹ç¾ƒçš„è¾“å‡ºæ®µè½çš„大å°ä¸?90k 字节åQŒå…¶ä¸­æœªåŒšw…字节数和匚w…数的比例ä¸?3 : 1åQŒæ¯ä¸ªæœªåŒšw…字节å?8 ä½ï¼›æ¯ä¸ªåŒšw…中,长度å?8 ä½ï¼Œè·ç¦»å?15 ä½ï¼Œå…?23 ä½ï¼Œ¾U¦äØ“(f¨´)未匹é…字节的 3 å€ï¼Œæ‰€ä»¥åŒ¹é…å äº?90k 字节中的¾U?45k 字节åQŒåŒ¹é…æ•°¾U?15k 个,也就是说æœ?15k 个跼›Õd€û|¼Œå‡å¦‚è·ç¦»å€¼çš„òq›_‡èŠ‚ç‚¹é¢‘çŽ‡ä¸?3åQŒé‚£ä¹ˆåŽ»æŽ‰é‡å¤åŽæœ?5k 个有效跼›Õd€ÆDŠ‚ç‚¹ï¼Œä¿å­˜åˆ°ç è¡¨æ—¶æ¯ä¸ªç é•¿éœ€è¦?5 ä½ï¼Œä¿å­˜ 5k 个ç é•‰Kœ€è¦?5k * 5 / 8 ¾U?3k 字节åQŒç®—上无效节ç‚V€ç é•¿çš„é‡å¤çš„因素,原始字节倹{€åŒ¹é…长度的ä¿å­˜åQŒæœ€¾lˆç è¡¨çº¦ 5k 字节åQŒäØ“(f¨´) 90k çš?18 分之一。当ŒDµè½å‡å°æ—Óž¼Œæœ‰æ•ˆèŠ‚ç‚¹­‘‹äºŽ½E€ç–,无效节点å®ÒŽ(gu¨©)˜“˜qžæˆç‰‡ï¼ŒåŽ»é‡å¤æœºåˆ¶èƒ½å‘挥更大的作用;当段è½å¢žå¤§æ—¶åQŒæ— æ•ˆèŠ‚ç‚¹å¯†åº¦å‡ž®ï¼Œå¯èƒ½æ— æ³•大片˜qžæŽ¥åQŒåŽ»é‡å¤æœºåˆ¶çš„æ•ˆç”¨é™ä½Žï¼Œç è¡¨çš„æ¯”例å¯èƒ½ä¼š(x¨¬)增大。一旦“匹é…è·¼› Z€éœ€è¦ä¿å­˜çš„ç é•¿æ•°è¾¾åˆîCº† 32k个,ç è¡¨è¾‘Öˆ°æœ€å¤§ï¼Œä¹‹åŽŒDµè½å†å¢žå¤§ä¹Ÿä¸ä¼š(x¨¬)增大ç è¡¨åQŒäºŽæ˜¯ç è¡¨çš„æ¯”例åˆä¼š(x¨¬)逿¸ä¸‹é™ã€‚当然段è½é€šå¸¸ä¸ä¼š(x¨¬)辑ֈ°˜q™ä¹ˆå¤§ï¼Œä½¿å¾—“匹é…è·¼› Z€éœ€è¦ä¿å­˜çš„ç é•¿æ•°èƒ½æœ‰æœºä¼?x¨¬)è¾¾å?32kã€?br />  gzip 以牺牲压¾~©çŽ‡çš„ä»£ä»äh¥æ¢å–ç è¡¨çš„进一步的大幅度凞®ã€‚我们先æè¿°ä¸€ä¸‹å®ƒçš„å…·ä½“åšæ³•ï¼Œå†æ¥åˆ†æžå…¶åˆ©å¼Šã€?br />  gzip 把匹é…长度划æˆ?29 个范å›ß_(d¨¢)¼ŒæŠŠåŒ¹é…è·¼›Õdˆ’æˆ?30 个范å›ß_(d¨¢)¼Œæ ÒŽ(gu¨©)®æ¯ä¸ªèŒƒå›´ä¸­èŠ‚ç‚¹çš„æ€»é¢‘çŽ‡ï¼Œä¸?29 个长度范围加 258 ä¸ªå­—èŠ‚å€¼å¾ huffman æ ?w¨¨i)ï¼?x¨¬)l_treeåQŒäØ“(f¨´) 30 个跼›»èŒƒå›´å¾ huffman æ ?w¨¨i)ï¼?x¨¬)d_tree。输å‡ÞZ¸€ä¸ªå€¼æ—¶å…ˆè¾“凸™¯¥å€¼æ‰€åœ¨èŒƒå›´çš„¾~–ç åQŒå†è¾“出附加ç ï¼Œå›_®ƒæ˜¯è¯¥èŒƒå›´ä¸­çš„½W¬å‡ ä¸ªå€¹{€‚è¿™æ ïL(f¨¥ng) è¡¨ä¸­åªéœ€ä¿å­˜èŒƒå›´çš„ç é•Ñ€‚范围的大å°éƒ½æ˜¯ 2 的乘方,所以范围大ž®å’Œé™„加ç çš„ä½é•¿æ˜¯äº’相决定的ã€?br />29 个长度范围的附加ç ä½é•¿æ˜¯åQ?br />{0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
30 个跼›»èŒƒå›´çš„附加ç ä½é•¿æ˜¯åQ?br />{0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
å¯ä»¥çœ‹å‡ºåQšèŒƒå›´çš„划分是从ž®åˆ°å¤§çš„ã€‚äØ“(f¨´)什么ä¸òq›_‡åˆ’分呢?
  如果ä»ä»¥å•个节点的角度æ¥çœ‹ï¼Œè¢«åˆ†åˆ°åŒä¸€èŒƒå›´çš„节点相当于被赋予了相åŒçš„ç é•¿ï¼š(x¨¬)范围¾~–ç çš„ç é•¿åŠ é™„åŠ ç çš„ç é•¿ã€‚若频率差别很大的节点因划分入åŒä¸€ä¸ªèŒƒå›´è€Œæ‹¥æœ‰ç›¸åŒçš„ç é•¿åQŒå°±ä¸ç¬¦å?huffman ¾~–ç çš„åˆè¡øP¼Œä¼?x¨¬)对压羃率äñ”生ä¸è‰¯åª?ji¨£ng)å“ã€‚å› æ­¤è¦æ±‚划分åŽåQŒèŒƒå›´é‡Œçš„节炚w¢‘率相˜q‘,以尽é‡é™ä½ŽåŒä¸€ä¸ªèŒƒå›´é‡Œä¸åŒèŠ‚ç‚¹é—´çš„ç›æ€º’å½±å“ã€?br />  “匹é…长度â€ä»ŽçŸ­åˆ°é•¿ï¼Œé¢‘率ä¼?x¨¬)逿¸è¡°å‡åQŒè€Œä¸”è¡°å‡çš„幅度有从大到å°çš„特点,˜q™ä¸ªç‰¹ç‚¹æ˜¯åœ¨å¤§å¤šæ•°åŽŸå§‹æ–‡ä»¶ä¸­â€œè‡ªç„¶å­˜åœ¨â€çš„。比如在 google 上æœç´¢ï¼Œ2 个字的短语和 22 个字的短语,æœåˆ°çš„结果数差别巨大åQ?00 个字å’?220 个字åQŒæœåˆ°çš„¾l“果数差别就没有那么大。频率大致上å•å‘åœ°é€æ­¥å˜åŒ–åQŒæ‰€ä»¥åˆ’分范围åŽåQŒèŒƒå›´å†…节点的频率较接近åQ›å˜åŒ–速度由大到å°åQŒæ‰€ä»¥èŒƒå›´çš„划分应该从å°åˆ°å¤§ã€?br />  “匹é…è·¼› Z€ä¹Ÿæœ‰ç±»ä¼¼çš„特点åQŒå¯¹å¤§å¤šæ•°æ–‡ä»¶æ¥è¯ß_(d¨¢)¼ŒåŒšw…å‘生åœ?1k 以内比å‘生在 5k å·¦å³çš„å¯èƒ½æ€§è¦å¤§å¾—多,但å‘生在 28k 处附˜q‘çš„å¯èƒ½æ€§å’Œå‘生åœ?32k 处附˜q‘çš„å¯èƒ½æ€§çš„差别ž®±æ²¡é‚£ä¹ˆæ˜Žæ˜¾ã€‚所以范围划分也应该是从ž®åˆ°å¤§ã€?br />  “未匚w…的原始字节â€ä¸å…ähœ‰é¢‘çŽ‡è¡°å‡æˆ–递增的å•å‘å˜åŒ–的规律åQŒå®ƒä»¬çš„频率分布往往是å‚å·®ä¸é½ã€éš¾ä»¥é¢„‹¹‹çš„åQŒä¸å¯èƒ½ç”¨é¢„先设定的范围表对它们˜q›è¡Œå¤§è‡´åˆç†çš„划分,ž®±åƒâ€œåŒ¹é…长度â€å’Œâ€œåŒ¹é…è·¼› Z€é‚£æ —÷€‚虽然也å¯ä»¥é€šè¿‡è®¡ç®—分æžåQŒå¯¹å®ƒä»¬˜q›è¡Œä¸è®¾å®šèŒƒå›´æ•°é‡å’Œå¤§å°çš„划分,以求æ¯ä¸ªèŒƒå›´ä¸­çš„å„节炚w¢‘率大致相˜q‘,ä½?1) “匹é…è·¼› Z€çš„划分已ç»å¤§å¹…度地¾~©å°äº†ç è¡¨çš„大å°åQ?) ç”׃ºŽä¸å…·æœ‰é¢‘率å•å‘å˜åŒ–çš„­‘‹å‘åQŒè¦å¼ø™¡Œåˆ’出节点频率相近òq¶ä¸”节点数是 2 的乘方的范围太勉强,隑ֺ¦ä¹Ÿå¤§åQ?) 未匹é…的字节æ•îC¸€èˆ¬è¦å¤§äºŽâ€œåŒ¹é…æ•°â€ï¼ˆæ³¨æ„åQšä¸æ˜¯â€œåŒ¹é…字节数â€ï¼‰(j¨ª)åQŒå¼ºè¡Œåˆ’分造æˆçš„ä¸è‰¯å应较大。所ä»?gzip ä¿ç•™äº†è¿™å¥—节点,没去拆分ã€?br />  长度范围的最åŽä¸€ä¸ªé™„加ç ä½é•¿æ˜?0åQŒæ˜¯å› äØ“(f¨´)长度大于 258 的匹é…都被截断到 258åQŒæ‰€ä»?258 的频率å¯èƒ½ä¼š(x¨¬)高出å‰é¢çš„节点,å•ç‹¬åˆ’äØ“(f¨´)一个范围ã€?br />  如果一个范围里的节炚w¢‘率相åŒï¼ŒèŠ‚ç‚¹æ•°æ˜¯ 2 的乘方,且没有无效节点,那么˜q™ä¸ªèŒƒå›´å¯ä»¥çœ‹ä½œ huffman æ ?w¨¨i)中的一‹‚µå­æ ?w¨¨i),范围的编ç å¯ä»¥çœ‹ä½œè¿™‹‚µå­æ ‘(w¨¨i)的根的¾~–ç åQŒè¿™æ ïL(f¨¥ng)š„划分是ä¸ä¼?x¨¬)åª?ji¨£ng)å“压¾~©çŽ‡çš„ã€?br />  对压¾~©çŽ‡çš„æŸå®Ïx¥è‡ªé¢‘率ä¸ä¸€è‡ß_(d¨¢)¼Œä»¥åŠ(qi¨¢ng)无效节点的存在。范围里的有效节点如果没有过åŠï¼Œâ€œé™„加ç â€çš„使•°ž®Þp‡³ž®‘æœ‰ä¸€ä½æµªè´¹äº†åQŒä¹Ÿž®±æ˜¯è¯ß_(d¨¢)¼ŒèŒƒå›´é‡Œæ‰€æœ‰æœ‰æ•ˆèŠ‚ç‚¹çš„ç é•¿æ— ç«¯å¢žé•¿äº†ä¸€ä½ï¼Œå¦‚果有效节点没有˜q?1/4åQŒè‡³ž®‘å°±æœ?2 ä½é™„加砋¹ªè´¹ã€?br />  划分范围的收益是使ç è¡¨å‡ž®åˆ°ä¸èƒö 0.2kåQŒåŠ ä¸ŠåŽé¢ä¼š(x¨¬)介ç»çš„对ç è¡¨çš„第二次压羃åQŒç è¡¨çš„æœ€¾lˆå¤§ž®æ˜¯å¾®ä¸­‘³é“çš„ã€?br />  现在我们æ¥è¿‘似地估计一下划分范围在“一般情况â€ä¸‹å¯¹åŽ‹¾~©çŽ‡çš„æŸå®³çš„æƒ…况åQŒä»¥ä¾¿æœ‰ä¸€ä¸ªå¤§è‡´çš„æ¦‚念åQŒä»ä¸‘Ö‰é¢çš„例å­åQ𿮵è½å¤§ž®äØ“(f¨´) 90kåQŒè®¾å…¶ä¸­æœªåŒ¹é…å­—èŠ‚æ•°å’ŒåŒ¹é…æ•°çš„æ¯”例䨓(f¨´) 3:1åQŒæœªåŒšw…字节æœ?45k 个,匚w…è·ç¦»å€¼å’ŒåŒšw…é•¿åº¦å€¼å„ 15k 个,有效è·ç¦»å€ÆDŠ‚ç‚¹äØ“(f¨´) 5k个(节点òq›_‡é¢‘率ä¸?3åQ‰ï¼Œæ— æ•ˆè·ç¦»å€ÆDŠ‚ç‚¹äØ“(f¨´) 32k - 5k = 27k 个,有效è·ç¦»å€ÆDŠ‚ç‚¹çš„òq›_‡å¯†åº¦ä¸?5/32åQŒä¸åˆ?1/6。范围的划分是剞®åŽå¤§ï¼Œæœ‰æ•ˆèŠ‚ç‚¹é¢‘çŽ‡æ˜¯å‰å¤§åŽž®ï¼Œæ— æ•ˆèŠ‚ç‚¹æ˜¯å‰ž®‘åŽå¤šã€‚è·¼›Õd€¼æœ‰ 15k ä¸ªï¼Œè®‘Ö‰é¢æœ‰æ•ˆèŠ‚ç‚šw¢‘率高ã€å¯†åº¦è¾ƒå¤§çš„部分å ä¸€åŠï¼Œ¾U?7k 个å€û|¼Œ˜q™ä¸ªéƒ¨åˆ†ä¸­æ— æ•ˆèŠ‚ç‚¹å¸¦æ¥çš„æŸå®³è¾ƒå°åQŒè€Œä¸”范围划分¾l†ï¼ŒèŠ‚ç‚¹é—´é¢‘çŽ‡ä¸ä¸€è‡´å¸¦æ¥çš„æŸå®³ä¹Ÿå°åQŒå§‘且ä¸åŽ»è®¡½Ž—。åŽé¢çš„èŒƒå›´åˆ’åˆ†å¤§ã€æœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦å°çš„部分æŸå®Œ™¾ƒå¤§ï¼Œ˜q™ä¸ªéƒ¨åˆ†å äº†¾U?7k 个å€û|¼Œç”׃ºŽå‰é¢çš„部分有效节点密度大åQŒæ‰€ä»¥å‡è®¾è¿™ä¸ªéƒ¨åˆ†æœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦äØ“(f¨´) 1/8åQˆä¹Ÿž®±æ˜¯è¯ß_(d¨¢)¼Œ¾U¦ä¸€åŠçš„匚w…å‘生åœ?1k è·ç¦»ä»¥å†…åQŒä¸” 1k 以内无效节点很少åQŒé‚£ä¹?4k / 31k ¾U¦ç­‰äº?1/8åQ‰ï¼Œé™„åŠ ç æµªè´¹äº† 3 ä½ï¼Œ7k 个值浪è´?3 ä½ï¼Œå…±æµªè´¹äº† 21k bit ¾U¦ç­‰äº?3k 字节ã€?br />  å†çœ‹é¢‘率ä¸ä¸€è‡´å¸¦æ¥çš„æŸå®³åQšhuffman ¾~–ç å¦‚æžœè¦è¾¾åˆ?50% 的压¾~©çއåQŒéœ€è¦èŠ‚ç‚šw—´é¢‘率的差异达到几癑ր。读者å¯ä»¥è™šæ‹Ÿä¸€äº›èŠ‚ç‚šw¢‘率,试ç€å»ÞZ¸€ä¸?huffman æ ?w¨¨i),会(x¨¬)å‘现当节点频率差异在几åå€ç”šè‡›_ªæœ‰å‡ å€çš„æ—¶å€™ï¼ŒåŽ‹ç¾ƒçŽ‡å…¶å®žå¾®ä¹Žå…¶å¾®ã€‚ç»˜q‡ä¸Šé¢è¿™æ ·åˆç†åœ°åˆ’分范围åQŒèŒƒå›´å†…的节炚w¢‘率差异一般ä¸ä¼?x¨¬)那么大åQŒæ‰€ä»¥æˆ‘们å‡è®ùN¢‘率ä¸ä¸€è‡´é€ æˆçš„æŸå®³äØ“(f¨´) 1k åQ?2kã€?br />  匚w…长度值的å–倯DŒƒå›´åªæœ?258 个,而且匚w…长度å¯èƒ½å¾ˆå°‘ä¼?x¨¬)è¶…˜q?20 字节åQŒè€Œå‰ 20 字节的范围划分是很细的,所以无效节点的æŸå®³å’Œé¢‘率ä¸ä¸€è‡´çš„æŸå®³éƒ½è¾ƒ?y¨­u)®ã€?br />  ˜q™æ ·åQŒåœ¨˜q™ä¸ªä¾‹å­ä¸­ï¼Œåˆ’分范围带æ¥çš„æŸå®³çº¦åœ?5k åQ?6kåQŒå’Œä¸åˆ’分范围时ç è¡¨çš„大ž®éžå¸¸ç›¸ä¼û|¼Œè‡›_°‘也是在一个数é‡çñ”上ã€?
ã€€ã€€å†æ¥çœ‹çœ‹æŸå®³æ¯”例å˜åŒ–的趋势:(x¨¬)当段è½å¾ˆž®æ—¶åQŒèŒƒå›´ä¸­çš„æœ‰æ•ˆå€¼ç¨€ç–,æŸå®³æ¯”例ä¼?x¨¬)加大。而ä¸åˆ’分范围æ—Óž¼Œç è¡¨çš„去é‡å¤æœºåˆ¶ä¼?x¨¬)有更大作用åQŒæ— æ•ˆèŠ‚ç‚¹è¿žæˆç‰‡åQŒæŸå®Ïx¯”例凞®ã€‚å之,ŒDµè½å¢žå¤§åQŒèŒƒå›´é‡Œæœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦å¤§ï¼ŒæŸå®³æ¯”例é™ä½ŽåQŒè€Œä¸åˆ’分范围æ—Óž¼Œæ— æ•ˆèŠ‚ç‚¹å¯èƒ½æ— æ³•大片˜qžæŽ¥åQŒåŽ»é‡å¤æœºåˆ¶çš„æ•ˆç”¨é™ä½Žï¼ŒæŸå®³æ¯”例增大ã€?br />  ç”׃ºŽåˆ’分范围能ä‹É huffman æ ?w¨¨i)的节点从最å¤?32k å‡åˆ°ä¸èƒö 320 个,从而ä‹É压羃速度显著改善。综上所˜qŽÍ¼ŒŒDµè½ž®ï¼ˆæ¯”如ä¸åˆ° 10kåQ‰ï¼Œä¸å®œåˆ’分范围åQŒå¦åˆ™åˆ’分范围是有益的ã€?/div>
™å‰™ƒ¨

 
å‘表äº?2006-3-3 14:50  资料短消æ?/a> 
3.4 对ç è¡¨è¿›è¡Œç¬¬äºŒæ¬¡åŽ‹ç¾ƒã€?br />  目å‰ä¸ºæ­¢åQŒç è¡¨ä¸­åªéœ€è¦ä¿å­˜å„个节点绘q?huffman ¾~–ç åŽçš„æ–°ç¼–ç çš„ç é•¿ã€‚共两棵æ ?w¨¨i),l_tree: 256 个原始字节值加 29 个长度范围值加 1 个段è½ä¸­æ­¢ç¬¦åQŒå…± 286 个节点,ŒDµè½ä¸­æ­¢½W¦ç”¨æ¥åœ¨è§£åŽ‹æ—¶æ ‡½CÞZ¸€ä¸ªæ®µè½çš„¾lˆç»“。d_tree: 30 个跼›»èŒƒå›´å€¹{€‚也ž®±æ˜¯è¯ß_(d¨¢)¼Œå…±éœ€è¦ä¿å­?286 + 30 = 316 个编ç çš„ç é•¿ã€‚gzip é™åˆ¶ huffman æ ?w¨¨i)的最大层æ•îCØ“(f¨´) 15åQŒè¿™æ øP¼Œç é•¿ž®±æœ‰ 0 åQ?15 å…?16 ¿Uå€û|¼Œå†åŠ ä¸Šå‰é¢ä»‹¾l过的去é‡å¤æœºåˆ¶ä½¿ç”¨çš?3 ¿U特ŒDŠå€û|¼Œå…?19 ¿Uå€û|¼Œå¦‚æžœž®Þp¿™æ ·ä¿å­˜ç è¡¨çš„è¯ï¼Œæ¯ä¸ªç é•¿éƒ½éœ€è¦?5 ä½ï¼Œæ‰èƒ½è¡¨ç¤º 19 ¿U倹{€‚我们观察一下,316 个ç é•¿ï¼Œä¸€å…±åªæœ?19 ¿Uå€û|¼Œç é•¿å€¼çš„é‡å¤æ˜¯å¿…ç„¶çš„åQŒè€Œä¸”ç”׃ºŽ huffman æ ?w¨¨i)上æ¯å±‚的节ç‚Ò?gu¨©)•°ä¸åŒåQŒæ‰€ä»¥å„个ç é•¿å€¼çš„频率也ä¸ä¸€æ —÷€‚所以还å¯ä»¥ä¸ø™¿™ 19 ¿U值å†å»?huffman æ ?w¨¨i),˜q›è¡Œ½W¬äºŒ‹Æ¡ç¼–ç ã€‚è¿™‹‚‰| ‘(w¨¨i)åªæœ‰ 19 个节点,é™åˆ¶å®ƒçš„层数ä¸?0 åQ?7åQŒå¯ä»¥ç”¨ 3 ä¸?bit 表示˜q?19 个节点的“长度â€ã€‚è¿™æ øP¼Œç”¨æ–°çš„“ç é•¿çš„¾~–ç â€æ¥ä¿å­˜ 316 个ç é•¿ï¼Œå¦éœ€é¢å¤–ä¿å­˜ 3 * 19 = 57 bitåQŒå°±å¯ä»¥è§£åދ凸™¿™ 19 个“ç é•¿çš„¾~–ç â€ã€‚(至于˜q?57 bitåQŒå°±æ²¡æœ‰å¿…è¦å†ä½œ½W?3 ‹Æ¡ç¼–ç äº†åQ?br />

4. 解决了ç è¡¨çš„问题åQŒçŽ°åœ¨å†å›žè¿‡å¤´æ¥çœ‹é™æ€ç¼–ç ã€?br />ã€€ã€€é™æ€ç¼–ç æ˜¯ gzip 预先讑֮šçš„ç¼–ç æ–¹æ¡ˆï¼Œå®ƒçš„ç è¡¨æ˜¯å›ºå®šçš„ã€?br />  该如何åˆç†è®¾è®¡è¿™å¥—ç¼–ç ï¼Ÿä½œäØ“(f¨´) huffman ¾~–ç çš„补助,它的耗时应尽é‡å°‘åQŒå‰é¢è¯´˜q‡ï¼Œlz77 输出一个分ŒDµä¹‹å‰ï¼Œè¦æ¯”è¾?huffman ¾~–ç å’Œé™æ€ç¼–ç çš„压羃¾l“æžœåQŒäØ“(f¨´)了直接利ç”?lz77 输出时åšçš„匹é…长度范围ã€åŒ¹é…è·¼›»èŒƒå›´çš„é¢‘çŽ‡çš„ç»Ÿè®¡ï¼Œé™æ€ç¼–ç é‡‡ç”¨äº†åŒæ ·çš„范å›ß_(d¨¢)¼é™„加ç çš„æ–ÒŽ(gu¨©)¡ˆåQŒè¿™æ ·å¯ä»¥å¿«é€Ÿå¾—åˆ°é™æ€ç¼–ç çš„压羃¾l“果大å°ã€?br />ã€€ã€€é™æ€ç¼–ç çš„ç é•¿çš„åˆ†é…æ˜¯˜q™æ ·çš„:(x¨¬)29 个长度范围中å‰?24 个范围的ç é•¿ä¸?7åQŒåŽ 5 个范围的ç é•¿ä¸?。原始字节å€ég¸­ 0 åQ?143 çš„ç é•¿äØ“(f¨´) 8åQ?44 åQ?255 çš„ç é•¿äØ“(f¨´) 9。è€?30 个跼›»èŒƒå›´çš„ç é•¿ä¸?5。根æ®è¿™äº›é¢„先设定的ç é•¿å»ºç«‹é™æ€çš„ l_tree å’?d_treeåQŒç¼–ç ä¹Ÿž®×ƒñ”生了。结åˆå‰é¢æåˆ°çš„附加ç ä½æ•°çš„定义åQ?br />29 个长度范围的附加ç ä½é•¿ï¼š(x¨¬)
{0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
30 个跼›»èŒƒå›´çš„附加ç ä½é•¿ï¼š(x¨¬)
{0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
读者å¯ä»¥çŸ¥é“æ¯ä¸€ä¸ªå€¼çš„实际ç é•¿ã€‚长度范围值和原始字节值å¾åœ¨ä¸€‹‚‰| ‘(w¨¨i)上,节点多所以ç é•¿è¾ƒé•¿ï¼Œ30 个跼›»èŒƒå›´å€¼åªéœ€è¦?5 ä½äºŒ˜q›åˆ¶æ•°è¡¨½Cºã€‚短匚w…的长度范围å€ég½é•¿è¾ƒçŸ­ï¼Œå­—节å€?0 åQ?143 çš„ä½é•¿ä¸­½{‰ï¼Œå…¶ä»–字节值和长匹é…çš„é•¿åº¦èŒƒå›´å€ÆD¾ƒé•Ñ€‚è¿™æ ïL(f¨¥ng)š„分é…åæ˜ äº?gzip ä½œè€…å¯¹â€œå¤§å¤šæ•°â€æ–‡ä»¶ä¸­å„ç§å€¼çš„频率的粗略估计。作ä¸ÞZ¸€ä¸ªé€šç”¨çš„压¾~©ç®—法,无法预先知é“一个文件的实际情况åQŒä¸å¯èƒ½åšç²¾¼‹®çš„估计ã€?br />  ˜q›ä¸€æ­¥çš„æ€è€ƒï¼š(x¨¬)陿€ç¼–ç æœ‰å¿…è¦å—ï¼Ÿé™æ€ç¼–ç é‡‡ç”¨äº†å’?huffman ¾~–ç ç›¸åŒçš„范å›ß_(d¨¢)¼é™„加ç çš„æ–ÒŽ(gu¨©)¡ˆåQŒåœ¨ç é•¿çš„分é…上ä¸å¯èƒ½è¶…˜q?huffman ¾~–ç åQŒå¦‚果能“获胜â€ï¼Œé‚£å°±æ˜¯èƒœåœ¨ä¸éœ€è¦ä¿å­˜ç è¡¨ä¸ŠåQŒè€Œå‰é¢åˆ†æžè¿‡åQŒç è¡¨æ˜¯å¾ˆå°çš„,对压¾~©çŽ‡æ²¡æœ‰å¤šå¤§å½±å“åQŒæ‰€ä»?gzip è®¾è®¡çš„è¿™ä¸ªé™æ€ç¼–ç æ–¹æ¡ˆåº”è¯¥æ˜¯å¯æœ‰å¯æ— çš„ã€?br />
5. 关于堆排åºç®—法ã€?br />  ä¼ég¹Žå·²ç»è§£å†³äº†æ‰€æœ‰çš„éšùN¢˜åQŒä½†æ˜¯å¯¹äºŽæ²¡æœ‰å­¦˜q‡æ•°æ®ç»“构的读者,ä»ç„¶æœ‰ä¸€ä¸ªä¼š(x¨¬)å¯¹ç¨‹åºæ•ˆçއäñ”生媄(ji¨£ng)å“的问题需è¦å…³æ³¨ï¼Œé‚£å°±æ˜¯â€œæŽ’åºâ€ã€?br />  已ç»è®²è¿‡åQŒhuffman ½Ž—法ž®±æ˜¯ä»Žä¸€ä¸ªèŠ‚ç‚¹åºåˆ—中åQŒä¸æ–­æ‰¾å‡ÞZ¸¤ä¸ªæœ€ž®çš„节点åQŒäØ“(f¨´)它们å»ÞZ¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒå€égØ“(f¨´)˜q™ä¸¤ä¸ªèŠ‚ç‚¹ä¹‹å’Œï¼Œç„¶åŽä»ŽèŠ‚ç‚¹åºåˆ—中去除˜q™ä¸¤ä¸ªèŠ‚ç‚¹ï¼ŒåŠ å…¥å®ƒä»¬çš„çˆ¶èŠ‚ç‚¹åˆ°åºåˆ—中åQŒä¸æ–­é‡å¤è¿™æ ïL(f¨¥ng)š„æ­¥éª¤åQŒç›´åˆ°èŠ‚ç‚¹åºåˆ—中åªå‰©ä¸‹ä¸€ä¸ªèŠ‚ç‚V€‚如何快速地扑ևºæœ€ž®çš„元素呢?
  在普通的¾U¿æ€§ç½—列的数殾l“构中,ä»?N 个元素中扑ևºæœ€ž®çš„元素的时间和 N æˆæ­£æ¯”,如果数æ®ä»¥æˆ‘们所è¦ä»‹¾l的“堆â€çš„¾l“构存储åQŒæ—¶é—´å’Œ lg N æˆæ­£æ¯”(注:(x¨¬)lg ä»?2 为底敎ͼŒå¦?lg 256 = 8åQŒlg 1024 = 10 ...åQ‰ã€?集åˆä¸­çš„元素­‘Šå¤šåQŒå †æŽ’åº½Ž—æ³•çš„ä¼˜åŠ¿è¶Š½H出åQŒè€Œä¸”堆排åºéžå¸”R€‚åˆäºŽåœ¨æ•°æ®åºåˆ—䏭䏿–­åœ°å–走最ž®çš„元素òq¶åŠ å…¥æ–°çš„å…ƒç´ ã€?br />
5.1 什么是堆?
  堆首先是一‹‚µâ€œå®Œå…¨äºŒå‰æ ‘(w¨¨i)â€ï¼ŒåÏx‰€æœ‰çš„å¶å­èŠ‚ç‚¹éƒ½åœ¨æ ?w¨¨i)çš„æœ€ä½ŽäºŒå±‚ï¼Œæœ€ä½Žä¸€å±‚çš„èŠ‚ç‚¹ä¾æ¬¡é å·¦æŽ’åˆ—çš„äºŒå‰æ ‘(w¨¨i)。如图:(x¨¬)

ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€å®Œå…¨äºŒå‰æ ?br />                         ï½?br />              åQ‹ï¼åQï¼åQï¼åQï¼åQï¼åQâ—‹åQï¼åQï¼åQï¼åQï¼åQï¼åQ?br />              |                     ï½?br />      åQ‹ï¼åQï¼åQï¼åQï¼â—‹ï¼åQï¼åQï¼åQ+          åQ‹ï¼åQï¼â—‹ï¼åQï¼åQ?br />      |              |          |       ï½?br />  åQ‹ï¼åQï¼â—‹ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€ã€€ã€€åQ‹ï¼åQï¼â—‹ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€åQ‹ï¼â—‹ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼â—‹ï¼åQ?br />  |       |      |       |    |   |   |   ï½?br />åQ‹ï¼â—‹ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼â—‹ï¼åQ‹ã€€ã€€åQ‹ï¼â—‹ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼â—‹ï¼åQ‹ã€€ã€€â– ã€€ã€€ã€€â– ã€€ã€€ã€€â– ã€€ã€€ã€€â–?br />|   |   |   |  |   |   |   ï½?br />■   ■   ■   ■  ■   ■   ■   â–?br />

  堆分大根堆和ž®æ ¹å †ï¼Œå¤§æ ¹å †çš„æ‰€æœ‰å­èŠ‚ç‚¹éƒ½å°äºŽå®ƒçš„父节点åQŒå°æ ¹å †çš„æ‰€æœ‰å­èŠ‚ç‚¹éƒ½å¤§äºŽå®ƒçš„çˆ¶èŠ‚ç‚¹ã€‚ä¸‹é¢å°±æ˜¯ä¸€ä¸ªå°æ ¹å †åQ?br />
                         ž®æ ¹å ?br />                          ï½?br />              åQ‹ï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ’ï¼åQï¼åQï¼åQï¼åQï¼åQ+
              |                      ï½?br />      åQ‹ï¼åQï¼åQï¼åQï¼åQ“ï¼åQï¼åQï¼åQ+          åQ‹ï¼åQï¼åQ8åQï¼åQ+
      |              |          |        ï½?br />  åQ‹ï¼åQï¼åQ–ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€ã€€ã€€åQ‹ï¼åQï¼åQ”ï¼åQï¼åQ‹ã€€ã€€ã€€ã€€åQ‹ï¼åQ‘5åQ+   åQ‹ï¼åQ‘8åQ+
  |       |      |       |    |    |   |    ï½?br />åQ‹ï¼åQ˜ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ™ï¼åQ‹ã€€ã€€åQ‹ï¼åQ•ï¼åQ‹ã€€ã€€ã€€åQ‹ï¼åQ•ï¼åQ‹ã€€ã€€åQ‘6  åQ’ï¼ã€€ã€€ã€€åQ‘9   åQ’ï¼
|   |   |   |  |   |   |   ï½?br />åQ™ã€€ã€€ã€€åQ™ã€€ã€€åQ‘1  åQ‘3  åQ–   åQ˜ã€€ã€€ã€€åQ–   åQ?br />
5.2 堆如何在内存中存储?
  堆存攑֜¨ä¸€ä¸ªæ•°¾l„中åQŒå­˜æ”„¡š„™åºåºæ˜¯ï¼š(x¨¬)ä»Žæ ¹å¼€å§‹ï¼Œä¾æ¬¡å­˜æ”¾æ¯ä¸€å±‚从左至å³çš„节点ã€?br />5.3 如何å¯ÀL‰¾ä»ÀL„节点的å­èŠ‚ç‚¹å’Œçˆ¶èŠ‚ç‚¹åQ?br />  数组中第 k 个元素,它的左å­èŠ‚ç‚¹æ˜¯ç¬¬ 2k 个元素,å›_­èŠ‚ç‚¹æ˜¯ç¬¬ 2k + 1 个元素。它的父节点是┖ k/2 ┚(注:(x¨¬)â”?X ┚表½Cºå°äºŽç­‰äº?X 的最大整敎ͼ‰(j¨ª)ã€?br />5.4 如何建立堆?
  先把 n 个元素例ơ放入数¾l„中åQŒä×o(h¨´)å˜é‡ k = â”?n/2 ┚,˜q™æ—¶½W?k 个元素是最åŽä¸€ä¸ªå…ƒç´ çš„父节点,从第 k 个元素的两个å­èŠ‚ç‚¹ä¸­æ‰‘Ö‡ºè¾ƒå°çš„一个与 k 元素比较åQŒå¦‚æžœå°äº?k 元素åQŒå°±å’?k 元素交æ¢ä¸€ä¸‹ä½¾|®ï¼Œæ¢ä½åŽçš„原先çš?k 元素å†å’Œæ–°çš„å­èŠ‚ç‚ÒŽ(gu¨©)¯”较(如果有å­èŠ‚ç‚¹çš„è¯åQ‰ï¼Œç›´åˆ°å®ƒä¸å†å°äºŽæ–°çš„å­èŠ‚ç‚¹æˆ–æ²¡æœ‰å­èŠ‚ç‚¹ã€‚ä×o(h¨´) k = k - 1。å†é‡å¤ä¸Šé¢çš„åšæ³•ç›´åˆ?k < 1åQŒä¸€ä¸ªå †ž®±å¾æˆäº†ã€?br />5.5 如何从堆中找出第二个最ž®çš„元素åQ?br />  把堆中第一个元素(最ž®çš„元素åQ‰å­˜æ”‘Öˆ°å…¶ä»–地方åQŒæŠŠ½W?n 个元素(最åŽä¸€ä¸ªï¼‰(j¨ª)攑ֈ°½W¬ä¸€ä¸ªçš„ä½ç½®åQŒå†ç”¨å‰é¢çš„æ–ÒŽ(gu¨©)³•和下层节点交æ¢ç›´åˆ°å®ƒæ”‘Öˆ°åˆé€‚çš„ä½ç½®åQŒè¿™æ—¶æ•°¾l„ä»ç„¶æ˜¯ä¸€ä¸ªå †åQŒç¬¬ä¸€ä¸ªå…ƒç´ æ˜¯æœ€ž®çš„节点åQŒæ•°¾l„的最åŽä¸€ä¸ªæœ‰æ•ˆèŠ‚ç‚ÒŽ(gu¨©)˜¯½W?n - 1 个元素ã€?br />  èŠÞp´¹çš„æ—¶é—´å’Œäº¤æ¢çš„æ¬¡æ•°æˆæ­£æ¯”åQŒæœ€å¤§çš„å¯èƒ½çš„äº¤æ¢æ¬¡æ•°æ˜¯åQ?堆的层数 - 1 =â”?lg (元素æ•?+ 1) â”? 1åQˆæ³¨åQšâ” X ┒表½Cºå¤§äºŽç­‰äº?X 的最ž®æ•´æ•ŽÍ¼‰(j¨ª)ã€?br />  现在å¯ä»¥çœ‹åˆ°åQŒå †ä¹‹æ‰€ä»¥é‡‡ç”¨å®Œå…¨äºŒå‰æ ‘(w¨¨i)çš„åÅžå¼ï¼Œæ˜¯äØ“(f¨´)了树(w¨¨i)的层数尽å¯èƒ½ž®‘ã€?br />  而抽出最åŽä¸€ä¸ªå…ƒç´ æ”¾åˆ°æ ‘(w¨¨i)æ ¹ï¼Œè€Œä¸æ˜¯æŠ½å‡ºç¬¬äºŒå±‚çš„å…ƒç´ ï¼Œæ˜¯äØ“(f¨´)了维æŒå®Œå…¨äºŒå‰æ ‘(w¨¨i)的结构ï¼
5.6 如何加入新的元素到堆中?
  把第一个元素存攑ֈ°å…¶ä»–地方åQŒæŠŠæ–°çš„元素攑ֈ°½W¬ä¸€ä¸ªçš„ä½ç½®åQŒå†ç”¨å‰é¢çš„æ–ÒŽ(gu¨©)³•和下层节点交æ¢ï¼Œç›´åˆ°å®ƒè¢«æ”‘Öˆ°åˆé€‚çš„ä½ç½®åQŒæ­¤æ—¶æ•°¾l„中ä»ç„¶æ˜¯ä¸€ä¸ªå †ã€?br />
6. å»?huffman æ ?w¨¨i)å’Œ¾~–ç çš„算法:(x¨¬)
  如果现在æœ?n 个待¾~–ç çš„节点,按照原始数å€ég»Žž®åˆ°å¤§å­˜æ”‘Öœ¨æ•°ç»„ tree[n] 中,那么åQŒå°†è¦å¾ç«‹çš„ huffman æ ?w¨¨i)æ€Õd…±ä¼?x¨¬)æœ?2n -1 节点åQŒåŒ…括å¶å­èŠ‚ç‚¹å’Œéžå¶å­èŠ‚ç‚V€‚申请一å—å†…å­˜ï¼Œå¤§å°æ˜¯èƒ½æ”¾ä¸‹ huffman æ ?w¨¨i)的所有节点,先把 n 个待¾~–ç èŠ‚ç‚¹æ”‘Ö…¥˜q™å—内存的左端,然åŽç”¨â€œå †æŽ’åºâ€ç®—æ³•å…ˆæŠŠå®ƒä»¬å¾æˆä¸€ä¸ªå †ã€?br />  然åŽä¸æ–­ç”¨â€œå †æŽ’åºâ€ç®—法å–出频率最ž®çš„节点åQŒæŠŠå®ƒä»¬ä»Žå³åˆ°å·¦ã€ä»Žž®åˆ°å¤§æŽ’攑֜¨å†…å­˜å—çš„å³ç«¯åQŒæ¯å½“å–å‡ÞZ¸¤ä¸ªèŠ‚ç‚¹ï¼Œ¾l™å®ƒä»¬ç”Ÿæˆä¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒé¢‘率等于它们之和,加入堆中。这æ ïL(f¨¥ng)›´åˆ°å †ä¸­åªå‰©ä¸‹ä¸€ä¸ªæ ¹èŠ‚ç‚¹åQŒè¿™æ—Óž¼Œå†…存中从左到å›_­˜å‚¨çš„æ˜¯é¢‘率从大到ž®çš„æ‰€æœ‰èŠ‚ç‚¹ï¼Œä¸€‹‚?huffman æ ?w¨¨i)其实也ž®±å¾æˆäº†åQŒå±‚æ•°å°çš„节点在å‰ï¼Œå±‚数大的节点在åŽåQŒæ¯ä¸€å±‚çš„èŠ‚ç‚¹åˆæ˜¯æŒ‰é¢‘率从大到ž®ä¾‹Æ¡æŽ’列ã€?br />  甌™¯·ä¸¤ä¸ªæ•°ç»„åQšbl_count[]åQŒbl_base[]。置根节点的ç é•¿ä¸?0åQŒä»Žå·¦è‡³å»I¼Œæ‰€æœ‰èŠ‚ç‚¹çš„ç é•¿(len)为它的父节点的ç é•?+ 1åQŒå¦‚果是å¶å­èŠ‚ç‚¹åQŒbl_count[len]++åQŒå¾—åˆîCº†æ¯ä¸€å±‚上的å¶å­èŠ‚ç‚ÒŽ(gu¨©)•°ç›®ã€‚ä×o(h¨´)å˜é‡ code = 0åQŒç„¶åŽæ ¹æ?bl_count[] ç”Ÿæˆ bl_base[]åQšç é•?len ä»?1 开始递增åQŒbl_base[len] = code = (code + bl_count[len - 1]) << 1åQŒå¾—åˆîCº†æ¯ä¸€å±‚上½W¬ä¸€ä¸ªå¶å­èŠ‚ç‚¹çš„¾~–ç ã€?br />  现在所有待¾~–ç èŠ‚ç‚¹éƒ½è¢«èµ‹äºˆäº†ç é•¿ï¼Œé历待编ç èŠ‚ç‚¹ï¼Œæ ÒŽ(gu¨©)®å®ƒä»¬çš„ç é•¿å¾—到它们的¾~–ç åQšåºå?n 递增åQŒtree[n].code = bl_base[ tree[n].len ] ++ã€?br />  注æ„åQšæˆ‘ä»¬å‰é¢è®¨è®ºç è¡¨çš„æ—¶å€™è¯´˜q‡ï¼Œgzip å¯?huffman ¾~–ç ˜q›è¡Œäº†æ”¹˜q›ï¼Œåªéœ€è¦å¾—到æ¯ä¸€ä¸ªå¶å­èŠ‚ç‚¹ï¼ˆå¾…ç¼–ç èŠ‚ç‚¹ï¼‰(j¨ª)çš„ç é•¿ï¼Œž®±å¯ä»¥è¿›è¡Œç¼–ç ï¼Œè€Œä¸éœ€è¦å…³å¿ƒå®ƒçš„çˆ¶èŠ‚ç‚¹çš„ç¼–ç æ˜¯ä»€ä¹ˆã€‚而ä¿å­˜ç è¡¨æ—¶åQŒåªéœ€è¦ä¿å­˜ç é•Ñ€?br />
动æ€?huffman 压羃和解压的整个‹¹ç¨‹åQ?br />压羃åQ?br />  lz77 的压¾~©è¿‡½E‹ä¸­è¾“出未匹é…çš„å•åŒå­—节åQŒå’ŒåŒšw…åQŒåƈ¾lŸè®¡å„字节值和匚w…长度范围ã€åŒ¹é…è·¼›»èŒƒå›´çš„频率åQŒæ ¹æ®è¿™äº›é¢‘率å¾ç«‹ä¸¤‹‚?huffman æ ?w¨¨i)ï¼?x¨¬)ltreeã€dtreeåQŒå¾—到这两棵æ ?w¨¨i)上所有节点的长度和编ç ã€?br />  ¾lŸè®¡˜q™ä¸¤‹‚‰| ‘(w¨¨i)节点长度的ä‹É用频率,对å„节点长度建立 huffman æ ?w¨¨i)ï¼?x¨¬)bl_treeåQŒå¾—åˆ?bl_tree 的长度和¾~–ç ã€?br />  存储 bl_tree 的节炚w•¿åº¦æ•°¾l„ã€?br />  å†ç”¨ bl_tree 的编ç å­˜å‚?ltreeã€dtree 的节炚w•¿åº¦æ•°¾l„ã€?br />  å†ç”¨ ltree 的编ç å­˜å‚¨å„字节值和匚w…长度范围åQˆåŠ(qi¨¢ng)附加ç ï¼‰(j¨ª)çš„æµåQ›ç”¨ dtree 的编ç å­˜å‚¨åŒ¹é…è·¼›»èŒƒå›ß_(d¨¢)¼ˆå?qi¨¢ng)附加ç åQ‰çš„‹¹ã€?br />解压åQ?br />  先根æ?bl_tree 的节炚w•¿åº¦æ•°¾l„å¾—åˆ?bl_tree 的编ç ã€?br />  å†ç”¨˜q™äº›¾~–ç å¾—到 ltreeã€dtree 的节炚w•¿åº¦æ•°¾l„,˜q›è€Œå¾—åˆ?ltreeã€dtree 的编ç ã€?br />ã€€ã€€å†æ ¹æ?ltreeã€dtree 的编ç åŠ(qi¨¢ng)附加ç çš„定义åQŒå¾—åˆ?lz77 的输出的原始¾l“æžœåQšå„字节值和匚w…长度的æµåQŒåŒ¹é…è·¼›Èš„‹¹ã€?/div>
 
 
å‘表äº?2006-3-3 14:50  资料短消æ?/a> 
åŽè®°åQ?br />  写作本文èŠÞp´¹äº†è¶…˜q‡ä¸€òq´çš„业余旉™—´åQŒå…¶å®žçœ‹æ‡?gzip æºç åªç”¨äº†ä¸€ä¸ªåŠæœˆçš„业余旉™—´åQŒç­‰çœŸæ­£å¼€å§‹å†™˜q™ç¯‡æ–‡ç« çš„æ—¶å€™ï¼Œå‘çŽ°æ·±å…¥åˆ†æžæ— æŸåŽ‹ç¾ƒ½Ž—æ³•è¦æŠ•å…¥çš„å¿ƒåŠ›ä¼?x¨¬)远­‘…过我原æ¥çš„æƒŒ™±¡åQŒä¸æ˜¯å…‰é â€œæ¯…然决然的æ€åº¦â€å’Œâ€œæ‹¼æç²¾¼œžâ€å°±å¯ä»¥å®Œæˆçš„ã€‚åªæœ‰è€å¿ƒåœ°åŽ»ä»˜å‡ºã€?br />  ¾l过了一òq´å¤šçš„æ—¶é—ß_(d¨¢)¼Œ¾lˆäºŽæœ‰äº†çŽ°åœ¨˜q™æ ·è´¨é‡çš„è¿™½‹‡æ–‡ç« ã€‚这期间åQŒæˆ‘的工作已¾l从应用工程师è{å˜åˆ°äº†ç ”½I¶å‘˜åQŒåº”该说åQŒå†™ä½œè¿™½‹‡æ–‡ç« å¯¹ä¿ƒæˆæˆ‘把今åŽçš„工作è{å˜äØ“(f¨´)æžç ”½I¶æ˜¯æœ‰åª„(ji¨£ng)å“的。所以这½‹‡æ–‡ç« å¯¹æˆ‘自å·Þqš„人生é“èµ\当然是有é‡è¦çš„æ„ä¹‰ï¼Œæˆ‘ä¹Ÿå¸Œæœ›å®ƒä¼š(x¨¬)促æˆè¯»è€…投íw«ç ”½I¶çš„军_¿ƒã€?br />  巴甫‹z›å¤«è¯ß_(d¨¢)¼š(x¨¬)“科学研½I‰™œ€è¦çš„æ˜¯ä¼Ÿå¤§çš„热情和艰苦的劳作â€ï¼Œä»Žçœ‹åˆ°è¿™å¥è¯èµøP¼Œæˆ‘就一直很喜欢它,常常ä¼?x¨¬)想赯‚¿™å¥è¯ã€‚希望这½‹‡æ–‡ç« èƒ½ä½¿è¯»è€…è”æƒ›_ˆ°â€œé•¿ä¹…的热情和è€å¿ƒçš„劳作â€ï¼Œòq¶åœ¨ç”Ÿæ´»å’Œå·¥ä½œä¸­è´¯å½»˜q™ç§¾_„¡¥žã€?br />  一½‹‡æ–‡ç« å‘布以åŽï¼Œå®ƒçš„全部价值就在于读者的阅读åQŒæ„Ÿè°¢è¯»è€…诸å›ã€?/div>


sea 2006-11-17 16:27 å‘表评论
]]>
Java中文处ç†å­¦ä¹ (f¨¤n)½W”记——Hello Unicode(转帖)http://www.shnenglu.com/nchsea/archive/2006/11/07/14827.htmlseaseaTue, 07 Nov 2006 14:46:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/07/14827.htmlhttp://www.shnenglu.com/nchsea/comments/14827.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/07/14827.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/14827.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/14827.html阅读全文

sea 2006-11-07 22:46 å‘表评论
]]>
2020¾Ã¾Ã¾«Æ·ÑÇÖÞÈÈ×ÛºÏÒ»±¾| Å·ÃÀÎçÒ¹A¡Å´óƬ¾Ã¾Ã | ¾Ã¾Ã¹ú²úÃâ·Ñ| Ïã¸ÛaaÈý¼¶¾Ã¾ÃÈý¼¶| ¹ú²ú¾«Æ·¾Ã¾Ã¾Ã¾Ã¾Ã´µ³±| ÑÇÖÞ¾«Æ·¹ú²ú×ÖÄ»¾Ã¾Ã²»¿¨| ÈÕ±¾WVÒ»±¾Ò»µÀ¾Ã¾ÃÏã½¶| ¾Ã¾ÃÈËÈËˬÈËˬÈËÈËˬav| ¾Å¾ÅÈȾþÃÃâ·ÑÊÓÆµ| ¹ú²úÒ»Çø¶þÇø¾«Æ·¾Ã¾ÃÔÀ| ÇàÇà²ÝÔ­×ۺϾþÃ| 9191¾«Æ·¹ú²úÃâ·Ñ¾Ã¾Ã | ÑÇÖÞ¾«Æ·¸ßÇå¹ú²úÒ»¾Ã¾Ã| AVÎÞÂë¾Ã¾Ã¾Ã¾Ã²»¿¨ÃÛÌÒ| ¾Ã¾Ã¾Ã¾ÃÈËÆÞÒ»Çø¾«Æ·ÐÔÉ«av| ¾Ã¾Ã¾ÃÅ®ÈËÓ붯ÎïȺ½»Ã«Æ¬| ÑÇÖÞAVÎÞÂë¾Ã¾Ã¾«Æ·ºÝºÝ°®À˳±| ¾«Æ·ÈËÆÞÂ×¾ÅÇø¾Ã¾ÃAAAƬ69| ¾Ã¾Ã¾Ã¾Ã¾Ã¾Ã¾«Æ·¸¾Å®99| Ò»±¾Ò»±¾¾Ã¾ÃA¾Ã¾Ã×ۺϾ«Æ·| ¾Ã¾Ã¾Ã¾Ã¾Ã¹ú²ú¾«Æ·ÃÀÅ® | ÈËÆÞÉÙ¸¾¾Ã¾ÃÖÐÎÄ×ÖÄ»| ¾Ã¾ÃÎÞÂëÈËÆÞÒ»Çø¶þÇøÈýÇøÎçÒ¹| ÑÇÖÞÈ˳ÉÒÁÈ˳É×ÛºÏÍø¾Ã¾Ã¾Ã| ¾Ã¾ÃÈËÈËˬˬˬÈ˾þþÃ| ¹ú²ú¾«Æ·¾Ã¾Ã¾Ã¾Ãaaaa| ¾Ã¾Ã¾Ã¾ÃÑÇÖÞAV³ÉÈËÍø| ÑÇÖÞ¾«Æ·ÃÀÅ®¾Ã¾Ã¾Ã¾Ã99С˵ | ÈÕ±¾Ò»Çø¾«Æ·¾Ã¾Ã¾Ã¾ÃÓ°Ôº| ¾Ã¾Ã¾«Æ·ÎÞÂëÒ»Çø¶þÇøÈýÇøÈÕº«| É«99¾Ã¾Ã¾Ã¾Ã¸ß³±×ÛºÏÓ°Ôº| ÑÇÖÞÒÁÈ˾þþ«Æ·Ó°Ôº| ¾Ã¾Ã¾Ã¾ÃÖÐÎÄ×ÖÄ»| ÈÕÈպݺݾþÃ͵͵ɫ×ÛºÏÃâ·Ñ | 97¾Ã¾Ã¾Ã¾ÃÈËÆÞ¾«Æ·×¨Çø| ¹ú²ú¾«Æ·³ÉÈË99¾Ã¾Ã¾Ã¾Ã91gav| ÌìÌì×ۺϾþÃÒ»¶þÈýÇø| ¾Ã¾Ã¾«Æ·¹ú²úÑÇÖÞav¸ßÇåÂþ»­| 51¾Ã¾Ãҹɫ¾«Æ·¹ú²ú| ºÝºÝ¾«Æ·¾Ã¾Ã¾ÃÎÞÂëÖÐÎÄ×ÖÄ»| ¾«Æ·¾Ã¾Ã¾Ã¾Ã¾ÃÎÞÂë×¨Çø|