ï»??xml version="1.0" encoding="utf-8" standalone="yes"?> 廸™¡¨ã€åˆ 除表:mysql oracle db2åŸºæœ¬ç›¸åŒ ä½†æ˜¯ä¿®æ”¹è¡¨å°±æœ‰å¾ˆå¤§çš„ä¸åŒäº?如下åQ?/p>
1,å¢žåŠ åˆ?ç›¸åŒ 2,åˆ é™¤åˆ? 3,更改列å 4,更改列类åž?br />oracle :alter table test modify column (mail2 integer); 5,更改列的é™åˆ¶(主键ã€éž½I? 关于db2ä¸æä¾›è§£å†›_Šžæ³•ï¼Œå‚考这é‡?br />http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/0207adamache/0430_adamache3.html ˜q™ä¸ªåˆ—ä¸å†æ˜¯è¡Œçš„逻辑部分åQšä¾‹å¦‚,您æ„识到您的雇员å¯èƒ½æœ‰ä¸¤ä¸ªåœ°å€åQŒåÆˆä¸”åœæ¢è·Ÿítªé›‡å‘˜ï¼ˆemployeeåQ‰è¡¨ä¸çš„åœ°å€ åˆ—å˜å®½äº†ã€‚如果它æ˜?VARCHARåQŒé‚£æ‚¨è¿æ°”ä¸é”™ã€‚DB2 å…许您将 VARCHAR åˆ—æœ€å¤šåŠ å®½è‡³è¡¨ç©ºé—ß_¼ˆtablespaceåQ?br />ä¸å®šä¹‰çš„™åµå¤§ž®å®½åº¦ï¼ˆ¾~ºçœçš?4K ™åµå¤§ž®äØ“ 4,005åQŒè€Œåœ¨ 32K ™åµä¸Šæœ€å¤šäØ“ 32,672åQ‰ï¼š 但是˜q‡ç¨‹ä¸é—®ä¸€ä¸ªæœ‹å‹ï¼Œå¾—到的结论是å¯ä»¥æ”¹ï¼ŒçŸ›ç›¾å•Šç‘ô¾l找资料: Â
posted on 2006-11-22 15:41 dreamstone 阅读(365) 评论(0) ¾~–辑 æ”¶è— å¼•ç”¨ æ”¶è—è‡?65Key 所属分¾c? é¥ç¢—
  1.整体了解
  2.è¯æ³•¾l†èŠ‚
  3.实例
  4.应用
好久没有æ–îC¸œè¥¿è¿›å¸äº†åQŒè¯»çš„书也是åŠé€”而废åQŒæ²¡æœ‰è¯»å®Œã€?br />䏿ƒ³èƒŒç€åŒ…袱上èµ\åQŒä¹Ÿä¸å¾è®®å¦‚æ¤ã€?br />生活本æ¥å¾ˆç®€å•çš„åQŒæ€Žä¹ˆ½H然一下åè§‰å¾—å¤æ‚èµäh¥å‘¢ã€?br />䏿‡‚
䏿‡‚
çœŸçš„ä¸æ‡‚!
我è¦è®¡åˆ’的将æ¥ï¼Œè‡›_°‘是三òqß_¼
三年是个å?
毕业˜q™ä¸ªä¸‰å¹´åQŒæˆ‘没有什么戞®±ã€?br />
接下æ¥çš„三年呢?
å¯Òޝ”mysql oracle db2 的部分ddlè¯æ³•
create table test(id integer,name varchar(20),address varchar(20));
(oracle 多用varchar2åQŒä½†ä¹Ÿæ”¯æŒvarchar)
drop table test;
alter table test add mail varchar(128);
oracle 与mysql相åŒ:alter table test drop column mail;
db2             :ä¸æä¾›åˆ é™¤åˆ—åŠŸèƒ½(è§£å†³åŠžæ³•æ˜¯åˆ é™¤è¡¨åQŒé‡å»?
oracle : alter table test rename column mail to mail2;
mysql : alter talbe test change mail mail2 varchar(128);
db2   : ä¸æä¾›æ›´æ”¹åˆ—å功èƒ?解决办法åŒåˆ 除,或者通过建立一个新视图解决)
mysql :alter table test modify column mail2 integer;
db2   :alter table test alter mail varchar(256) åªå¯ä»¥åŠ å®½ï¼Œä¸èƒ½æ›´æ”¹¾cÕdž‹
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;
截å–部分原文
-------------------------------------------------------------------------------
DROP COLUMNåQšDB2 ä¸å…è®¸æ‚¨åˆ é™¤ä¸€ä¸ªåˆ—ã€‚æˆ‘å¯ä»¥æƒ›_ˆ°æ‚¨å¸Œæœ›åˆ 除列的三个ç†ç”±ï¼š
回收½Iºé—´åQšå¦‚果您希望˜q™æ ·åšï¼Œå¯ä»¥å¯¼å‡ºæ‚¨å¸Œæœ›ä¿å˜çš„æ•°æ®åQŒåˆ 除那个表åQŒç”¨æ‚¨éœ€è¦çš„é‚£äº›åˆ—é‡æ–°åˆ›å»ø™¡¨åQŒç„¶åŽè£…å…?br />˜q™ä¸ªè¡¨ã€‚这是å¦ä»£äh高昂åQŸå½“然是åQŒä½†æ˜¯å›žæ”¶ç©ºé—´éœ€è¦è¿™æ ähˆ–è€?REORG TABLE。这些本æ¥å°±æ˜¯ä»£ä»·é«˜æ˜‚çš„æ“作ã€?
åQˆé›‡å‘˜è¡¨å’Œé›‡å‘˜åœ°å€åQˆemployee_addressåQ‰è¡¨ä¹‹é—´çŽ°åœ¨æœ?n:m 关系åQ‰ã€‚在雇员表上创å¾ä¸€ä¸ªä¸åŒ…å«åœ°å€åˆ—的视图ã€?
如果您真的è¦ç”¨æ–°å¥‡çš„æ–ÒŽ³•åQŒå¯ä»¥ä‹Éç”?RENAME TABLE 命ä×o¾l™åŸºè¡¨ä¸€ä¸ªæ–°çš„å¿UŽÍ¼Œç„¶åŽž®†åŽŸå§‹è¡¨åä½œä¸ø™¯¥è§†å›¾çš?br />å称。您的视图也å¯ä»¥˜qžæŽ¥é›‡å‘˜è¡¨ä¸çš„æœ‰ç”¨åˆ—和从雇员地å€èŽ·å¾—çš„åœ°å€ã€‚现在我们回åˆîCº†å…³ç³»çš„æ£é“ã€?/p>
---------------------------------------------------------------------------------
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>
å¾®èÊY的高¾U§ç¨‹åºå‘˜¾~–写了函数让我们˜q™äº›æžåº”ç”¨çš„åŽ»è°ƒç”¨ï¼Œæˆ‘ä¸æƒ›_œ¨˜q™é‡Œè´¬ä½Žæžåº”ç”¨çš„äººï¼Œæ£æ˜¯˜q™äº›åº”用工程师连接è“v了科å¦å’Œ½C¾ä¼šä¹‹é—´çš„æ¡¥æ¢ï¼Œž®†æ¥å¯ä»¥åšé”€å”®ï¼Œåšç®¡ç†ï¼Œç”¨è‡ªå·±é€æ¸¿U¯ç¯èµäh¥çš„æ™ºæ…§å’Œ¾l验在社会上打拼ã€?br />但是åQŒåœ¨æŠ€æœ¯ä¸Šæ¥è¯´åQŒè¯šå®žåœ°è¯ß_¼Œ˜q™åƈä¸é«˜æ·±ï¼Œä¸æ˜¯å—?½W¬ä¸€‹¹çš„å…¬å¸å¦‚微软ã€Sybaseã€Oracle ½{‰æ€ÀL˜¯é¢å‘½C¾ä¼šå¤§ä¼—的,˜q™æ ·æ‰èƒ½æœ‰å·¨å¤§çš„市场。但是他们往往也是站在½C¾ä¼šçš„æœ€™å¶å±‚的:æ“作¾pÈ»Ÿã€ç¼–è¯‘å™¨ã€æ•°æ®åº“éƒ½å€¼å¾—ä¸€ä»£ä»£çš„ä¸“å®¶åŽ»ä¸æ–ç ”ç©¶ã€‚è¿™äº›å¸å›½èˆ¬çš„ä¼ä¸šä¹‹æ‰€ä»¥ä¼Ÿå¤§ï¼Œææ€•䏿˜¯â€œæœ‰¾l验â€ã€â€œèƒ½åƒè‹¦â€è¿™äº›ä¸å›½ç‰¹è‰²çš„æ¦‚念所能涵盖的åQŒè‰°æ·Þqš„æŠ€æœ¯ä½“¾p…R€çŽ°ä»£çš„½Ž¡ç†å“²å¦ã€å¼ºå¤§çš„市场能力都是¾~ÞZ¸€ä¸å¯çš„å§ã€‚我们既然有志于技术,òq¶ä¸”æ£åœ¨èµäh¥é˜¶æ®µåQŒä½•必急ä¸å¯è€åœ°è¦è{åŽÕdšâ€œç®¡ç†â€ï¼Œåšâ€œé’òq´æ‰ä¿Šâ€ï¼Œé‚£äº›æ‰€è°“的“æˆåŠŸäh士â€çš„æ ¹åº•èƒ½æœ‰å‡ ä½•åQŒè¿™æ ·å‹¹®èºåQŒèƒ¸ä¸çš„è§„æ¨¡å’Œæ ¼å±€èƒ½æœ‰å¤šå¤§åQ?br />
在我å‘现vcåªæ˜¯ä¸€ä¸ªç”¨é€”广泛的¾~–程工具åQŒåƈä¸èƒ½ä»£è¡¨â€œçŸ¥è¯†â€ã€â€œæŠ€æœ¯â€çš„æ—¶å€™ï¼Œæˆ‘有些失è½ï¼Œæ— 所ä¸èƒ½çš„䏿˜¯æˆ‘åQŒè€Œæ˜¯ MFCã€SDKã€DDKåQŒæ˜¯å¾®èÊY的工½E‹å¸ˆåQŒä»–们åšçš„ï¼Œæ£æ˜¯æˆ‘想åšçš„åQŒæˆ–者说åQŒæˆ‘也想æˆäؓ那ç§å±‚次的ähåQŒçŽ°åœ¨æˆ‘çŸ¥é“了,他们是专å®Óž¼Œä½†è¿™ä¸ä¼šæ˜¯ä¸€ä¸ªæ¢¦åQŒæœ‰ä¸€å¤©æˆ‘会åšåˆ°çš„åQŒäؓ什么ä¸èƒ½è¯´å‡ºæˆ‘的想法呢ã€?br />那时公å¸åšçš„¾pÈ»Ÿé‡Œæœ‰ä¸€ä¸ªåŽ‹¾~©æ¨¡å—,领导找了一ä¸?zlib 库,ä¸è®©æˆ‘自己åšåŽ‹ç¾ƒ½Ž—法åQŒç«™åœ¨å…¬å¸çš„立场上,我很ç†è§£åQŒçœŸçš„很ç†è§£åQŒè‡ªå·±åš½Ž—æ³•è¦å¤šä¹…啊。但那时自己心ä¸éšè—的一份倔强é©×ƒ‹É我去å¯ÀL‰¾åŽ‹ç¾ƒåŽŸç†çš„资料,我完全没有æ„识到åQŒæˆ‘å›_°†æ‰“开一扇大门,˜q›å…¥ä¸€ä¸ªç¥žå¥‡çš„“数æ®ç»“æž„â€çš„世界。“计½Ž—机艺术â€çš„½W¬ä¸€¾U‰K˜³å…‰ï¼Œå±…然也照åˆîCº†æˆ‘è¿™æ ·ä¸€ä¸ªåã^凡的人的íw«ä¸Šã€?br />
上é¢è¯´åˆ°â€œè®¡½Ž—机艺术â€ï¼Œæˆ–者进一æ¥ç»†åŒ–说“计½Ž—机¾~–程艺术â€ï¼Œå¬è“væ¥å¾ˆæ·±å¥¥åQŒå¾ˆé«˜é›…åQŒä½†æ˜¯åœ¨ž®†è¦˜q›å…¥ä¸“业的压¾~©ç®—æ³•çš„ç ”ç©¶æ—Óž¼Œæˆ‘è¦è¯·å¤§å®¶åšçš„第一件事情是åQšå¿˜æŽ‰è‡ªå·Þqš„òq´é¾„ã€å¦åŽ†ï¼Œå¿˜æŽ‰è‡ªå·±çš„ç¤¾ä¼šèín份,忘掉¾~–程è¯è¨€åQŒå¿˜æŽ‰â€œé¢å‘对象â€ã€â€œä¸‰å±‚æž¶æž„â€ç‰ä¸€åˆ‡æœ¯è¯ã€‚把自己当作一个å°å©ï¼Œæœ‰ä¸€åŒæ±‚知的眼ç›åQŒå¯¹ä¸–界充满ä¸å€¦çš„ã€å•¾U¯çš„好奇åQŒå”¯ä¸€çš„å‰ææ˜¯ä¸€ä¸ªæ£å¸¸çš„å…ähœ‰äººç±»ç†æ€§æ€ç»´èƒ½åŠ›çš„å¤§è„‘ã€?br />下颞®Þp®©æˆ‘们开始一ŒD능žå¥‡çš„压羃½Ž—法之旅å§ï¼š
1. 原ç†éƒ¨åˆ†åQ?br />  有两¿UåÅžå¼çš„é‡å¤å˜åœ¨äºŽè®¡½Ž—机数æ®ä¸ï¼Œzip ž®±æ˜¯å¯¹è¿™ä¸¤ç§é‡å¤˜q›è¡Œäº†åŽ‹¾~©ã€?br />  一¿U是çŸè¯å½¢å¼çš„é‡å¤ï¼Œå³ä¸‰ä¸ªå—节以上的é‡å¤åQŒå¯¹äºŽè¿™¿Ué‡å¤ï¼Œzip用两个数å—:1.é‡å¤ä½ç½®è·å½“å‰åŽ‹¾~©ä½¾|®çš„è·ç¦»åQ?.é‡å¤çš„长度,æ¥è¡¨½Cø™¿™ä¸ªé‡å¤ï¼Œå‡è®¾˜q™ä¸¤ä¸ªæ•°å—å„å 一个å—节,于是数æ®ä¾¿å¾—åˆîCº†åŽ‹ç¾ƒåQŒè¿™å¾ˆå®¹æ˜“ç†è§£ã€?br />  一个å—节有 0 - 255 å…?256 ¿Uå¯èƒ½çš„å–å€û|¼Œä¸‰ä¸ªå—节æœ?256 * 256 * 256 å…׃¸€åƒå…癑֤šä¸‡ç§å¯èƒ½çš„æƒ…况,更长的çŸè¯å–值的å¯èƒ½æƒ…况以指数方å¼å¢žé•¿ï¼Œå‡ºçްé‡å¤çš„æ¦‚率似乎æžä½Žï¼Œå®žåˆ™ä¸ç„¶åQŒå„¿U类型的数æ®éƒ½æœ‰å‡ºçްé‡å¤çš„們֑åQŒä¸€½‹‡è®ºæ–‡ä¸åQŒäØ“æ•îC¸å¤šçš„æœ¯è¯å€‘֑于é‡å¤å‡ºçŽŽÍ¼›ä¸€½‹‡å°è¯ß_¼Œäººå和地å会é‡å¤å‡ºçްåQ›ä¸€å¼ 上下æ¸å˜çš„背景囄¡‰‡åQŒæ°´òqÏx–¹å‘上的åƒç´ 会é‡å¤å‡ºçްåQ›ç¨‹åºçš„æºæ–‡ä»¶ä¸åQŒè¯æ³•关键å—会é‡å¤å‡ºçŽŽÍ¼ˆæˆ‘ä»¬å†™ç¨‹åºæ—¶åQŒå¤šž®‘次å‰åŽcopyã€pasteåQŸï¼‰åQŒä»¥å‡ å K 为å•ä½çš„éžåŽ‹¾~©æ ¼å¼çš„æ•°æ®ä¸ï¼Œå€‘֑于大é‡å‡ºçްçŸè¯å¼çš„é‡å¤ã€‚绘q‡ä¸Šé¢æåˆ°çš„æ–¹å¼˜q›è¡ŒåŽ‹ç¾ƒåŽï¼ŒçŸè¯å¼é‡å¤çš„å€‘Ö‘è¢«å®Œå…¨ç ´å,所以在压羃的结果上˜q›è¡Œ½W¬äºŒ‹Æ¡çŸè¯å¼åŽ‹ç¾ƒä¸€èˆ¬æ˜¯æ²¡æœ‰æ•ˆæžœçš„ã€?br />  ½W¬äºŒ¿Ué‡å¤äØ“å•å—节的é‡å¤åQŒä¸€ä¸ªå—èŠ‚åªæœ?56¿Uå¯èƒ½çš„å–å€û|¼Œæ‰€ä»¥è¿™¿Ué‡å¤æ˜¯å¿…然的。其ä¸ï¼ŒæŸäº›å—节出现‹Æ¡æ•°å¯èƒ½è¾ƒå¤šåQŒå¦ä¸€äº›åˆ™è¾ƒå°‘åQŒåœ¨¾lŸè®¡ä¸Šæœ‰åˆ†å¸ƒä¸å‡åŒ€çš„們֑åQŒè¿™æ˜¯å®¹æ˜“ç†è§£çš„åQŒæ¯”如一ä¸?ASCII 文本文äšgä¸ï¼ŒæŸäº›½W¦å·å¯èƒ½å¾ˆå°‘用到åQŒè€Œå—æ¯å’Œæ•°å—则ä‹É用较多,å„å—æ¯çš„使用频率也是ä¸ä¸€æ ïLš„åQŒæ®è¯´å—æ¯?e çš„ä‹É用概率最高;许多囄¡‰‡å‘ˆçްæ·Þp‰²è°ƒæˆ–‹¹…色调,æ·Þp‰²åQˆæˆ–‹¹…色åQ‰çš„åƒç´ 使用较多åQˆè¿™é‡Œé¡ºä¾¿æä¸€ä¸‹ï¼špng 囄¡‰‡æ ¼å¼æ˜¯ä¸€¿Uæ— æŸåŽ‹¾~©ï¼Œå…¶æ ¸å¿ƒç®—法就æ˜?zip ½Ž—法åQŒå®ƒå’?zip æ ¼å¼çš„æ–‡ä»¶çš„主è¦åŒºåˆ«åœ¨äºŽåQšä½œä¸ÞZ¸€¿Uå›¾ç‰‡æ ¼å¼ï¼Œå®ƒåœ¨æ–‡äšgå¤´å¤„å˜æ”¾äº†å›¾ç‰‡çš„大å°ã€ä‹É用的颜色数ç‰ä¿¡æ¯åQ‰ï¼›ä¸Šé¢æåˆ°çš„çŸè¯å¼åŽ‹ç¾ƒçš„ç»“æžœä¹Ÿæœ‰è¿™¿U們֑åQšé‡å¤å€‘֑于出现在¼›Õd½“å‰åŽ‹¾~©ä½¾|®è¾ƒ˜q‘的地方åQŒé‡å¤é•¿åº¦å€‘֑于比较çŸåQ?0å—节以内åQ‰ã€‚è¿™æ øP¼Œž®±æœ‰äº†åŽ‹¾~©çš„å¯èƒ½åQšç»™ 256 ¿Uå—节å–值釿–°ç¼–ç ,使出现较多的å—节使用较çŸçš„ç¼–ç ,出现较少的å—节ä‹É用较长的¾~–ç åQŒè¿™æ ·ä¸€æ¥ï¼Œå˜çŸçš„å—节相对于å˜é•¿çš„å—节更多,文äšg的总长度就会凞®‘,òq¶ä¸”åQŒå—节ä‹É用比例越ä¸å‡åŒ€åQŒåŽ‹¾~©æ¯”例就‘Šå¤§ã€?br />  在进一æ¥è®¨è®ºç¼–ç çš„è¦æ±‚以åŠåŠžæ³•å‰ï¼Œå…ˆæä¸€ä¸‹ï¼š¾~–ç å¼åŽ‹¾~©å¿…™åÕdœ¨çŸè¯å¼åŽ‹¾~©ä¹‹åŽè¿›è¡Œï¼Œå› 䨓¾~–ç å¼åŽ‹¾~©åŽåQŒåŽŸå…ˆå…«ä½äºŒ˜q›åˆ¶å€¼çš„å—节ž®Þp¢«ç ´å了,˜q™æ ·æ–‡äšgä¸çŸè¯å¼é‡å¤çš„å€‘Ö‘ä¹Ÿä¼šè¢«ç ´å(除éžå…ˆè¿›è¡Œè§£ç )。å¦å¤–,çŸè¯å¼åŽ‹¾~©åŽçš„结果:那些剩下的未被匹é…çš„å•ã€åŒå—节和得到匹é…çš„è·ç¦»ã€é•¿åº¦å€ég»ç„¶å…·æœ‰å–值分布ä¸å‡åŒ€æ€§ï¼Œå› æ¤åQŒä¸¤¿U压¾~©æ–¹å¼çš„™åºåºä¸èƒ½å˜ã€?br />  在编ç å¼åŽ‹ç¾ƒåŽï¼Œä»¥è¿ž¾l的八ä½ä½œäؓ一个å—节,原先未压¾~©æ–‡ä»¶ä¸æ‰€å…ähœ‰çš„å—节å–å€ég¸å‡åŒ€çš„å€‘Ö‘è¢«å½»åº•ç ´å,æˆäØ“éšæœºæ€§å–å€û|¼Œæ ÒŽ®¾lŸè®¡å¦çŸ¥è¯†ï¼Œéšæœºæ€§å–值具有å‡åŒ€æ€§çš„們֑åQˆæ¯”如抛¼‹¬å¸è¯•验åQŒæŠ›ä¸€åƒæ¬¡åQŒæ£å颿œä¸Šçš„æ¬¡æ•°éƒ½æŽ¥è¿‘äº?500 ‹Æ¡ï¼‰ã€‚å› æ¤ï¼Œ¾~–ç å¼åŽ‹¾~©åŽçš„ç»“æžœæ— æ³•å†˜q›è¡Œ¾~–ç å¼åŽ‹¾~©ã€?br />  çŸè¯å¼åŽ‹¾~©å’Œ¾~–ç å¼åŽ‹¾~©æ˜¯ç›®å‰è®¡ç®—机科å¦ç•Œç ”究出的仅有的两¿Uæ— æŸåŽ‹¾~©æ–¹æ³•ï¼Œå®ƒä»¬éƒ½æ— æ³•é‡å¤è¿›è¡Œï¼Œæ‰€ä»¥ï¼ŒåŽ‹ç¾ƒæ–‡äšgæ— æ³•å†æ¬¡åŽ‹ç¾ƒåQˆå®žé™…上åQŒèƒ½å夘q›è¡Œçš„压¾~©ç®—法是ä¸å¯æƒŒ™±¡çš„ï¼Œå› äØ“æœ€¾lˆä¼šåŽ‹ç¾ƒåˆ?0 å—节åQ‰ã€?br />=====================================
åQˆè¡¥å……)
压羃文äšgæ— æ³•å†æ¬¡åŽ‹ç¾ƒæ˜¯å› ä¸ºï¼š
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š„們֑åQŒä‹É定长¾~–ç å˜äØ“ä¸å®šé•¿ç¼–ç ,¾l™ä‹É用频率高的å—节更çŸçš„¾~–ç åQŒä‹É用频率低的å—节更长的¾~–ç åQŒè“v到压¾~©çš„æ•ˆæžœã€‚如果把¾~–ç å¼åŽ‹¾~©çš„â€œç»“æžœâ€æŒ‰ç…?ä½ä½œä¸?å—节åQŒé‡æ–°ç»Ÿè®¡å„å—节的ä‹É用频率,应该是大致相½{‰çš„ã€‚å› ä¸ºæ–°çš„å—节ä‹Éç”¨é¢‘çŽ‡æ˜¯éšæœºçš„。相½{‰çš„频率å†åŽ»å˜æ¢å—èŠ‚é•¿çŸæ˜¯æ²¡æœ‰æ„义的åQŒå› 为å˜çŸçš„å—节没有比å˜é•¿çš„å—节更多ã€?br />
=======================================
  çŸè¯å¼é‡å¤çš„們֑和å—节å–值分布ä¸å‡åŒ€çš„們֑是å¯ä»¥åŽ‹¾~©çš„基础åQŒä¸¤¿U压¾~©çš„™åºåºä¸èƒ½äº’æ¢çš„åŽŸå› ä¹Ÿè¯´äº†åQŒä¸‹é¢æˆ‘们æ¥çœ‹ç¼–ç å¼åŽ‹ç¾ƒçš„è¦æ±‚åŠæ–ÒŽ³•åQ?br />
首先åQŒäؓ了ä‹É用ä¸å®šé•¿çš„ç¼–ç 表½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出真æ£çš„ä¿¡æ¯å†…容了:
1110010101110110111100010 - DABBDCEAAB
è¦æž„é€ ç¬¦åˆè¿™ä¸€è¦æ±‚的二˜q›åˆ¶¾~–ç 体系åQŒäºŒå‰æ ‘æ˜¯æœ€ç†æƒ³çš„选择。考察下题q™æ£µäºŒå‰æ ‘:
        æ ?root)
       0  |   1
       +-------+--------+
    0  | 1   0  |  1
    +-----+------+  +----+----+
    |     |  |     |
    a      |  d     e
     0  |  1
     +-----+-----+
     |     |
     b     c
è¦ç¼–ç çš„å—符æ€ÀL˜¯å‡ºçŽ°åœ¨æ ‘å¶ä¸ŠåQŒå‡å®šä»Žæ ¹å‘æ ‘å¶è¡Œèµ°çš„过½E‹ä¸åQŒå·¦è½¬äØ“0åQŒå³è½¬äØ“1åQŒåˆ™ä¸€ä¸ªå—½W¦çš„¾~–ç ž®±æ˜¯ä»Žæ ¹èµ°åˆ°è¯¥å—½W¦æ‰€åœ¨æ ‘å¶çš„路径。æ£å› 䨓å—符åªèƒ½å‡ºçŽ°åœ¨æ ‘å¶ä¸ŠåQŒä“Q何一个嗽W¦çš„路径都ä¸ä¼šæ˜¯å¦ä¸€å—符路径的剾~€è·¯å¾„åQŒç¬¦åˆè¦æ±‚çš„å‰ç¼€¾~–ç ä¹Ÿå°±æž„é€ æˆåŠŸäº†åQ?br />
a - 00 b - 010 c - 011 d - 10 e - 11
æŽ¥ä¸‹æ¥æ¥çœ‹ç¼–ç å¼åŽ‹ç¾ƒçš„è¿‡½E‹ï¼š
ä¸Þ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
ç”¨äºŒå‰æ ‘表示˜q™å››¿Uç¼–ç ?å…¶ä¸å¶åèŠ‚ç‚¹ä¸Šçš„æ•°å—æ˜¯å…¶ä½¿ç”¨‹Æ¡æ•°åQŒéžå¶åèŠ‚ç‚¹ä¸Šçš„æ•°å—æ˜¯å…¶å·¦å³å©å使用‹Æ¡æ•°ä¹‹å’Œ):
          æ ?br />           |
      +---------33---------+
      |        |
   +----32---+      +----1---+
   |    |      |    |
+-21-+    +-11-+    +--1--+  
|   |    |   |    |   |
6   15  2  9    1   
åQˆå¦‚æžœæŸä¸ªèŠ‚ç‚¹åªæœ‰ä¸€ä¸ªå节点åQŒå¯ä»¥åŽ»æŽ‰è¿™ä¸ªå节点。)
         æ ?br />         |
        +------33------+
       |     |
    +-----32----+     1
    |      |
  +--21--+  +--11--+
  |   |  |   |
  6   15 2    9
çŽ°åœ¨çš„ç¼–ç æ˜¯åQ?a : 000 b : 001 c : 010 d : 011 e : 1 ä»ç„¶½W¦åˆâ€œå‰¾~€¾~–ç â€çš„è¦æ±‚ã€?br />
½W¬ä¸€æ¥ï¼šå¦‚æžœå‘现下层节点的数å—大于上层节点的数å—åQŒå°±äº¤æ¢å®ƒä»¬çš„ä½¾|®ï¼Œòq‰™‡æ–°è®¡½Ž—éžå¶å节点的倹{€?br />先交æ?1å’?åQŒç”±äº?1个å—节羃çŸäº†ä¸€ä½ï¼Œ1个å—节增长了一ä½ï¼Œæ€ÀL–‡ä»¶ç¾ƒçŸäº†10ä½ã€?br />
           æ ?br />            |
       +----------33---------+
       |        |
   +-----22----+     +----11----+
   |      |     |     |
+--21--+    1      2     9
|     |
6   15
å†äº¤æ?5å’?ã€?å’?åQŒæœ€¾lˆå¾—到这æ ïLš„æ ‘:
           æ ?br />            |
       +----------33---------+
       |        |
     +-----18----+    +----15----+
    |      |    |     |
  +--3--+    15   6     9
  |   |
  2   1
˜q™æ—¶æ‰€æœ‰ä¸Šå±‚节点的数值都大于下层节点的数å€û|¼Œä¼ég¹Žæ— 法å†è¿›ä¸€æ¥åŽ‹¾~©äº†ã€‚但是我们把æ¯ä¸€å±‚的最ž®çš„两个节点¾l“åˆèµäh¥åQŒå¸¸ä¼šå‘çŽîC»æœ‰åŽ‹¾~©ä½™åœ°ã€?br />
½W¬äºŒæ¥ï¼šæŠŠæ¯ä¸€å±‚的最ž®çš„两个节点¾l“åˆèµäh¥åQŒé‡æ–°è®¡½Ž—相兌™Š‚点的倹{€?br />
在上é¢çš„æ ‘ä¸åQŒç¬¬ä¸€ã€äºŒã€å››ä¸‰å±‚éƒ½åªæœ‰ä¸€æˆ–äºŒä¸ªèŠ‚ç‚¹ï¼Œæ— æ³•é‡æ–°¾l„åˆåQŒä½†½W¬ä¸‰å±‚上有四个节点,我们把最ž®çš„3å’?¾l“åˆèµäh¥åQŒåÆˆé‡æ–°è®¡ç®—相关节点的å€û|¼Œæˆäؓ下题q™æ£µæ ‘ã€?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™æ—¶å¯ä»¥çœ‹å‡º¾~–ç å¼åŽ‹¾~©çš„ä¸€ä¸ªåŸºæœ¬å‰æï¼šå„èŠ‚ç‚¹ä¹‹é—´çš„å€ÆD¦ç›¸å·®æ¯”较悬殊åQŒä»¥ä½¿æŸä¸¤ä¸ªèŠ‚ç‚¹çš„å’Œž®äºŽåŒå±‚或下层的å¦ä¸€ä¸ªèŠ‚ç‚¹ï¼Œ˜q™æ ·åQŒäº¤æ¢èŠ‚ç‚ÒŽ‰æœ‰åˆ©ç›Šã€?br />æ‰€ä»¥å½’æ ¹ç»“åº•ï¼ŒåŽŸå§‹æ–‡äšgä¸çš„å—节使用频率必须相差较大åQŒå¦åˆ™å°†æ²¡æœ‰ä¸¤ä¸ªèŠ‚ç‚¹çš„é¢‘çŽ‡ä¹‹å’Œå°äºŽåŒå±‚æˆ–ä¸‹å±‚å…¶ä»–èŠ‚ç‚¹çš„é¢‘çŽ‡ï¼Œä¹Ÿå°±æ— æ³•åŽ‹ç¾ƒã€‚å之,相差得越悬殊åQŒä¸¤ä¸ªèŠ‚ç‚¹çš„é¢‘çŽ‡ä¹‹å’Œæ¯”åŒå±‚或下层节点的频率å°å¾—越多,交æ¢èŠ‚ç‚¹ä¹‹åŽçš„利益也‘Šå¤§ã€?br />
在这个例åä¸åQŒç»˜q‡ä¸Šé¢ä¸¤æ¥ä¸æ–é‡å¤ï¼Œå¾—åˆ°äº†æœ€ä¼˜çš„äºŒå‰æ ‘,但ä¸èƒ½ä¿è¯åœ¨æ‰€æœ‰æƒ…况下åQŒéƒ½èƒ½é€šè¿‡˜q™ä¸¤æ¥çš„é‡å¤å¾—åˆ°æœ€ä¼˜äºŒå‰æ ‘åQŒä¸‹é¢æ¥çœ‹å¦ä¸€ä¸ªä¾‹å:
                         æ ?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¼Œä½†ä»ç„¶å¯ä»¥è¿›ä¸€æ¥ä¼˜åŒ–:
                         æ ?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™æ ·ä¸€ä¸ªç»“论:一‹‚‰|œ€ä¼˜äºŒå‰ç¼–ç æ ‘åQˆæ‰€æœ‰ä¸Šå±‚节炚wƒ½æ— 法和下层节点交æ¢ï¼‰åQŒå¿…™åȬ¦åˆè¿™æ ·ä¸¤ä¸ªæ¡ä»Óž¼š
åQ‘.所有上层节炚wƒ½å¤§äºŽ½{‰äºŽä¸‹å±‚节点ã€?br />åQ’.æŸèŠ‚ç‚¹ï¼Œè®‘Ö…¶è¾ƒå¤§çš„å节点为ï½åQŒè¾ƒž®çš„åèŠ‚ç‚¹äØ“ï½Žï¼Œï½ä¸‹çš„ä“Q一层的所有节炚wƒ½åº”大于ç‰äºŽï½Žä¸‹çš„该层的所有节ç‚V€?br />
当符åˆè¿™ä¸¤ä¸ªæ¡äšgæ—Óž¼Œä»ÖM¸€å±‚éƒ½æ— æ³•äº§ç”Ÿæ›´å°çš„节点去和下层节点交æ¢ï¼Œä¹Ÿæ— 法äñ”生更大的节点åŽÕd’Œä¸Šå±‚节点交æ¢ã€?br />
上é¢çš„ä¸¤ä¸ªä¾‹åæ˜¯æ¯”较½Ž€å•çš„åQŒå®žé™…的文äšgä¸ï¼Œä¸€ä¸ªå—节有256¿Uå¯èƒ½çš„å–å€û|¼Œæ‰€ä»¥äºŒå‰æ ‘çš„å¶å节点多è¾?56个,需è¦ä¸æ–çš„è°ƒæ•´æ ‘åÅžåQŒæœ€¾lˆçš„æ ‘åÅžå¯èƒ½éžå¸¸å¤æ‚åQŒæœ‰ä¸€¿Uéžå¸¸ç²¾å·§çš„½Ž—法å¯ä»¥å¿«é€Ÿåœ°å»ø™“v一‹‚‰|œ€ä¼˜äºŒå‰æ ‘åQŒè¿™¿U算法由D.HuffmanåQˆæˆ´Â·éœå¤«æ›û|¼‰æå‡ºåQŒä¸‹é¢æˆ‘们先æ¥ä»‹¾léœå¤«æ›¼½Ž—法的æ¥éª¤ï¼Œç„¶åŽå†æ¥è¯æ˜Žé€šè¿‡˜q™ä¹ˆ½Ž€å•çš„æ¥éª¤å¾—å‡ºçš„æ ‘å½¢ç¡®å®žæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘ã€?br />
éœå¤«æ›¼ç®—法的æ¥éª¤æ˜¯è¿™æ ïLš„åQ?br />
·从å„ä¸ªèŠ‚ç‚¹ä¸æ‰‘Ö‡ºæœ€ž®çš„两个节点åQŒç»™å®ƒä»¬å»ÞZ¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒå€égØ“˜q™ä¸¤ä¸ªèŠ‚ç‚¹ä¹‹å’Œã€?br />·然åŽä»ŽèŠ‚ç‚¹åºåˆ—ä¸å޻除˜q™ä¸¤ä¸ªèŠ‚ç‚¹ï¼ŒåŠ å…¥å®ƒä»¬çš„çˆ¶èŠ‚ç‚¹åˆ°åºåˆ—ä¸ã€?br />
é‡å¤ä¸Šé¢ä¸¤ä¸ªæ¥éª¤åQŒç›´åˆ°èŠ‚ç‚¹åºåˆ—ä¸åªå‰©ä¸‹å”¯ä¸€ä¸€ä¸ªèŠ‚ç‚V€‚这时一‹‚‰|œ€ä¼˜äºŒå‰æ ‘ž®±å·²¾l徿ˆäº†åQŒå®ƒçš„æ ¹ž®±æ˜¯å‰©ä¸‹çš„这个节ç‚V€?br />
ä»ä»¥ä¸Šé¢çš„ä¾‹åæ¥çœ‹éœå¤«æ›¼æ ‘的建立˜q‡ç¨‹ã€?br />最åˆçš„节点åºåˆ—是这æ ïLš„å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ˆå¾—åˆ°çš„æ ‘æ˜¯˜q™æ ·çš„:
       æ ?br />        |
   +-----33-----+
   |     |
   15   +----18----+   
       |       |
       9  +------9-----+
          |      |
         6     +--3--+
              |   |
              2  1
˜q™æ—¶å„个å—符的编ç 长度和å‰é¢æˆ‘们说过的方法得到的¾~–ç 长度是相åŒçš„åQŒå› 而文件的总长度也是相åŒçš„åQ?3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63
考察éœå¤«æ›¼æ ‘çš„å¾ç«‹è¿‡½E‹ä¸çš„æ¯ä¸€æ¥çš„节点åºåˆ—çš„å˜åŒ–:
6  15 2 9 1
6  15 9 3
15 9  9
15 18
33
䏋颿ˆ‘们用逆推法æ¥è¯æ˜Žå¯¹äºŽå„ç§ä¸åŒçš„节点åºåˆ—,用éœå¤«æ›¼½Ž—法建立èµäh¥çš„æ ‘æ€ÀL˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘åQ?br />
寚wœå¤«æ›¼æ ‘的建立˜q‡ç¨‹˜q用逆推法:
当这个过½E‹ä¸çš„节点åºåˆ—åªæœ‰ä¸¤ä¸ªèŠ‚ç‚ÒŽ—¶åQˆæ¯”如å‰ä¾‹ä¸çš?5å’?8åQ‰ï¼Œè‚¯å®šæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘åQŒä¸€ä¸ªç¼–ç 䨓0åQŒå¦ä¸€ä¸ªç¼–ç 䨓1åQŒæ— 法冘q›ä¸€æ¥ä¼˜åŒ–ã€?br />ç„¶åŽå¾€å‰æ¥˜q›ï¼ŒèŠ‚ç‚¹åºåˆ—ä¸ä¸æ–地å‡å°‘ä¸€ä¸ªèŠ‚ç‚¹ï¼Œå¢žåŠ ä¸¤ä¸ªèŠ‚ç‚¹åQŒåœ¨æ¥è¿›˜q‡ç¨‹ä¸å°†å§‹ç»ˆä¿æŒæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘åQŒè¿™æ˜¯å› 为:
1.按照éœå¤«æ›¼æ ‘çš„å¾ç«‹è¿‡½E‹ï¼Œæ–°å¢žçš„两个节ç‚ÒŽ˜¯å½“å‰èŠ‚ç‚¹åºåˆ—䏿œ€ž®çš„两个åQŒå…¶ä»–çš„ä»ÖM½•两个节点的父节点都大于(或ç‰äºŽï¼‰˜q™ä¸¤ä¸ªèŠ‚ç‚¹çš„çˆ¶èŠ‚ç‚¹ï¼Œåªè¦å‰ä¸€æ¥æ˜¯æœ€ä¼˜äºŒå‰æ ‘åQŒå…¶ä»–çš„ä»ÖM½•两个节点的父节点ž®×ƒ¸€å®šéƒ½å¤„在它们的父节点的上层或åŒå±‚åQŒæ‰€ä»¥è¿™ä¸¤ä¸ªèŠ‚ç‚¹ä¸€å®šå¤„åœ¨å½“å‰äºŒå‰æ ‘的最低一层ã€?br />2.˜q™ä¸¤ä¸ªæ–°å¢žçš„节点是最ž®çš„åQŒæ‰€ä»¥æ— 法和其他上层节点å¯ÒŽ¢ã€‚ç¬¦åˆæˆ‘们å‰é¢è¯´çš„æœ€ä¼˜äºŒå‰æ ‘的第一个æ¡ä»¶ã€?br />3.åªè¦å‰ä¸€æ¥æ˜¯æœ€ä¼˜äºŒå‰æ ‘åQŒç”±äºŽè¿™ä¸¤ä¸ªæ–°å¢žçš„节ç‚ÒŽ˜¯æœ€ž®çš„åQŒå³ä½¿åŒå±‚有其他节点åQŒä¹Ÿæ— 法和åŒå±‚其他节炚w‡æ–°ç»“åˆï¼Œäº§ç”Ÿæ¯”它们的父节ç‚ÒŽ›´ž®çš„上层节点æ¥å’ŒåŒå±‚的其他节点对æ¢ã€‚它们的父节点å°äºŽå…¶ä»–节点的父节点,它们åˆå°äºŽå…¶ä»–所有节点,åªè¦å‰ä¸€æ¥ç¬¦åˆæœ€ä¼˜äºŒå‰æ ‘的第二个æ¡äšgåQŒåˆ°˜q™ä¸€æ¥ä»ž®†ç¬¦åˆã€?br />
˜q™æ ·ä¸€æ¥æ¥é€†æŽ¨ä¸‹åŽ»åQŒåœ¨˜q™ä¸ª˜q‡ç¨‹ä¸éœå¤«æ›¼æ ‘æ¯ä¸€æ¥éƒ½å§‹ç»ˆä¿æŒç€æ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘ã€?br />
ç”׃ºŽæ¯ä¸€æ¥éƒ½ä»ŽèŠ‚ç‚¹åºåˆ—ä¸åˆ 除两个节点åQŒæ–°å¢žä¸€ä¸ªèŠ‚ç‚¹ï¼Œéœå¤«æ›¼æ ‘çš„å¾ç«‹è¿‡½E‹å…±éœ€ (原始节点æ•?- 1) æ¥ï¼Œæ‰€ä»¥éœå¤«æ›¼½Ž—法ä¸å¤±ä¸ÞZ¸€¿U精巧的¾~–ç å¼åŽ‹¾~©ç®—法ã€?br />
附:对于 huffman æ ‘ï¼Œã€Šè®¡½Ž—机½E‹åºè®¾è®¡è‰ºæœ¯ã€‹ä¸æœ‰å®Œå…¨ä¸åŒçš„è¯æ˜ŽåQŒå¤§æ„是˜q™æ ·çš„:
åQ‘.二剾~–ç æ ‘的内部节点åQˆéžå¶å节点åQ‰æ•°½{‰äºŽå¤–部节点åQˆå¶å节点)数å‡åQ‘ã€?br />åQ’.二剾~–ç æ ‘çš„å¤–éƒ¨èŠ‚ç‚¹çš„åŠ æƒèµ\径长度(å€ég¹˜ä»¥èµ\径长度)之和åQŒç‰äºŽæ‰€æœ‰å†…部节点å€ég¹‹å’Œã€‚(˜q™ä¸¤æ¡éƒ½å¯ä»¥é€šè¿‡å¯¹èŠ‚ç‚ÒŽ•°˜q用数å¦å½’纳法æ¥è¯æ˜ŽåQŒç•™¾l™å¤§å®¶åš¾lƒä¹ 。)
åQ“.å¯?huffman æ ‘çš„å»ºç«‹˜q‡ç¨‹˜q用逆推åQŒå½“åªæœ‰ä¸€ä¸ªå†…部节ç‚ÒŽ—¶åQŒè‚¯å®šæ˜¯ä¸€‹‚‰|œ€ä¼˜äºŒå‰æ ‘ã€?br />åQ”ï¼Žå¾€å‰æ¥˜q›ï¼Œæ–°å¢žä¸¤ä¸ªæœ€ž®çš„外部节点åQŒå®ƒä»¬ç»“åˆåœ¨ä¸€èµ·äñ”生一个新的内部节点,当且仅当原先的内部节炚w›†åˆæ˜¯æžå°åŒ–çš„åQŒåŠ å…¥è¿™ä¸ªæ–°çš„å†…éƒ¨èŠ‚ç‚¹åŽä»æ˜¯æžå°åŒ–çš„ã€‚ï¼ˆå› äØ“æœ€ž®çš„两个节点¾l“åˆåœ¨ä¸€èµøP¼Œòq¶å¤„于最低层åQŒç›¸å¯¹äºŽå®ƒä»¬åˆ†åˆ«å’Œå…¶ä»–åŒå±‚或上层节点¾l“åˆåœ¨ä¸€èµøP¼Œè‡›_°‘ä¸ä¼šå¢žåŠ åŠ æƒè·¯å¾„长度。)
åQ•.éšç€å†…部节点数é€ä¸ªå¢žåŠ åQŒå†…部节炚w›†åˆæ€È»´æŒæžž®åŒ–ã€?br />
[ 本帖ç”?ncs 最åŽç¼–辑于 2006-3-3 14:54 ]
æœçƒ¦æ›´å¤šç›¸å…³ä¸»é¢˜çš„帖å?
zip
原ç†
Â
  如果世界上从没有一个压¾~©ç¨‹åºï¼Œæˆ‘们看了å‰é¢çš„压¾~©åŽŸç†ï¼Œž®†æœ‰ä¿¡å¿ƒä¸€å®šèƒ½ä½œå‡ºä¸€ä¸ªå¯ä»¥åŽ‹¾~©å¤§å¤šæ•°æ ¼å¼ã€å†…容的数æ®çš„程åºï¼Œå½“æˆ‘ä»¬ç€æ‰‹è¦åšè¿™æ ·ä¸€ä¸ªç¨‹åºçš„æ—¶å€™ï¼Œä¼šå‘çŽ°æœ‰å¾ˆå¤šçš„éš¾é¢˜éœ€è¦æˆ‘们去一个个解决åQŒä¸‹é¢å°†é€ä¸ªæè¿°˜q™äº›éšùN¢˜åQŒåÆˆè¯¦ç»†åˆ†æž zip ½Ž—法是如何解册™¿™äº›éš¾é¢˜çš„åQŒå…¶ä¸å¾ˆå¤šé—®é¢˜å¸¦æœ‰æ™®éæ„义,比如查找匚w…åQŒæ¯”如数¾l„排åºç‰½{‰ï¼Œ˜q™äº›éƒ½æ˜¯è¯´ä¸ž®½çš„è¯é¢˜åQŒè®©æˆ‘们深入其ä¸åQŒåšä¸€ç•ªæ€è€ƒã€?br />
我们å‰é¢è¯´è¿‡åQŒå¯¹äºŽçŸè¯å¼é‡å¤åQŒæˆ‘们用“é‡å¤è·å½“å‰ä½ç½®çš„è·¼› Z€å’Œâ€œé‡å¤çš„长度â€è¿™ä¸¤ä¸ªæ•°å—æ¥è¡¨½Cø™¿™ä¸€ŒDµé‡å¤ï¼Œä»¥å®žçŽ°åŽ‹¾~©ï¼ŒçŽ°åœ¨é—®é¢˜æ¥äº†åQŒä¸€ä¸ªå—节能表示的数å—大ž®äØ“ 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š„压羃效果。例如跼›Õd– 15 ä½ï¼Œé•¿åº¦å?8 ä½ï¼Œ˜q™æ ·åQŒè·¼›Èš„æœ€å¤§å–å€égØ“ 32 k - 1åQŒé•¿åº¦çš„æœ€å¤§å–å€égØ“ 255åQŒè¿™ä¸¤ä¸ªæ•°å—å?23 ä½ï¼Œæ¯”三个å—节少一ä½ï¼Œæ˜¯ç¬¦åˆåŽ‹¾~©çš„è¦æ±‚çš„ã€‚è®©æˆ‘ä»¬åœ¨å¤´è„‘ä¸æƒŒ™±¡ä¸€ä¸?lz77 ½Ž—法压羃˜q›è¡Œæ—¶çš„æƒ…况åQŒä¼šå‡ºçŽ°æœ‰æ„æ€çš„æ¨¡åž‹åQ?br />
   最˜qœåŒ¹é…ä½¾|®ï¼åQžã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€å½“å‰å¤„ç†ä½ç½®åQ>
───┸─────────────────╂─────────────åQžåŽ‹¾~©è¿›è¡Œæ–¹å?br />   已压¾~©éƒ¨åˆ†ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€â”ƒã€€ã€€ã€€ã€€æœªåŽ‹¾~©éƒ¨åˆ?br />
  在最˜qœåŒ¹é…ä½¾|®å’Œå½“å‰å¤„ç†ä½ç½®ä¹‹é—´æ˜¯å¯ä»¥ç”¨æ¥æŸ¥æ‰‘ÖŒ¹é…的“å—å…¸â€åŒºåŸŸï¼Œéšç€åŽ‹ç¾ƒçš„è¿›è¡Œï¼Œâ€œå—å…¸â€åŒºåŸŸä»Žå¾…压¾~©æ–‡ä»¶çš„å¤´éƒ¨ä¸æ–地å‘åŽæ»‘动,直到辑ֈ°æ–‡äšg的尾部,çŸè¯å¼åŽ‹¾~©ä¹Ÿž®Þq»“æŸäº†ã€?br />  解压¾~©ä¹Ÿéžå¸¸½Ž€å•:
         ┎────────拯‚´â”€â”€â”€â”€â”€â”€â”€â”€â”?br /> 匚w…ä½ç½®ã€€ã€€ã€€ã€€â”ƒã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€å½“å‰å¤„ç†ä½ç½®ã€€ã€€â”?br />   ┃<──匚w…长度──åQžâ”ƒã€€ã€€ã€€ã€€ã€€ã€€ã€€â” ─────∨────â”?br />───┸──────────┸───────╂──────────┸─åQžè§£åŽ‹è¿›è¡Œæ–¹å?br />   已解压部分              ┃    未解压部åˆ?br />
ã€€ã€€ä¸æ–åœîC»ŽåŽ‹ç¾ƒæ–‡äšgä¸è¯»å‡ºåŒ¹é…ä½¾|®å€¼å’ŒåŒšw…长度å€û|¼ŒæŠŠå·²è§£åŽ‹éƒ¨åˆ†çš„åŒ¹é…内å®ÒŽ‹·è´åˆ°è§£åŽ‹æ–‡äšgž®ùNƒ¨åQŒé‡åˆ°åŽ‹¾~©æ–‡ä»¶ä¸é‚£äº›åŽ‹ç¾ƒæ—¶æœªèƒ½å¾—åˆ°åŒ¹é…,而是直接ä¿å˜çš„å•ã€åŒå—节åQŒè§£åŽ‹æ—¶åªè¦ç›´æŽ¥æ‹¯‚´åˆ°æ–‡ä»¶å°¾éƒ¨å³å¯ï¼Œç›´åˆ°æ•´ä¸ªåŽ‹ç¾ƒæ–‡äšg处ç†å®Œæ¯•ã€?br />  lz77½Ž—法模型也被¿UîCؓ“滑动å—å…¸â€æ¨¡åž‹æˆ–“滑动窗å£â€æ¨¡åž‹ã€?br />ã€€ã€€å¦æœ‰ä¸€¿Ulzw½Ž—法对待压羃文äšgä¸å˜åœ¨å¤§é‡ç®€å•匹é…的情况˜q›è¡Œäº†å®Œå…¨ä¸åŒçš„½Ž—法设计åQŒå®ƒåªç”¨ä¸€ä¸ªæ•°å—æ¥è¡¨ç¤ºä¸€ŒD늟è¯ï¼Œä¸‹é¢æ¥æ˜qîC¸€ä¸‹lzw的压¾~©è§£åŽ‹è¿‡½E‹ï¼Œç„¶åŽæ¥ç»¼åˆæ¯”较两者的适用情况ã€?br />  lzw的压¾~©è¿‡½E‹ï¼š
1) åˆå§‹åŒ–一个指定大ž®çš„å—å…¸åQŒæŠŠ 256 ¿Uå—节å–å€¼åŠ å…¥å—å…¸ã€?br />2) 在待压羃文äšg的当å‰å¤„ç†ä½¾|®å¯»æ‰‘Öœ¨å—å…¸ä¸å‡ºçŽ°çš„æœ€é•¿åŒ¹é…,输出该匹é…在å—å…¸ä¸çš„åºå·ã€?br />3) 如果å—典没有辑ֈ°æœ€å¤§å®¹é‡ï¼ŒæŠŠè¯¥åŒšw…åŠ ä¸Šå®ƒåœ¨å¾…åŽ‹¾~©æ–‡ä»¶ä¸çš„下一个å—èŠ‚åŠ å…¥å—å…¸ã€?br />4) 把当å‰å¤„ç†ä½¾|®ç§»åˆ°è¯¥åŒšw…åŽã€?br />5) é‡å¤ 2ã€?ã€? 直到文äšg输出完毕ã€?br />
  lzw 的解压过½E‹ï¼š
1) åˆå§‹åŒ–一个指定大ž®çš„å—å…¸åQŒæŠŠ 256 ¿Uå—节å–å€¼åŠ å…¥å—å…¸ã€?br />2) 从压¾~©æ–‡ä»¶ä¸™åºåºè¯Õd‡ºä¸€ä¸ªå—å…¸åºåøP¼Œæ ÒŽ®è¯¥åºåøP¼ŒæŠŠå—å…æ€¸ç›¸åº”çš„æ•°æ®æ‹·è´åˆ°è§£åŽ‹æ–‡äšgž®ùNƒ¨ã€?br />3) 如果å—典没有辑ֈ°æœ€å¤§å®¹é‡ï¼ŒæŠŠå‰ä¸€ä¸ªåŒ¹é…å†…å®¹åŠ ä¸Šå½“å‰åŒ¹é…çš„½W¬ä¸€ä¸ªå—èŠ‚åŠ å…¥å—å…¸ã€?br />4) é‡å¤ 2ã€? 两æ¥ç›´åˆ°åŽ‹ç¾ƒæ–‡äšg处ç†å®Œæ¯•ã€?br />
  ä»?lzw 的压¾~©è¿‡½E‹ï¼Œæˆ‘们å¯ä»¥å½’纳出它ä¸åŒäº?lz77 ½Ž—法的一些主è¦ç‰¹ç‚¹ï¼š
1) 对于一ŒD늟è¯ï¼Œå®ƒåªè¾“出一个数å—,å›_—å…æ€¸çš„åºå—÷€‚(˜q™ä¸ªæ•°å—çš„ä½æ•°å†³å®šäº†å—典的最大容é‡ï¼Œå½“å®ƒçš„ä½æ•°å–得太大时åQŒæ¯”å¦?24 ä½ä»¥ä¸Šï¼Œå¯¹äºŽçŸåŒ¹é…å 多数的情况,压羃率å¯èƒ½å¾ˆä½Žã€‚å–得太ž®æ—¶åQŒæ¯”å¦?8 ä½ï¼Œå—典的容é‡å—到é™åˆ¶ã€‚æ‰€ä»¥åŒæ ·éœ€è¦å–èˆã€‚)
2) 对于一个çŸè¯ï¼Œæ¯”如 abcd åQŒå½“它在待压¾~©æ–‡ä»¶ä¸½W¬ä¸€‹Æ¡å‡ºçŽ°æ—¶åQŒab è¢«åŠ å…¥å—典,½W¬äºŒ‹Æ¡å‡ºçŽ°æ—¶åQŒabc è¢«åŠ å…¥å—典,½W¬ä¸‰‹Æ¡å‡ºçŽ°æ—¶åQŒabcd æ‰ä¼šè¢«åŠ å…¥å—典,对于一些长匚w…åQŒå®ƒå¿…须高频率地出现åQŒåƈ且å—典有较大的容é‡ï¼Œæ‰ä¼šè¢«æœ€¾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 的公开æºä»£ç äØ“åŸºç¡€çš„ï¼Œå¦‚æžœéœ€è¦å®Œæ•´çš„代ç åQŒå¯ä»¥åœ¨ gzip 的官方网ç«?www.gzip.org 下è²ã€‚ä¸‹é¢æåˆ°çš„æ¯ä¸€ä¸ªé—®é¢˜ï¼Œéƒ½é¦–先介¾l最直观½Ž€å•的解决æ–ÒŽ³•åQŒç„¶åŽæŒ‡å‡ø™¿™¿U方法的弊端所在,最åŽä»‹¾l?gzip é‡‡ç”¨çš„åšæ³•,˜q™æ ·ä¹Ÿè®¸èƒ½ä‹É读者对 gzip çœ‹ä¼¼å¤æ‚ã€ä¸ç›´è§‚çš„åšæ³•çš„æ„义有更好的ç†è§£ã€‚)
最直观的æœç´¢æ–¹å¼æ˜¯™åºåºæœçƒ¦åQšä»¥å¾…压¾~©éƒ¨åˆ†çš„½W¬ä¸€ä¸ªå—节与½H—å£ä¸çš„æ¯ä¸€ä¸ªå—节例ơ比较,当找åˆîC¸€ä¸ªç›¸½{‰çš„å—节æ—Óž¼Œå†æ¯”较厾lçš„å—节…â€?é历了窗å£åŽå¾—出最长匹é…。gzip 用的是被¿UîC½œâ€œå“ˆå¸Œè¡¨â€çš„æ–ÒŽ³•æ¥å®žçŽ°è¾ƒé«˜æ•ˆçš„æœç´¢ã€‚“哈希(hashåQ‰â€æ˜¯åˆ†æ•£çš„æ„æ€ï¼ŒæŠŠå¾…æœçƒ¦çš„æ•°æ®æŒ‰ç…§å—节值分散到一个个“桶â€ä¸åQŒæœç´¢æ—¶å†æ ¹æ®å—节值到相应的“桶â€ä¸åŽÕd¯»æ‰¾ã€‚çŸè¯å¼åŽ‹ç¾ƒçš„æœ€çŸåŒ¹é…䨓 3 个å—节,gzip ä»?3 个å—节的å€ég½œä¸ºå“ˆå¸Œè¡¨çš„烦引,ä½?3 个å—节共æœ?2 çš?24 ‹Æ¡æ–¹¿Uå–å€û|¼Œéœ€è¦?16M 个桶åQŒæ¡¶é‡Œå˜æ”„¡š„是窗å£ä¸çš„ä½¾|®å€û|¼Œ½H—å£çš„大ž®äØ“ 32KåQŒæ‰€ä»¥æ¯ä¸ªæ¡¶è‡›_°‘è¦æœ‰å¤§äºŽä¸¤ä¸ªå—节的空é—ß_¼Œå“ˆå¸Œè¡¨å°†å¤§äºŽ 32MåQŒä½œä¸?90 òq´ä»£å¼€å‘çš„½E‹åºåQŒè¿™ä¸ªè¦æ±‚是太大了,而且éšç€½H—å£çš„移动,哈希表里的数æ®ä¼šä¸æ–˜q‡æ—¶åQŒç»´æŠ¤è¿™ä¹ˆå¤§çš„表åQŒä¼šé™ä½Ž½E‹åºçš„æ•ˆçŽ‡ï¼Œgzip å®šä¹‰å“ˆå¸Œè¡¨äØ“ 2 çš?15 ‹Æ¡æ–¹åQ?2KåQ‰ä¸ªæ¡Óž¼Œòq¶è®¾è®¡äº†ä¸€ä¸ªå“ˆå¸Œå‡½æ•°æŠŠ 16M ¿Uå–值对应到 32K 个桶ä¸ï¼Œä¸åŒçš„倯D¢«å¯¹åº”到相åŒçš„æ¡¶ä¸æ˜¯ä¸å¯é¿å…çš„åQŒå“ˆå¸Œå‡½æ•°çš„ä»ÕdŠ¡æ˜?1.使儿Uå–值尽å¯èƒ½å‡åŒ€åœ°åˆ†å¸ƒåˆ°å„个桶ä¸åQŒé¿å…许多ä¸åŒçš„值集ä¸åˆ°æŸäº›æ¡¶ä¸åQŒè€Œå¦ä¸€äº›æ˜¯½Iºæ¡¶åQŒä‹Éæœçƒ¦çš„æ•ˆçއé™ä½Žã€?.函数的计½Ž—å°½å¯èƒ½åœ°ç®€å•ï¼Œå› äØ“æ¯æ¬¡â€œæ’å…¥â€å’Œâ€œæœå¯ Z€å“ˆå¸Œè¡¨éƒ½è¦æ‰§è¡Œå“ˆå¸Œå‡½æ•°åQŒå“ˆå¸Œå‡½æ•°çš„夿‚度直接媄å“程åºçš„æ‰§è¡Œæ•ˆçއåQŒå®¹æ˜“æƒ³åˆ°çš„å“ˆå¸Œå‡½æ•°æ˜¯å– 3 个å—节的左边åQˆæˆ–匙¾¹åQ?5 ä½äºŒ˜q›åˆ¶å€û|¼Œä½†è¿™æ ·åªè¦å·¦è¾¹ï¼ˆæˆ–å³è¾¹ï¼‰2 个å—节相åŒï¼Œž®×ƒ¼šè¢«æ”¾åˆ°åŒä¸€ä¸ªæ¡¶ä¸ï¼Œè€?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ˆè¯´æ˜Žï¼šA æŒ?3 个å—节ä¸çš„第 1 个å—节,B 指第 2 个å—节,C 指第 3 个å—节,A(4,5) 指第一个å—节的½W?4,5 ä½äºŒ˜q›åˆ¶ç ,“^â€æ˜¯äºŒè¿›åˆ¶ä½çš„异或æ“作,â€?â€æ˜¯â€œè¿žæŽ¥â€è€Œä¸æ˜¯â€œåŠ â€ï¼Œâ€œ^â€ä¼˜å…ˆäºŽâ€?â€ï¼‰˜q™æ ·ä½?3 个å—节都ž®½é‡â€œå‚与â€åˆ°æœ€åŽçš„¾l“æžœä¸æ¥åQŒè€Œä¸”æ¯ä¸ª¾l“æžœå€?h 都ç‰äº?((å‰?个h << 5) ^ c)å–å³ 15 ä½ï¼Œè®¡ç®—也还½Ž€å•ã€?
哈希表的具体实现也值得探讨,å› äØ“æ— æ³•é¢„å…ˆçŸ¥é“æ¯ä¸€ä¸ªâ€œæ¡¶â€ä¼šå˜æ”¾å¤šå°‘ä¸ªå…ƒç´ ï¼Œæ‰€ä»¥æœ€½Ž€å•çš„åQŒä¼šæƒ›_ˆ°ç”¨é“¾è¡¨æ¥å®žçްåQšå“ˆå¸Œè¡¨é‡Œå˜æ”„¡€æ¯ä¸ªæ¡¶çš„½W¬ä¸€ä¸ªå…ƒç´ ,æ¯ä¸ªå…ƒç´ é™¤äº†å˜æ”¾ç€è‡ªèínçš„å€û|¼Œ˜q˜å˜æ”„¡€ä¸€ä¸ªæŒ‡é’ˆï¼ŒæŒ‡å‘åŒä¸€ä¸ªæ¡¶ä¸çš„ä¸‹ä¸€ä¸ªå…ƒç´ ï¼Œå¯ä»¥™åºç€æŒ‡é’ˆé“¾æ¥é历该桶ä¸çš„æ¯ä¸€ä¸ªå…ƒç´ ï¼Œæ’å…¥å…ƒç´ æ—Óž¼Œå…ˆç”¨å“ˆå¸Œå‡½æ•°½Ž—å‡ºè¯¥æ”¾åˆ°ç¬¬å‡ ä¸ªæ¡¶ä¸åQŒå†æŠŠå®ƒæŒ‚到相应链表的最åŽã€‚这个方案的¾~ºç‚¹æ˜¯é¢‘¾J地甌™¯·å’Œé‡Šæ”‘Ö†…å˜ä¼šé™ä½Ž˜q行速度åQ›å†…å˜æŒ‡é’ˆçš„å˜æ”¾å æ®äº†é¢å¤–的内å˜å¼€é”€ã€‚有更少内å˜å¼€é”€å’Œæ›´å¿«é€Ÿçš„æ–ÒŽ³•æ¥å®žçŽ°å“ˆå¸Œè¡¨åQŒåƈ且ä¸éœ€è¦é¢‘¾J的内å˜ç”Œ™¯·å’Œé‡Šæ”¾ï¼š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]ä¸äØ“ 0åQ‰ï¼Œpre[]ä¸çš„æ‰€æœ‰ä½¾|®ä¸ŽåŽŸå§‹æ•°æ®çš„ä½¾|®ç›¸å¯¹åº”åQŒä½†æ¯ä¸€ä¸ªä½¾|®ä¿å˜çš„值是å‰ä¸€ä¸ªæœ€˜q‘çš„å¯èƒ½çš„匹é…çš„ä½ç½®ã€‚(“å¯èƒ½çš„匚w…â€æ˜¯æŒ‡å“ˆå¸Œå‡½æ•°è®¡½Ž—出çš?ins_h 相åŒã€‚)™åºç€ pre[] ä¸çš„æŒ‡ç¤ºæ‰¾ä¸‹åŽ»ï¼Œç›´åˆ°é‡åˆ° 0åQŒå¯ä»¥å¾—到所有匹é…在原始数æ®ä¸çš„ä½ç½®åQ? 表示ä¸å†æœ‰æ›´˜qœçš„匚w…ã€?br />  接下æ¥å¾ˆè‡ªç„¶åœ°è¦è§‚察 gzip 具体是如何判æ–å“ˆå¸Œè¡¨ä¸æ•°æ®çš„˜q‡æ—¶åQŒå¦‚何清ç†å“ˆå¸Œè¡¨çš„ï¼Œå› äØ“ pre[] 里åªèƒ½å˜æ”?32K ä¸ªå…ƒç´ ï¼Œæ‰€ä»¥è¿™™å¹å·¥ä½œæ˜¯å¿…é¡»è¦åšçš„ã€?br />  gzip 从原始文件ä¸è¯Õd‡ºä¸¤ä¸ª½H—å£å¤§å°çš„内容(å…?64K å—节åQ‰åˆ°ä¸€å—内å˜ä¸åQŒè¿™å—内å˜ä¹Ÿæ˜¯ä¸€ä¸ªæ•°¾l„,¿UîC½œ Window[]åQ›ç”³è¯?head[]ã€pre[] òq¶æ¸…é›Óž¼›strstart ¾|®äØ“ 0。然å?gzip è¾ÒŽœç´¢è¾¹æ’å…¥åQŒæœç´¢æ—¶é€šè¿‡è®¡ç®— ins_håQŒæ£€æŸ?head[] 䏿˜¯å¦æœ‰åŒšw…åQŒå¦‚果有匚w…åQŒåˆ¤æ–?strstart å‡?head[] ä¸çš„ä½ç½®æ˜¯å¦å¤§äºŽ 1 个窗å£çš„大å°åQŒå¦‚果大äº?1 个窗å£çš„大å°åQŒå°±ä¸åˆ° pre[] ä¸åŽ»æœçƒ¦äº†ï¼Œå› 䨓 pre[] ä¸ä¿å˜çš„ä½ç½®æ›´è¿œäº†ï¼Œå¦‚æžœä¸å¤§äºŽï¼Œž®±é¡ºç€ pre[] 的指½Cºåˆ° Window[] ä¸é€ä¸ªåŒšw…ä½ç½®å¼€å§‹ï¼Œé€ä¸ªå—节与当å‰ä½¾|®çš„æ•°æ®æ¯”较åQŒä»¥æ‰‘Ö‡ºæœ€é•¿åŒ¹é…,pre[] ä¸çš„ä½ç½®ä¹Ÿè¦åˆ¤æ–是妑…出一个窗å£ï¼Œå¦‚é‡åˆ°è¶…å‡ÞZ¸€ä¸ªçª—å£çš„ä½ç½®æˆ–è€?0 ž®×ƒ¸å†æ‰¾ä¸‹åŽ»åQŒæ‰¾ä¸åˆ°åŒšw…ž®Þp¾“出当å‰ä½¾|®çš„å•个å—节到å¦å¤–的内å˜åQˆè¾“å‡ºæ–¹æ³•åœ¨åŽæ–‡ä¸ä¼šä»‹ç»åQ‰ï¼Œòq¶æŠŠ strstart æ’入哈希表,strstart 递增åQŒå¦‚果找åˆîCº†åŒšw…åQŒå°±è¾“出匚w…ä½ç½®å’ŒåŒ¹é…长度这两个数å—到å¦å¤–的内å˜ä¸ï¼Œòq¶æŠŠ strstart 开始的åQŒç›´åˆ?strstart + 匚w…长度 为æ¢çš„æ‰€æœ‰ä½¾|®éƒ½æ’入哈希表,strstart += 匚w…长度。æ’å…¥å“ˆå¸Œè¡¨çš„æ–¹æ³•äØ“åQ?br />pre[strstart % 32K] = head[ins_h];
head[ins_h] = strstart;
å¯ä»¥çœ‹å‡ºåQŒpre[] 是åó@环利用的åQŒæ‰€æœ‰çš„ä½ç½®éƒ½åœ¨ä¸€ä¸ªçª—å£ä»¥å†…,但æ¯ä¸€ä¸ªä½¾|®ä¿å˜çš„å€ég¸ä¸€å®šæ˜¯ä¸€ä¸ªçª—å£ä»¥å†…的。在æœçƒ¦æ—Óž¼Œhead[] å’?pre[] ä¸çš„ä½ç½®å€¼å¯¹åº”到 pre[] 时也è¦?% 32K。当 Window[] ä¸çš„原始数殞®†è¦å¤„ç†å®Œæ¯•æ—Óž¼Œè¦æŠŠ Window[] ä¸åŽä¸€½H—的数æ®å¤åˆ¶åˆ°å‰ä¸€½H—,å†è¯»å?32K å—节的数æ®åˆ°åŽä¸€½H—,strstart -= 32KåQŒéåŽ?head[]åQŒå€¼å°äºŽç‰äº?32K 的,¾|®äØ“ 0åQŒå¤§äº?32K 的,-= 32KåQ›pre[] å?head[] ä¸€æ ·å¤„ç†ã€‚ç„¶åŽåŒå‰é¢ä¸€æ ·å¤„ç†æ–°ä¸€½H—的数æ®ã€?br />  分æžåQšçŽ°åœ¨å¯ä»¥çœ‹åˆŽÍ¼Œè™½ç„¶ 3 个å—节有 16M ¿Uå–å€û|¼Œä½†å®žé™…上一个窗å£åªæœ?32K 个å–å€¼éœ€è¦æ’入哈希表åQŒç”±äºŽçŸè¯å¼é‡å¤çš„å˜åœ¨ï¼Œå®žé™…åªæœ‰ < 32K ¿Uå–值æ’入哈希表çš?32K 个“桶â€ä¸åQŒè€Œä¸”哈希函数åˆç¬¦åˆâ€œåã^å‡åˆ†å¸ƒâ€çš„è¦æ±‚åQŒæ‰€ä»¥å“ˆå¸Œè¡¨ä¸å®žé™…å˜åœ¨çš„“冲½Hâ€ä¸€èˆ¬ä¸ä¼šå¤šåQŒå¯¹æœçƒ¦æ•ˆçŽ‡çš„åª„å“ä¸å¤§ã€‚å¯ä»¥é¢„计,在“一般情况â€ä¸‹åQŒæ¯ä¸ªâ€œæ¡¶â€ä¸å˜æ”¾çš„æ•°æ®ï¼Œæ£æ˜¯æˆ‘ä»¬è¦æ‰¾çš„。哈希表在儿Uæœç´¢ç®—法ä¸åQŒå®žçŽ°ç›¸å¯¹çš„æ¯”è¾ƒ½Ž€å•,å®ÒŽ˜“ç†è§£åQŒâ€œåã^凿œç´¢é€Ÿåº¦â€æœ€å¿«ï¼Œå“ˆå¸Œå‡½æ•°çš„设计是æœçƒ¦é€Ÿåº¦çš„关键,åªè¦½W¦åˆâ€œåã^å‡åˆ†å¸ƒâ€å’Œâ€œè®¡½Ž—简å•â€ï¼Œž®±å¸¸å¸¸èƒ½æˆäØ“è¯¸ç§æœçƒ¦½Ž—法ä¸çš„首选,所以哈希表是最‹¹è¡Œçš„一¿Uæœç´¢ç®—法。但在æŸäº›ç‰¹ŒDŠæƒ…况下åQŒå®ƒä¹Ÿæœ‰¾~ºç‚¹åQŒæ¯”如:1.当键ç ?k ä¸å˜åœ¨æ—¶åQŒè¦æ±‚找出å°äº?k çš„æœ€å¤§é”®ç æˆ–大于 k 的最ž®é”®ç ï¼Œå“ˆå¸Œè¡¨æ— æ³•æœ‰æ•ˆçŽ‡åœ°æ»¡‘Œ™¿™¿Uè¦æ±‚ã€?.哈希表的“åã^凿œç´¢é€Ÿåº¦â€æ˜¯å»ºç«‹åœ¨æ¦‚率论的基¼‹€ä¸Šçš„åQŒå› ä¸ÞZº‹å…ˆä¸èƒ½é¢„知待æœçƒ¦çš„æ•°æ®é›†åˆï¼Œæˆ‘们åªèƒ½â€œä¿¡èµ–â€æœç´¢é€Ÿåº¦çš„“åã^å‡å€¼â€ï¼Œè€Œä¸èƒ½â€œä¿è¯â€æœç´¢é€Ÿåº¦çš„“上é™â€ã€‚在åŒäh¾cÀL€§å‘½æ”¸å…³çš„应用ä¸åQˆå¦‚åŒÈ–—或宇航领域)åQŒå°†æ˜¯ä¸åˆé€‚的。这些情况åŠå…¶ä»–一些特ŒDŠæƒ…况下åQŒæˆ‘们必™åÀL±‚助其他“åã^å‡é€Ÿåº¦â€è¾ƒä½Žï¼Œä½†èƒ½æ»¡èƒö相应的特ŒDŠè¦æ±‚çš„½Ž—法。(è§ã€Šè®¡½Ž—机½E‹åºè®¾è®¡è‰ºæœ¯ã€‹ç¬¬3å?排åºä¸ŽæŸ¥æ‰¾ï¼‰ã€‚幸而“在½H—å£ä¸æœç´¢åŒ¹é…å—节串â€ä¸å±žäºŽç‰Òޮпƒ…况ã€?br />
æ—‰™—´ä¸ŽåŽ‹¾~©çŽ‡çš„åã^衡:
gzip å®šä¹‰äº†å‡ ¿Uå¯ä¾›é€‰æ‹©çš?levelåQŒè¶Šä½Žçš„ level 压羃旉™—´‘Šå¿«ä½†åŽ‹¾~©çއ‘Šä½ŽåQŒè¶Šé«˜çš„ level 压羃旉™—´‘Šæ…¢ä½†åŽ‹¾~©çއ‘Šé«˜ã€?br />ä¸åŒçš?level 对下é¢å››ä¸ªå˜é‡æœ‰ä¸åŒçš„å–å€û|¼š
nice_length
max_chain
max_lazy
good_length
nice_lengthåQšå‰é¢è¯´˜q‡ï¼Œæœçƒ¦åŒš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 会去找下一个佾|®ï¼ˆstrstart + 1åQ‰çš„匚w…åQŒå¦‚果下一个匹é…的长度比当å‰åŒ¹é…的长度更长åQŒgzip ž®±æ”¾å¼ƒå½“å‰åŒ¹é…,åªè¾“出当å‰ä½¾|®å¤„的首个å—节,然åŽå†æŸ¥æ‰?strstart + 2 处的匚w…åQŒè¿™æ ïLš„æ–¹å¼ä¸€ç›´å¾€åŽæ‰¾å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Œå°±æ²¡æœ‰å¿…è¦ä½œæ‡’惰匹é…ï¼Œå› äØ“è¾“å‡ºçš„æ€À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. å†è§‚å¯Ÿè¿™æ ·ä¸€ä¸ªä¾‹å:
1232345145678[当å‰ä½ç½®]12345678
ä¸ç”¨æ‡’惰匚w…åQŒçº¦è¾“出6å—节åQŒç”¨æ‡’惰匚w…åQŒçº¦è¾“出7å—节åQŒç”±äºŽä‹É用了懒惰匚w…åQŒæŠŠæ›´åŽé¢çš„ä¸€ä¸ªåŒ¹é…æ‹†æˆäº†ä¸¤ä¸ªåŒšw…。(如果 678 æ£å¥½èƒ½å½’å…¥å†åŽé¢çš„一个匹é…,那懒惰匹é…å¯èƒ½æ˜¯æœ‰ç›Šçš„。)
7. ¾l¼åˆè€ƒè™‘å„ç§å› ç´ åQˆåŒ¹é…数和未匚w…çš„å•åŒå—节在原始文äšg䏿‰€å 的比例åQŒåŽä¸€ä¸ªåŒ¹é…长度大于å‰ä¸€ä¸ªåŒ¹é…长度的概率åQŒç‰½{‰ï¼‰åQŒç»˜q‡æ”¹˜q›çš„æ‡’惰匚w…½Ž—法åQŒå¯¹æ€Èš„压羃率å³ä½¿æœ‰è´¡çŒ®åQŒä¹Ÿä»æ˜¯å¾ˆå°çš„,而且也ä»ç„¶å¾ˆæœ‰å¯èƒ½ä¼šé™ä½ŽåŽ‹ç¾ƒçŽ‡ã€‚å†è€ƒè™‘到时间的¼‹®å®šçš„æ˜Žæ˜„¡š„å¢žåŠ ä¸ŽåŽ‹¾~©çŽ‡çš„ä¸¼‹®å®šçš„å¾®å¼Þqš„增益åQŒä¹Ÿè®¸æœ€å¥½çš„æ”¹è¿›æ˜¯æžœæ–地攑ּƒæ‡’惰匚w…ã€?/div>
Â
¾~–ç å¼åŽ‹¾~©çš„å‡ ç‚¹è€ƒè™‘åQ?br />1. huffman ½Ž—法压羃率的关键是å„节点值的差异è¦å¤§åQŒè¿™æ ·å°±è¦æ±‚分段¾~–ç è¾“å‡ºã€‚å› ä¸ºæŸäº›æ®µè½ä¸æŸäº›èŠ‚ç‚¹çš„å‡ºçŽ°é¢‘çŽ‡è¾ƒé«˜ï¼Œå¦ä¸€äº›æ®µè½ä¸˜q™äº›èŠ‚ç‚¹å‡ºçŽ°é¢‘çŽ‡è¾ƒä½ŽåQŒå¦‚æžœä¸åˆ†æ®µè¾“出åQŒé¢‘çŽ‡çš„å·®å¼‚ä¼šè¢«å½¼æ¤æŠ‰|¶ˆåQŒè€Œä¸åŒæ®µè½ä¸åQŒèŠ‚ç‚¹çš„å‡ºçŽ°é¢‘çŽ‡ä¸åŒæ˜¯å¸¸æœ‰çš„ã€?br />  è¦å†³å®šåˆ†ŒD늚„大å°åQŒå¿…™å»è§£å†³ä¸€å¯¹çŸ›ç›¾ï¼šä¸Šé¢çš„分æžä¼¼ä¹Žè¦æ±‚段è½è¶Šž®è¶Šå¥½ï¼Œä½†ç”±äºŽè¦ä¿å˜ç 表以对 huffman 压羃¾l“æžœ˜q›è¡Œè§£åŽ‹åQŒæ¯ä¸ªæ®µè½éƒ½è¦ä¿å˜ä¸€ä»½ä¸åŒçš„ç 表åQŒæ‰€ä»¥æ®µè½å–得太ž®ï¼Œä¿å˜äº†ç 表åŽå¾—ä¸å¿å¤±åQŒè¿™æ øP¼Œä¼ég¹Žåˆè¦æ±‚段è½è¦ž®½é‡å¤§ï¼Œä½¿ç 表的ä¿å˜ä»½æ•°ž®½é‡ž®‘ã€?br />  gzip 采å–了这æ ïLš„½{–ç•¥æ¥ç¡®å®šæ®µè½çš„大å°åQšlz77 压羃æ¯äñ”ç”?4kåQˆå°åQ‰çš„æ•°æ®åQŒå°±åˆ¤æ–现在å¯ÒŽœª¾~–ç 部分˜q›è¡Œ¾~–ç 输出是å¦åˆé€‚,最多积压到 32kåQˆå¤§åQ‰çš„æ—¶å€™ï¼Œå¿…定˜q›è¡Œå¼ºåˆ¶è¾“出åQŒå› 为åã^庸的数殿U¯åŽ‹å¾—å¤ªå¤šï¼ŒåŽé¢å³ä‹É有好的数æ®ï¼Œé¢‘率¾lŸè®¡åœ¨ä¸€èµøP¼Œä¹Ÿä¼šè¢«åã^庸化ã€?br />  判æ–当å‰è¾“出åˆé€‚与å¦çš„æ¡äšg是:1)用预先设定好的å„节点长度和å„节点实际的出现次敎ͼŒè®¡ç®—压羃¾l“果的大概å€û|¼Œçœ‹è¿™ä¸ªå€¼æ˜¯å¦å°äºŽæœªåŽ‹ç¾ƒæ—¶çš„ 1/2ã€?)看目å‰äØ“æ¢çš„匚w…数是å¦å°äºŽæœªåŒšw…çš„å—节数åQŒå› ä¸?lz77 压羃产生的数æ®åŒ…括“匹é…â€å’Œâ€œæœªåŒšw…的原始å—节â€ï¼ŒŒDµè½é—´çš„节点频率差异主è¦ä½“现在“未匚w…的原始å—节â€ä¸ã€?br />  上é¢çš„判æ–åªæ˜¯ä¸€¿U“猜‹¹‹â€ï¼ŒçœŸæ£çš„ç²¾¼‹®çš„计算需è¦èбè´ÒŽ›´å¤šçš„æ—‰™—´ã€?br />  我觉å¾?gzip çš„ç–ç•¥å¯ä»¥æ”¹˜q›ï¼Œæˆ‘çš„½{–略是:1)输出的时机是压羃率的关键之一åQŒçŽ°åœ¨è®¡½Ž—机的速度和ä¹å年代时已ç»ä»Šéžæ˜”比åQŒçŽ°åœ¨å®Œå…¨æœ‰æ¡äšg采用真æ£çš„å¾ huffman æ ‘çš„æ–ÒŽ³•得到å„节点的ç é•¿åQŒä½œ¾_„¡¡®çš„判æ–ã€?)ä¸åº”该与未压¾~©çš„åŽŸå§‹æ•°æ®æ¯”较åQŒè€Œåº”该与 lz77 è¾“å‡ºçš„æ•°æ®æ¯”较,å¦åˆ™è®¡ç®—出的压羃比很大一部分是çŸè¯å¼åŽ‹ç¾ƒçš„åŠŸåŠŸë€?)ç”׃ºŽé‡‡ç”¨äº†çœŸæ£çš„å»?huffman æ ‘çš„æ–ÒŽ³•åQŒä¸ç”¨å†åŽÕdšåŒšw…æ•îC¸ŽæœªåŒ¹é…çš„å—节数的比较åQŒå› ä¸ºé‚£åªæ˜¯ä¸€¿U猜‹¹‹ã€?)æ¯?4k 的数æ®éƒ½å•独¾lŸè®¡é¢‘率åQŒå¦‚果是åˆé€‚çš„åQŒå°±å…ˆè¾“å‡ÞZ¹‹å‰çš„¿U¯åŽ‹åQˆå¦‚果有的è¯åQ‰ï¼Œå†è¾“出当å‰çš„ 4kåQŒè¿™æ ·å¯ä»¥é¿å…当å‰çš„æ•°æ®è¢«ç§¯åŽ‹çš„æ•°æ®òq›_º¸åŒ–。如果ä¸åˆé€‚,ž®±æŠŠå½“å‰çš„频率归入到¿U¯åŽ‹çš„æ•°æ®ï¼ˆå¦‚果有)的频率ä¸åQŒå†åˆ¤æ–是å¦åˆé€‚,如ä»ä¸åˆé€‚就暂缓输出åQŒå¦åˆ™ä¸€èµ¯‚¾“出,˜q™å’Œ gzip 的作法是一æ ïLš„ã€‚è¯´æ˜Žï¼šå‡ æ®µå·®çš„æ•°æ®¿U¯åŽ‹åˆîC¸€èµ·ä»æœ‰å¯èƒ½æˆä¸ºå¥½çš„æ•°æ®ï¼Œæ¯”如 01ã€?02ã€â€¦â€¦ç§¯åŽ‹åœ¨ä¸€èµøP¼Œ0 çš„é¢‘çŽ‡é€æ¸é«˜å‡ºäº†å…¶ä»–å—节ã€?)如果愿æ„付出更多的时é—ß_¼Œåœ¨æŠŠå½“å‰çš„频率归入之å‰çš„频率æ—Óž¼Œå¯ä»¥å…ˆå’Œä¹‹å‰ 4k 的频率åˆòqÓž¼Œå¦‚æžœä¸åˆé€‚,和之å‰?8k 的频率åˆòqÓž¼Œ˜q™æ ·é€æ¸å¾€å‰åˆòq?4kåQŒé¿å…å‰é¢ä¸å¥½çš„æ•°æ®æ‹–ç¯åˆåƈåŽçš„好的数æ®ã€?)有了å‰é¢çš„æœºåˆÓž¼Œ32k 的强制输出点å¯ä»¥å–消ã€?)˜q›ä¸€æ¥çš„æ”¹è¿›åQšå½“è¦è¾“出时åQŒåªè¾“出¿U¯åŽ‹çš„ä¸å¥½çš„部分åQŒå¥½çš„æ•°æ®å…ˆç•™ç€åQŒç‰åŽé¢çš?4kåQŒå¦‚æžœæ–°çš„åŠ å…¥åŽåQŒä»æ˜¯å¥½çš„æ•°æ®ï¼Œž®±å†½{‰ï¼Œå¦‚果会é™ä½ŽåŽ‹¾~©çއåQŒæ‰è¾“å‡ºå¥½çš„éƒ¨åˆ†ã€‚è¿™æ øP¼Œè®©å¥½çš„æ•°æ®å¤§ŒD늚„输出åQŒå¯ä»¥å‡ž®‘ç 表的ä¿å˜ä»½æ•°ã€?)å†è¿›ä¸€æ¥çš„æ”¹è¿›åQšåçš„æ•°æ®æ”¾åœ¨ä¸€èµ·å¯èƒ½ä¼šæé«˜åŽ‹ç¾ƒçŽ‡ï¼Œå¥½çš„æ•°æ®æ”‘Öœ¨ä¸€èµ·ä¹Ÿå¯èƒ½æ›´å¥½åQŒå½“ç„Óž¼Œä¸¤ç§æƒ…况也都有å¯èƒ½é™ä½ŽåŽ‹¾~©çއåQŒæ‰€ä»¥å‰é¢åˆ¤æ–“好â€è¿˜æ˜¯â€œä¸å¥½â€ï¼Œâ€œåˆé€‚â€è¿˜æ˜¯â€œä¸åˆé€‚â€çš„æ ‡å‡†åº”该从æŸä¸€ä¸ªå›ºå®šçš„åŽ‹ç¾ƒçŽ‡æ ‡å‡†æ”¹å˜äØ“åQšæé«˜äº†åŽ‹ç¾ƒçŽ‡è¿˜æ˜¯é™ä½Žäº†åŽ‹ç¾ƒçŽ‡ã€‚ï¼ˆæé«˜çš„幅度应该至ž®‘抵消多ä¿å˜ä¸€ä»½ç 表的æŸå¤±åQ›é™ä½Žçš„òq…度也应该至ž®‘抵消少ä¿å˜ä¸€ä»½ç 表的得益åQ?)¾l¼åˆå‰é¢çš„分æžï¼Œ¼‹®å®šåˆ†æ®µå¤§å°çš„ç–略最¾lˆè°ƒæ•´äØ“åQšå½“新的数æ®å’Œå‰é¢çš„æœªåˆ‡åˆ†æ•°æ®æ”¾åœ¨ä¸€èµäh—¶åQŒä¸¤è€…ä¸ä»ÖM½•一方å—到æŸå¤±ï¼Œéƒ½åº”该设¾|®åˆ‡åˆ†ç‚¹åQŒç§¯ç´¯äº†ä¸¤ä¸ªåˆ†æ®µåŽï¼Œé€šè¿‡è®¡ç®—åQŒå½“切分带æ¥çš„æ”¶ç›Šå¤§äºŽå°‘ä¿å˜ä¸€ä»½ç 表时åQŒæ‰è¾“出å‰ä¸€ŒDµï¼Œå¦åˆ™å–消它们之间的切分点。这个ç–略实际上å¯ä»¥æ¶ëŠ›–å‰é¢æåˆ°çš„æ‰€æœ‰æ”¹˜q›ï¼Œå› 䨓æ¯ä¸ªå®žé™…的分ŒDµä¹‹ä¸çš„æ•°æ®æˆ–者相互促˜q›ï¼Œæˆ–者彼æ¤ç¨æœ‰å¦¨å®»I¼Œä½†å¥½˜q‡å¤šä¿å˜ä¸€ä»½ç 表;而æ¯ä¸¤ä¸ªç›”R‚»çš„分ŒDµä¹‹é—´çš„æ•°æ®å½¼æ¤å¦¨å®³åQŒæŠµæ¶ˆäº†ž®‘ä¿å˜ä¸€ä»½ç 表的收益。这个ç–略简å•直观地体现了我们设¾|®åˆ†ŒD늚„åˆè¡·åQšå°±æ˜¯åˆ†ŒDµè¾“出必™å»èƒ½æé«˜åŽ‹ç¾ƒçŽ‡ã€?br />
2. 如果ä¸è€ƒè™‘ç 表åQŒhuffman ½Ž—法能得到最çŸçš„¾~–ç å¼åŽ‹¾~©ç»“果,但是˜q™ç§½Ž—法必须ä¿å˜ç 表以便解压¾~©ï¼Œæ‰€ä»¥ä¸èƒ½ä¿è¯ç»“果是最佳的。gzip é¢„å…ˆæ‹Ÿå®šäº†ä¸€å¥—é€šç”¨çš„é™æ€çš„¾~–ç åQŒå½“è¦è¾“å‡ÞZ¸€ä¸ªæ®µè½æ—¶åQŒæ¯”è¾?huffman 压羃¾l“æžœåŠ ç è¡¨çš„é•¿åº¦å’Œé™æ€ç¼–ç 的压羃¾l“果长度åQŒå†å†›_®šç”¨å“ª¿Uæ–¹æ³•è¾“å‡ø™¿™ä¸ªæ®µè½ã€‚陿€ç¼–ç ä¸éœ€è¦å¾æ ‘,计算压羃¾l“果长度时耗时很少。如果å„节点的频率的差异很å°åQŒhuffman 压羃¾l“æžœåŠ ç 表å而增大了¾l“æžœåQŒé™æ€ç¼–ç 也ä¸åˆé€‚ï¼ŒåŒæ ·å¢žå¤§äº†ç»“果,gzip ž®Þq›´æŽ¥ä¿å?lz77 的原始输出。由于输å‡ÞZ¸€ä¸ªæ®µè½æ—¶åQŒå¢žåŠ äº†é™æ€ç¼–ç çš„æ–ÒŽ¡ˆåQŒä‹É输出的实际长度和之剼‹®å®šåˆ†æ®µç‚ÒŽ—¶è®¡ç®—的值å¯èƒ½ä¸åŒï¼Œé‚£ä¹ˆå‰é¢è®¡ç®—出的˜q™ä¸ªåˆ†æ®µç‚ÒŽ˜¯å¦ä»æ˜¯æ£¼‹®çš„åQŸå‰é¢çš„分段½{–略是å¦éœ€è¦è°ƒæ•ß_¼Ÿ
  分æžåQ?)陿€ç¼–ç çš„å„èŠ‚ç‚¹ç¼–ç æ˜¯ä¸å˜çš„,对于ŒDµè½çš„åˆòq¶æ˜¯æ— 所谓的åQŒä¸¤ä¸ªè¿ž¾l段è½å³ä½‰Kƒ½é‡‡ç”¨é™æ€ç¼–ç ,也ä¸ç”¨åˆòqÓž¼Œå› 䨓åˆåƈåŽç»“果长度是ä¸ä¼šå˜çš„ã€?)所以åªå¯¹ä¸€¿U情况å¯èƒ½æœ‰å½±å“åQšä¸€ä¸ªæ®µè½ä¸æ‹†åˆ†å‡ÞZ¸€äº›éƒ¨åˆ†ç”¨ huffman ¾~–ç åQŒå¦ä¸€äº›éƒ¨åˆ†ç”¨é™æ€ç¼–ç ,压羃¾l“果更好。当˜q™ç§æƒ…况å‘生æ—Óž¼Œåˆ™å¿…有一些部分的优势节点åQˆé¢‘çŽ‡é«˜çš„èŠ‚ç‚¹ï¼‰ä¸Žé™æ€ç¼–ç 预先拟定的优势节点相近åQŒé‡‡ç”¨é™æ€ç¼–ç åŽæœ‰ç¨è®¸æ”¹å–„ï¼Œå…¶ä»–éƒ¨åˆ†åˆ™ä¸Žé™æ€ç¼–ç 预先拟定的优势节点有一定分æ§ï¼Œé‡‡ç”¨é™æ€ç¼–ç åŽä¼šæœ‰½E许ä¸åˆ©ã€‚之所以说“ç¨è®¸â€ï¼Œæ˜¯å› 为我们已知åŒä¸€ä¸ªæ®µè½é‡Œçš„å„éƒ¨åˆ†æ•°æ®æˆ–è€…äº’ç›æ€¿ƒ˜q›ï¼Œæˆ–者仅有ç¨è®¸å¦¨å®»I¼Œè¯´æ˜Žå®ƒä»¬çš„优势节ç‚ÒŽ˜¯å¤§è‡´‘‹åŒçš„。考虑到拆分åŽå¯èƒ½è¦å¤šä¿å˜å‡ 䆾ç 表åQŒæ‹†åˆ†å¸¦æ¥æ”¶ç›Šçš„å¯èƒ½æ€§å’Œ½E‹åº¦æ˜¯å¾ˆž®çš„åQŒè€Œä¸”è®¡ç®—çš„å¤æ‚度较大åQŒæ‰€ä»¥å‰é¢çš„æ‹†åˆ†½{–ç•¥å¯ä»¥ä¸ä½œè°ƒæ•´ã€?br />  至于直接ä¿å˜ lz77 的原始输出,å¯ä»¥çœ‹ä½œé™æ€ç¼–ç 的一¿U特ŒDŠåÅžå¼ï¼Œåªä¸˜q‡å®ƒå‡å®šå„节点的频率相近åQŒæ²¡æœ‰ä¼˜åŠ¿èŠ‚ç‚V€‚它å¯ä»¥å¥—ç”¨é™æ€ç¼–ç 的分æžåQŒæ¥è¯æ˜Žä¸åª„å“å‰é¢å·²¾l制定的分段½{–ç•¥ã€?br />
3.采用 huffman ¾~–ç åQŒå¿…™åÀL·±å…¥ç ”½I¶ç 表的ä¿å˜æ–¹å¼ã€?br />  åªè¦è®¡ç®—一下采用简å•çš„æ–¹å¼æ¥ä¿å˜ç 表,需è¦å¤šå¤§çš„½Iºé—´åQŒå°±çŸ¥é“˜q™æ˜¯ä¸€ä¸ªæŒ‘战ã€?br />  ½Ž€å•地ä¿å˜ç 表的方法是™åºåºåœîC¿å˜æ¯ä¸€ä¸ªå€¼çš„ç 长和编ç 。之所以è¦ä¿å˜ç é•¿åQŒæ˜¯å› 䨓¾~–ç æ˜¯ä¸å®šé•¿çš„,没有ç é•¿åQŒè§£åŽ‹æ—¶æ— æ³•æ£ç¡®è¯Õd–¾~–ç 。ç é•¿å¿…™åÀL˜¯å®šé•¿çš„,也就是说必须é™åˆ¶ huffman æ ‘çš„æœ€å¤§å±‚æ•ŽÍ¼Œä½¿ç é•¿çš„ä½æ•°èƒ½æ°å¥½è¡¨½Cø™¿™ä¸ªå±‚数。é™åˆ?huffman æ ‘çš„æœ€å¤§å±‚æ•°çš„æ–ÒŽ³•是:如果规定的最大层æ•îCØ“ nåQŒåˆ™åœ?n - 1 层找åˆîC¸€ä¸ªå¶å节ç‚?aåQˆå¦‚æž?n - 1 层没有å¶å节点,ž®±é€å±‚地往上寻找,直到扑ֈ°ä¸€ä¸ªå¶å节点)åQŒåœ¨èŠ‚ç‚¹ a 的佾|®æ”¾ä¸€ä¸ªéžå¶å节点 AåQŒä‹É a æˆäØ“ A çš„å节点åQŒæŠŠæŸä¸ª‘…过 n 层的å¶å节点 b æä¸Šæ¥ä½œä¸?A çš„å¦ä¸€ä¸ªå节点åQŒæ¤æ—?b 的父节点 B åªå‰©ä¸‹ä¸€ä¸ªå节点 cåQŒå–æ¶?BåQŒæŠŠ c 攑֜¨ B 的佾|®ï¼Œé‡å¤˜q™æ ·çš„过½E‹ï¼Œç›´åˆ°æ‰€æœ?n 层以下的节点都被æä¸Šæ¥ã€‚之所以è¦ä»?n - 1 层开始é€å±‚往上找åQŒæ˜¯å› äØ“ä¸‹å±‚çš„èŠ‚ç‚šw¢‘率å°åQŒç é•¿å˜åŒ–åŽçš„媄å“å°ã€‚å‡è®¾æ¯ä¸€å±‚节点的频率相近åQŒé‚£ä¹ˆä¸Šå±‚父节点的频率是其下层å节点的两å€ï¼Œ½W?11 å±‚èŠ‚ç‚¹çš„é¢‘çŽ‡åªæœ‰½W¬ä¸€å±‚节炚w¢‘率的 1 / 1024åQŒæ‰€ä»¥åº”该从下往上找ã€?br />  现在ž®±å¼€å§‹è®¡½Ž—ç 表大ž®ï¼š
  对于 256 个原始å—节å€û|¼Œé™åˆ¶å®ƒçš„ huffman æ ‘çš„å±‚æ•°ä¸?0 åQ?15åQŒç 长就需è¦?4 ä½ï¼Œ256 个ç 镉Kœ€è¦?4 bit * 256 = 128 å—节åQ›è€?256 个新¾~–ç 需è¦è‡³ž®?256 å—èŠ‚ã€‚ï¼ˆå½“äºŒå‰æ ‘的所有å¶å节炚wƒ½æ”‘Öœ¨½W?8 å±?—â€?ä¸ç®—æ ¹èŠ‚ç‚¹ä¸€å±‚ï¼Œæ£å¥½èƒ½æ”¾ä¸?2 çš?8 ‹Æ¡æ–¹ = 256 个å¶å节点,其ä¸ä»ÖM½•一个å¶å节点往上å‡åQŒè‡³ž®‘é€ æˆä¸¤ä¸ªå¶å节点往下é™ã€‚æ¢ä¸€ä¸ªè§’度说åQŒå¦‚果在½W?8 层以上å˜åœ¨ä¸€ä¸ªå¶å节ç‚?aåQŒåœ¨èŠ‚ç‚¹ a 的佾|®æ”¾ä¸€ä¸ªéžå¶å节点 AåQŒä‹É a æˆäØ“ 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ä½ã€‚)˜q™å¥—ç 表共需臛_°‘ 128 + 256 = 384 å—节ã€?br />  256 个“匹é…长度â€çš„æƒ…况与原始å—节值相åŒï¼Œä¸¤å¥—ç 表共需臛_°‘ 384 * 2 = 768 å—节ã€?br />  对于 32k 个“匹é…è·¼› Z€ï¼Œå¦‚æžœé™åˆ¶è¯?huffman æ ‘çš„å±‚æ•°ä¸?0 åQ?31åQŒä¿å˜æ¯ä¸ªå€¼çš„ç 长需è¦?5 ä½ï¼Œæ–°ç¼–ç çš„òq›_‡é•¿åº¦‘…过 15 ä½ã€‚ï¼ˆå› äØ“æ‰€æœ‰å¶å节炚wƒ½æ”‘Öœ¨½W?15 å±?—â€?ä¸ç®—æ ¹èŠ‚ç‚¹ä¸€å±‚ï¼Œæ£å¥½èƒ½æ”¾ä¸?2 çš?15 ‹Æ¡æ–¹ = 32k 个å¶å节ç‚V€‚)˜q™å¥—ç 表è¦è¶…˜q?0k å—节åQ?(5 + 15) * 32k / 8 = 80k åQ‰ã€?br />  å‰é¢è®¨è®ºåˆ†æ®µ½{–略时已¾l说˜q‡ï¼Œä¸ÞZº†é¿å…个段è½é—´èŠ‚ç‚¹é¢‘çŽ‡å·®å¼‚è¢«äº’ç›¸æŠµæ¶ˆï¼Œè¦æ±‚ŒDµè½åˆ’分ž®½é‡¾l†è‡´ã€å‡†¼‹®ï¼Œæœ€ž®çš„ŒDµè½å¯ä»¥ä»…䨓 4kåQŒè€Œé‡‡ç”¨ä¸Šé¢è¿™¿U简å•的方å¼åQŒç 表覑…过 80kåQŒæ˜¾ç„¶æ˜¯æ— 法接å—çš„ã€?br />  对ç 表的ä¿å˜æ–¹å¼çš„æ·±å…¥ç ”½IÓž¼Œ¼‹®å®žæ˜¯ä¸ªæ— 法¾l•å¼€çš„æŒ‘æˆ˜ï¼Œå¦‚æžœä¸æ”»å…‹è¿™ä¸ªéš¾å…»I¼Œ¾~–ç å¼åŽ‹¾~©æ— æ³•è¿›è¡Œä¸‹åŽ»ï¼æŒ‘战会带æ¥ä¹‘£ï¼Œå›°éš¾ä¼šæ¿€å‘豪情。我们所è¦åšçš„æ˜¯åQšè§‚å¯?gzip å¦‚ä½•ä¸€æ¥æ¥åœ°é€šè¿‡¾Jå¤ä½†åˆå·§å¦™çš„åšæ³•解册™¿™ä¸ªéš¾é¢˜ï¼Œå¯¹å…¶ä¸çš„åšæ³•çš„é“ç†åŠ¡æ±‚çŸ¥å…¶ç„¶ã€çŸ¥å…¶æ‰€ä»¥ç„¶åQŒé€šè¿‡è§‚å¯Ÿã€æ€è€ƒï¼ŒæŠŠæ¡æ— æŸåŽ‹ç¾ƒå†…åœ¨çš„ã€æ·±å±‚çš„ã€æœ¬è´¨çš„规律åQ事实上åQŒå¯¹ gzip çš„è¿™äº›åšæ³•进行阅读(æºä»£ç )ã€åˆ†æžã€æŒ–掘其ä¸çš„æ™ºæ…§åQŒæœ¬íw«å°±æ˜¯ä¸€ä¸ªå¯¹æ™ºæ…§ã€è€åŠ›ã€ä¹ƒè‡›_†³å¿ƒçš„长期的挑战,我接å—了˜q™ä¸ªæŒ‘战åQŒåƈ把它æè¿°ã€è§£é‡Šå‡ºæ¥ï¼Œè¯»è€…é¢å¯¹çš„æŒ‘战是花费较长期的时间去阅读ã€ç†è§£ï¼Œå¸Œæœ›è¯»è€…完全有è€åŠ›ã€è±ªæƒ…ã€å…´‘£æ¥æŽ¥å—˜q™ä¸ªæŒ‘战åQŒæ·±åŒ–自å·Þqš„æŠ€æœ¯å±‚‹Æ¡ã€æ€ç»´å±‚次ã€?br />
3.1 åªä¿å˜ç 长,òq¶å¢žåŠ ä¸€äº›ç‰¹ŒDŠçš„倹{€?br />
3.1.1 æŠ?huffman æ ‘çš„æ¯ä¸€å±‚上的å¶å节炚wƒ½æ¢åˆ°è¯¥å±‚的左边,按照其原始å€ég»Žž®åˆ°å¤§ä¾‹Æ¡æŽ’列,éžå¶å节点则集ä¸åœ¨è¯¥å±‚å³è¾¹ï¼Œ˜q™æ—¶ä»æ˜¯ä¸€‹‚µäºŒå‰æ ‘åQŒå¾—到的¾~–ç ä»ç¬¦åˆå‰¾~€¾~–ç çš„è¦æ±‚。æ¯ä¸ªå¶å节点的¾~–ç 长度ä¸å˜åQŒæ‰€ä»¥åŽ‹¾~©çŽ‡ä¹Ÿä¸å˜ã€‚ä»…éœ€è¦æŒ‰ç…§åŽŸå§‹å€ég»Žž®åˆ°å¤§ä¾‹Æ¡ä¿å˜æ¯ä¸ªå€¼çš„ç é•¿åQŒè§£åŽ‹æ—¶ž®±å¯ä»¥è¿˜åŽŸè¿™å¥—ç¼–ç 表åQŒè¿˜åŽŸæ–¹æ³•æ˜¯åQšç é•¿äØ“ n 的第一个值的¾~–ç æ˜¯ç é•¿äØ“ n - 1 的最åŽä¸€ä¸ªå€¼çš„¾~–ç åŠ?1åQŒåƈ左移一ä½ï¼ˆä¹Ÿå°±æ˜¯è¯´åQŒåœ¨¾~–ç æœ€åŽåŠ ä¸?0åQ‰ï¼Œè€Œç é•¿äØ“ n 的其他值的¾~–ç æ˜¯å‰ä¸€ä¸ªç é•¿äØ“ n 的值的¾~–ç åŠ?1ã€‚ä»Žä¸Šé¢æ‰€è¯´çš„æ ‘的角度æ¥è§£é‡Šï¼Œæ¯ä¸€å±‚çš„½W¬ä¸€ä¸ªå¶å节ç‚ÒŽ˜¯å…¶ä¸Šå±‚最åŽä¸€ä¸ªå¶å节点的匙¾¹ä¸€ä¸ªèŠ‚ç‚¹çš„å·¦å节点åQŒæ‰€ä»¥å®ƒçš„ç¼–ç æ˜¯ä¸Šå±‚最åŽä¸€ä¸ªå¶å节点的¾~–ç åŠ?1 òq¶å·¦¿UÖM¸€ä½ï¼Œè€Œæ¯ä¸€å±‚上的å¶å节炚wƒ½ç´§å¯†æŽ’列åQŒæ‰€ä»¥é™¤äº†ç¬¬ä¸€ä¸ªå¶å节点外åQŒå…¶ä»–å¶å节点的¾~–ç 都是å‰ä¸€ä¸ªå¶å节点的¾~–ç åŠ?1。编½E‹ä¸Šçš„实现方法是åQšé历ç 表,得到æ¯ä¸ªç é•¿(n)上有多少个å€û|¼Œè®¡ç®—出æ¯ä¸ªç 长上½W¬ä¸€ä¸ªå€¼çš„¾~–ç åQŒæ”¾åœ¨æ•°¾l?bit_len[]ä¸ï¼Œå†æ¬¡é历ç 表åQŒä¾‹Æ¡æ ¹æ®æ¯ä¸ªå€¼çš„ç é•¿(n)åQŒèµ‹äºˆå®ƒçš„ç¼–ç äØ“è¯¥ç 长上的å‰ä¸€ä¸ªå€¼çš„¾~–ç (bit_len[n]) åŠ?1åQŒbit_len[n] ++ã€?br />  ç”׃ºŽåªéœ€è¦ä¿å˜ç 长,现在ç 表ç”Þp¶…˜q?80k å—节å‡å°åˆ°çº¦ 20k å—节ã€?br />
3.1.2 如何åªä¿å˜åœ¨ŒDµè½ä¸å‡ºçŽ°è¿‡çš„èŠ‚ç‚¹ï¼ˆæœ‰æ•ˆèŠ‚ç‚¹åQ‰çš„¾~–ç åQ?br />  一ä¸?ASCⅡ文本,128 以åŽçš„值是ä¸ä¼šåœ¨æ–‡ä»¶ä¸å‡ºçŽ°çš„ï¼ŒæŒ‰ç…§ 3.1.1 的方法,ç 表ä¸åŽåŠéƒ¨åˆ†ï¼ˆéƒ½æ˜¯ 0åQ‰åœ¨è§£åŽ‹¾~©æ—¶æ˜¯ç”¨ä¸åˆ°çš„ã€‚äØ“äº†é¿å…è¿™¾cÀLµªè´¹ï¼Œåªä¿å˜æœ‰æ•ˆèŠ‚ç‚¹ï¼ˆç é•¿ä¸äØ“ 0 的节点)åQŒä¸€¿U方法是ä¿å˜æœ‰æ•ˆèŠ‚ç‚¹çš„åŽŸå§‹å€¼å’Œæ–°ç¼–ç çš„ç é•¿åQŒå½“有效节点‘…过所有节点的1/4åQŒè¿™¿U方法ä¿å˜çš„ç 表的大ž®ä¼š‘…过 3.1.1 的方法ã€?br />  gzip 采用的方法是åQšåœ¨ 3.1.1 的基¼‹€ä¸Šï¼ŒäºŽè‹¥òq²ç§ç 长之外åQŒå¢žåŠ ä¸€äº›ç‰¹ŒDŠçš„å€û|¼Œä»–们表示当å‰ä¸ÞZ¹‹å‰ä¸€ä¸ªç 长或 0 ç é•¿åQˆæ— 效节点)的é‡å¤ï¼Œé‡åˆ°˜q™ç§å€û|¼Œé‚£åŽé¢çš„一个数å—表½Cºé‡å¤çš„‹Æ¡æ•°ã€‚第一¿Uå€ég»£è¡¨å½“å‰äؓ之å‰ä¸€ä¸ªç é•¿çš„é‡å¤ 3 åQ?6 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 2 bit 为具体的é‡å¤‹Æ¡æ•°åQ›ç¬¬äºŒç§å€ég»£è¡¨å½“å‰äØ“ 0 ç é•¿çš„é‡å¤?3 åQ?10 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 3 bit 为具体的é‡å¤‹Æ¡æ•°åQ›ç¬¬ä¸‰ç§å€ég»£è¡¨å½“å‰äØ“ 0 ç é•¿çš„é‡å¤?11 åQ?138 ‹Æ¡ï¼ŒåŽé¢è·Ÿç€ 7 bit 为具体的é‡å¤‹Æ¡æ•°ã€‚é™åˆ¶æœ€ž®é‡å¤æ¬¡æ•îCØ“ 3åQŒå¯ä»¥ç¡®ä¿è¿™¿U方法得到的ç 表ä¸ä¼šå¤§è¿‡ 3.1.1。第一¿U值é™åˆ¶æœ€å¤§é‡å¤æ¬¡æ•îCØ“ 6åQŒæ˜¯å› 䨓˜qžç®‹ 6 个å€ég»¥ä¸Šçš„ç 长相ç‰åQˆè¯´æ˜Žé¢‘率å分接˜q‘)的情况ä¸å¸¸è§åQŒåš˜q™ä¸ªé™åˆ¶å¯ä»¥èŠ‚çœé™„åŠ bitåQ›ç¬¬äºŒç¬¬ä¸‰ç§å€¼åŒºåˆ†é‡å¤æ¬¡æ•°çš„范围åQŒä¹Ÿæ˜¯äؓ了节çœé™„åŠ?bitã€‚åœ¨åªæœ‰ž®‘数有效节点的情况下åQŒè¿™¿U方法åªéœ€è¦ä¿å˜è¾ƒž®‘的数æ®åQŒåŒæ—¶ä¹Ÿå…ähœ‰½Ž€å•的去é‡å¤çš„作用ã€?br />  如果最大ç 长是 15åQ? åQ?15 å…?16 ¿Uå€û|¼Œä¸€ä¸ªç 镉Kœ€è¦?4 ä½ï¼ŒåŠ ä¸Šä¸Šé¢ 3 ¿Uå€û|¼Œå…?19 ¿Uå€û|¼Œéœ€è¦?5 ä½ï¼Œåœ¨é‡å¤ä¸å¤šæ—¶åQŒåŠ äº†è¿™ 3 ¿Uå€û|¼Œæ˜¯ä¸æ˜¯ä¼šå¢žå¤§ç 表åQŸå…¶å®žä¸ç”¨æ‹…心,gzip 会对ç 表å†è¿›è¡Œä¸€‹Æ?huffman 压羃åQŒæ ¹æ®è¿™ 19 ¿U值的频率分酾l™å®ƒä»¬å¯å˜ç é•¿çš„¾~–ç åQŒä¸ä¼šé€ 戋¹ªè´¹åQŒç”±äºŽæ¶‰åŠåˆ°ä¸€äº›å…¶ä»–情况,对ç 表的å†ç¼–ç 压¾~©åœ¨åŽé¢˜q˜ä¼šè¯¦ç»†ä»‹ç»åQ?br />
3.2 把原始å—节值和匚w…长度值å¾åœ¨ä¸€‹‚‰| ‘上ã€?br />  现在先考虑å¦ä¸€ä¸ªé—®é¢˜ï¼šå¦‚ä½•ä½¿è§£åŽ‹æ—¶èƒ½åŒºåˆ†å½“å‰æ˜¯ä¸€ä¸ªæœªåŒšw…çš„å—节,˜q˜æ˜¯ä¸€ä¸ªåŒ¹é…?未匹é…å—节值和匚w…长度ã€åŒ¹é…è·¼›ÀL˜¯ä¸‰æ£µä¸åŒçš?huffman æ ‘ï¼Œå®ƒä»¬çš„ç¼–ç äº’ç›æ€¸½W¦åˆå‰ç¼€¾~–ç çš„è¦æ±‚,部分节点甚至å¯èƒ½¾~–ç 相åŒåQŒè§£åŽ‹æ—¶å¦‚ä½•åŒºåˆ†åQ?br />  ½W¬ä¸€¿Uæ–¹æ³•æ˜¯ç”¨æ ‡å¿—ä½ã€‚输出压¾~©ç»“果时åQŒé™¤äº†è¾“出æ¯ä¸€ŒD늚„ç 表ã€é‡æ–°ç¼–ç åŽçš„æ•°æ®æµåQŒè¿˜è¦ä¿å˜å¯¹åº”于˜q™ä¸€ŒD‰|•°æ®çš„æ ‡å¿—使µåQŒæµä¸çš„æ¯ä¸€ä½?0 æˆ?1 è¡¨ç¤ºå½“å‰æ˜¯ä¸€ä¸ªæœªåŒšw…çš„å—节,˜q˜æ˜¯ä¸€ä¸ªåŒ¹é…ã€?br />  ½W¬äºŒ¿U方法是¾l™åŽŸå§‹å—节值和匚w…长度å€ég¸åŒçš„¾~–ç åQŒåƈ½W¦åˆå‰ç¼€¾~–ç çš„è¦æ±‚ã€‚æœ€å¥½çš„åšæ³•是把它们建在一‹‚‰| ‘上,以确ä¿å®ƒä»¬ç¬¦åˆå‰¾~€¾~–ç çš„è¦æ±‚,òq¶ç”±å®ƒä»¬çš„频率楼‹®å®šå„自的ç é•Ñ€?br />  ½W¬ä¸€¿U方法相当于原始å—节值和匚w…长度值的¾~–ç 都增长一ä½ã€?br />  ½W¬äºŒ¿U方法丘q™ä¸¤å¥—节点的ç é•¿å˜åŒ–è¦æ ¹æ®å…·ä½“节点å„自的频率而定ã€?br />  ¾l过分æžåQŒç¬¬äºŒç§æ–ÒŽ³•更好åQŒå› 为第一¿U方法å¯ä»¥çœ‹ä½œæ˜¯½W¬äºŒ¿U方法的å˜ç§åQŒç›¸å½“于½Ž€å•地在两‹‚?huffman æ ‘çš„æ ¹èŠ‚ç‚¹ä¸Šå†åŠ ä¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒè¿™æ äh˜¾ç„¶æ˜¯ä¸èƒ½ä¿è¯æœ€ä½³çš„¾l“果的ã€?br />
3.3 把匹é…长度ã€åŒ¹é…è·¼›Õd˜ä¸ºé•¿åº¦èŒƒå›´ã€è·¼›»èŒƒå›ß_¼Œå‡å°‘节点ã€?br />  ¾l过上é¢å¯¹ä¿å˜ç 表的æ–ÒŽ³•的改˜q›åŽåQŒçŽ°åœ¨ç 表还有多大?
  ç”׃ºŽæœ‰äº†ä¸Šé¢ä»‹ç»çš„去é‡å¤æœºåˆ¶åQŒç 表的实际大å°å’ŒèŠ‚ç‚¹çš„é‡å¤æƒ…况有关åQŒå¦‚果有很多˜qžç®‹ 3 个以上节点的ç 长相ç‰çš„æƒ…况出玎ͼŒæˆ–有很多˜qžç®‹ 3 ä¸ªä»¥ä¸Šçš„æ— æ•ˆèŠ‚ç‚¹çš„æƒ…å†µå‡ºçŽŽÍ¼Œç 表å¯èƒ½æ˜¯å¾ˆž®çš„åQŒä½†ä½œäØ“é€šç”¨çš„æ— æŸåŽ‹¾~©ç®—法,必须考虑é‡å¤ä¸å¤šçš„æƒ…å†üc€‚“匹é…è·¼› Z€æ˜¯ç è¡¨ä¸æœ€ä¸»è¦çš„部分,我们æ¥åˆ†æžä¸€ä¸‹å®ƒçš„é‡å¤æƒ…况,“匹é…è·¼› Z€å…±æœ?32k 个å–å€û|¼Œå¦‚果一个段è½ä¸åˆ?32kåQŒâ€œåŒ¹é…è·¼› Z€çš„æœ‰æ•ˆèŠ‚ç‚¹æ•°å½“ç„¶æ˜¯ä¸å¯èƒ½åˆ° 32k 的,æ€è€ƒä¸€ä¸‹ï¼Œå¯ä»¥çŸ¥é“åQŒå®ƒçš„æœ‰æ•ˆèŠ‚ç‚ÒŽ•°å’Œè¿™æ ·å‡ ä¸ªå› ç´ æœ‰å…»I¼šä¸€ŒD‰|œ‰å¤šé•¿åQŒæ®µè½ä¸åŒšw…æ•°å’ŒæœªåŒ¹é…æ•°çš„æ¯”例,军_®šäº†å®ƒæœ‰å¤šž®‘个å€û|¼Œå†åŠ ä¸Šè¿™äº›å€¼çš„é‡å¤æ€§ï¼Œå†›_®šäº†å®ƒæœ‰å¤šž®‘个有效节点。å†åˆ†æžä¸€ä¸‹è¿™äº›å€¼çš„é‡å¤æ€§ï¼šä¸åŒäºŽåŽŸå§‹å—节和“匹é…长度â€éƒ½åªæœ‰ 256 个å–å€û|¼Œå®ƒæœ‰ 32k 个å–å€û|¼Œç›¸åŒçš„åŒ¹é…æœ‰ç›¸åŒçš„匹é…长度但ä¸ä¸€å®šæœ‰ç›¸åŒçš„匹é…è·¼›»ï¼Œæ‰€ä»¥å®ƒçš„åŽ»å€ÆDŒƒå›´å¹¿åQŒé‡å¤çŽ‡ä½Žï¼Œæœ‰æ•ˆèŠ‚ç‚¹å¤šã€‚è™½ç„¶å®žé™…çš„æƒ…å†µæ— æ³•é¢„æµ‹åQŒä½†æˆ‘们å¯ä»¥åšä¸€äº›â€œå¤§è‡´åˆç†â€çš„å‡è®¾åQŒä»¥ä¾¿å¯¹ç 表的大ž®æœ‰ä¸€ä¸ªåŸºæœ¬çš„æ¦‚念åQŒå‡å¦‚çŸè¯å¼åŽ‹ç¾ƒçš„è¾“å‡ºæ®µè½çš„大å°ä¸?90k å—节åQŒå…¶ä¸æœªåŒšw…å—节数和匚w…数的比例ä¸?3 : 1åQŒæ¯ä¸ªæœªåŒšw…å—节å?8 ä½ï¼›æ¯ä¸ªåŒšw…ä¸ï¼Œé•¿åº¦å?8 ä½ï¼Œè·ç¦»å?15 ä½ï¼Œå…?23 ä½ï¼Œ¾U¦äؓ未匹é…å—节的 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ŒäØ“ 90k çš?18 分之一。当ŒDµè½å‡å°æ—Óž¼Œæœ‰æ•ˆèŠ‚ç‚¹‘‹äºŽ½E€ç–ï¼Œæ— æ•ˆèŠ‚ç‚¹å®ÒŽ˜“˜qžæˆç‰‡ï¼ŒåŽ»é‡å¤æœºåˆ¶èƒ½å‘挥更大的作用;当段è½å¢žå¤§æ—¶åQŒæ— 效节点密度凞®ï¼Œå¯èƒ½æ— 法大片˜qžæŽ¥åQŒåŽ»é‡å¤æœºåˆ¶çš„æ•ˆç”¨é™ä½Žï¼Œç 表的比例å¯èƒ½ä¼šå¢žå¤§ã€‚一旦“匹é…è·¼› Z€éœ€è¦ä¿å˜çš„ç é•¿æ•°è¾¾åˆîCº† 32k个,ç 表辑ֈ°æœ€å¤§ï¼Œä¹‹åŽŒDµè½å†å¢žå¤§ä¹Ÿä¸ä¼šå¢žå¤§ç 表åQŒäºŽæ˜¯ç 表的比例åˆä¼šé€æ¸ä¸‹é™ã€‚当然段è½é€šå¸¸ä¸ä¼šè¾‘Öˆ°˜q™ä¹ˆå¤§ï¼Œä½¿å¾—“匹é…è·¼› Z€éœ€è¦ä¿å˜çš„ç 长数能有机会达åˆ?32kã€?br />  gzip 以牺牲压¾~©çŽ‡çš„ä»£ä»äh¥æ¢å–ç 表的进一æ¥çš„大幅度凞®ã€‚我们先æè¿°ä¸€ä¸‹å®ƒçš„å…·ä½“åšæ³•ï¼Œå†æ¥åˆ†æžå…¶åˆ©å¼Šã€?br />  gzip 把匹é…长度划æˆ?29 个范å›ß_¼ŒæŠŠåŒ¹é…è·¼›Õdˆ’æˆ?30 个范å›ß_¼Œæ ÒŽ®æ¯ä¸ªèŒƒå›´ä¸èŠ‚ç‚¹çš„æ€»é¢‘çŽ‡ï¼Œä¸?29 ä¸ªé•¿åº¦èŒƒå›´åŠ 258 个å—èŠ‚å€¼å¾ huffman æ ‘ï¼šl_treeåQŒäØ“ 30 个跼›»èŒƒå›´å¾ huffman æ ‘ï¼šd_tree。输å‡ÞZ¸€ä¸ªå€¼æ—¶å…ˆè¾“凸™¯¥å€¼æ‰€åœ¨èŒƒå›´çš„¾~–ç åQŒå†è¾“å‡ºé™„åŠ ç ,å›_®ƒæ˜¯è¯¥èŒƒå›´ä¸çš„½W¬å‡ 个倹{€‚è¿™æ ïL 表ä¸åªéœ€ä¿å˜èŒƒå›´çš„ç é•Ñ€‚范围的大å°éƒ½æ˜¯ 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šèŒƒå›´çš„划分是从ž®åˆ°å¤§çš„ã€‚äØ“ä»€ä¹ˆä¸òq›_‡åˆ’分呢?
  如果ä»ä»¥å•个节点的角度æ¥çœ‹ï¼Œè¢«åˆ†åˆ°åŒä¸€èŒƒå›´çš„节点相当于被赋予了相åŒçš„ç 长:范围¾~–ç çš„ç é•¿åŠ é™„åŠ ç çš„ç é•¿ã€‚è‹¥é¢‘çŽ‡å·®åˆ«å¾ˆå¤§çš„èŠ‚ç‚¹å› åˆ’åˆ†å…¥åŒä¸€ä¸ªèŒƒå›´è€Œæ‹¥æœ‰ç›¸åŒçš„ç é•¿åQŒå°±ä¸ç¬¦å?huffman ¾~–ç çš„åˆè¡øP¼Œä¼šå¯¹åŽ‹ç¾ƒçŽ‡äñ”生ä¸è‰¯åª„å“ã€‚å› æ¤è¦æ±‚划分åŽåQŒèŒƒå›´é‡Œçš„节炚w¢‘率相˜q‘,以尽é‡é™ä½ŽåŒä¸€ä¸ªèŒƒå›´é‡Œä¸åŒèŠ‚ç‚¹é—´çš„ç›æ€º’å½±å“ã€?br />  “匹é…长度â€ä»ŽçŸåˆ°é•¿ï¼Œé¢‘çŽ‡ä¼šé€æ¸è¡°å‡åQŒè€Œä¸”è¡°å‡çš„幅度有从大到å°çš„特点,˜q™ä¸ªç‰¹ç‚¹æ˜¯åœ¨å¤§å¤šæ•°åŽŸå§‹æ–‡ä»¶ä¸â€œè‡ªç„¶å˜åœ¨â€çš„。比如在 google 上æœç´¢ï¼Œ2 个å—çš„çŸè¯å’Œ 22 个å—çš„çŸè¯ï¼Œæœåˆ°çš„结果数差别巨大åQ?00 个å—å’?220 个å—åQŒæœåˆ°çš„¾l“果数差别就没有那么大。频率大致上å•å‘åœ°é€æ¥å˜åŒ–åQŒæ‰€ä»¥åˆ’分范围åŽåQŒèŒƒå›´å†…节点的频率较接近åQ›å˜åŒ–速度由大到å°åQŒæ‰€ä»¥èŒƒå›´çš„划分应该从å°åˆ°å¤§ã€?br />  “匹é…è·¼› Z€ä¹Ÿæœ‰ç±»ä¼¼çš„特点åQŒå¯¹å¤§å¤šæ•°æ–‡ä»¶æ¥è¯ß_¼ŒåŒš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šä¸æ˜¯â€œåŒ¹é…å—节数â€ï¼‰åQŒå¼ºè¡Œåˆ’åˆ†é€ æˆçš„ä¸è‰¯å应较大。所ä»?gzip ä¿ç•™äº†è¿™å¥—节点,没去拆分ã€?br />  长度范围的最åŽä¸€ä¸ªé™„åŠ ç ä½é•¿æ˜?0åQŒæ˜¯å› äØ“é•¿åº¦å¤§äºŽ 258 的匹é…都被截æ–到 258åQŒæ‰€ä»?258 的频率å¯èƒ½ä¼šé«˜å‡ºå‰é¢çš„节点,å•ç‹¬åˆ’äØ“ä¸€ä¸ªèŒƒå›´ã€?br />  如果一个范围里的节炚w¢‘率相åŒï¼ŒèŠ‚ç‚¹æ•°æ˜¯ 2 çš„ä¹˜æ–¹ï¼Œä¸”æ²¡æœ‰æ— æ•ˆèŠ‚ç‚¹ï¼Œé‚£ä¹ˆ˜q™ä¸ªèŒƒå›´å¯ä»¥çœ‹ä½œ huffman æ ‘ä¸çš„一‹‚µåæ ‘ï¼ŒèŒƒå›´çš„ç¼–ç å¯ä»¥çœ‹ä½œè¿™‹‚µåæ ‘çš„æ ¹çš„¾~–ç åQŒè¿™æ ïLš„划分是ä¸ä¼šåª„å“压¾~©çŽ‡çš„ã€?br />  对压¾~©çŽ‡çš„æŸå®Ïx¥è‡ªé¢‘率ä¸ä¸€è‡ß_¼Œä»¥åŠæ— 效节点的å˜åœ¨ã€‚范围里的有效节点如果没有过åŠï¼Œâ€œé™„åŠ ç â€çš„使•°ž®Þp‡³ž®‘æœ‰ä¸€ä½æµªè´¹äº†åQŒä¹Ÿž®±æ˜¯è¯ß_¼ŒèŒƒå›´é‡Œæ‰€æœ‰æœ‰æ•ˆèŠ‚ç‚¹çš„ç é•¿æ— ç«¯å¢žé•¿äº†ä¸€ä½ï¼Œå¦‚果有效节点没有˜q?1/4åQŒè‡³ž®‘å°±æœ?2 ä½é™„åŠ ç ‹¹ªè´¹ã€?br />  划分范围的收益是使ç 表凞®åˆ°ä¸èƒö 0.2kåQŒåŠ ä¸ŠåŽé¢ä¼šä»‹ç»çš„对ç 表的第二次压羃åQŒç 表的最¾lˆå¤§ž®æ˜¯å¾®ä¸‘³é“çš„ã€?br />  现在我们æ¥è¿‘似地估计一下划分范围在“一般情况â€ä¸‹å¯¹åŽ‹¾~©çŽ‡çš„æŸå®³çš„æƒ…况åQŒä»¥ä¾¿æœ‰ä¸€ä¸ªå¤§è‡´çš„æ¦‚念åQŒä»ä¸‘Ö‰é¢çš„例ååQ𿮵è½å¤§ž®äØ“ 90kåQŒè®¾å…¶ä¸æœªåŒ¹é…å—èŠ‚æ•°å’ŒåŒ¹é…æ•°çš„æ¯”例䨓 3:1åQŒæœªåŒšw…å—节æœ?45k 个,匚w…è·ç¦»å€¼å’ŒåŒšw…é•¿åº¦å€¼å„ 15k 个,有效è·ç¦»å€ÆDŠ‚ç‚¹äØ“ 5k个(节点òq›_‡é¢‘率ä¸?3åQ‰ï¼Œæ— 效è·ç¦»å€ÆDŠ‚ç‚¹äØ“ 32k - 5k = 27k 个,有效è·ç¦»å€ÆDŠ‚ç‚¹çš„òq›_‡å¯†åº¦ä¸?5/32åQŒä¸åˆ?1/6。范围的划分是剞®åŽå¤§ï¼Œæœ‰æ•ˆèŠ‚ç‚¹é¢‘çŽ‡æ˜¯å‰å¤§åŽž®ï¼Œæ— 效节点是剞®‘åŽå¤šã€‚è·¼›Õd€¼æœ‰ 15k ä¸ªï¼Œè®‘Ö‰é¢æœ‰æ•ˆèŠ‚ç‚šw¢‘率高ã€å¯†åº¦è¾ƒå¤§çš„部分å 一åŠï¼Œ¾U?7k 个å€û|¼Œ˜q™ä¸ªéƒ¨åˆ†ä¸æ— 效节点带æ¥çš„æŸå®³è¾ƒå°åQŒè€Œä¸”范围划分¾l†ï¼ŒèŠ‚ç‚¹é—´é¢‘çŽ‡ä¸ä¸€è‡´å¸¦æ¥çš„æŸå®³ä¹Ÿå°åQŒå§‘且ä¸åŽ»è®¡½Ž—。åŽé¢çš„èŒƒå›´åˆ’åˆ†å¤§ã€æœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦å°çš„部分æŸå®Œ™¾ƒå¤§ï¼Œ˜q™ä¸ªéƒ¨åˆ†å 了¾U?7k 个å€û|¼Œç”׃ºŽå‰é¢çš„部分有效节点密度大åQŒæ‰€ä»¥å‡è®¾è¿™ä¸ªéƒ¨åˆ†æœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦äØ“ 1/8åQˆä¹Ÿž®±æ˜¯è¯ß_¼Œ¾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 æ ‘ï¼Œä¼šå‘çŽ°å½“èŠ‚ç‚¹é¢‘çŽ‡å·®å¼‚åœ¨å‡ åå€ç”šè‡›_ªæœ‰å‡ å€çš„æ—¶å€™ï¼ŒåŽ‹ç¾ƒçŽ‡å…¶å®žå¾®ä¹Žå…¶å¾®ã€‚ç»˜q‡ä¸Šé¢è¿™æ ·åˆç†åœ°åˆ’分范围åQŒèŒƒå›´å†…的节炚w¢‘率差异一般ä¸ä¼šé‚£ä¹ˆå¤§åQŒæ‰€ä»¥æˆ‘们å‡è®ùN¢‘率ä¸ä¸€è‡´é€ æˆçš„æŸå®³äØ“ 1k åQ?2kã€?br />  匚w…长度值的å–倯DŒƒå›´åªæœ?258 个,而且匚w…长度å¯èƒ½å¾ˆå°‘会超˜q?20 å—节åQŒè€Œå‰ 20 å—èŠ‚çš„èŒƒå›´åˆ’åˆ†æ˜¯å¾ˆç»†çš„ï¼Œæ‰€ä»¥æ— æ•ˆèŠ‚ç‚¹çš„æŸå®³å’Œé¢‘率ä¸ä¸€è‡´çš„æŸå®³éƒ½è¾ƒž®ã€?br />  ˜q™æ ·åQŒåœ¨˜q™ä¸ªä¾‹åä¸ï¼Œåˆ’分范围带æ¥çš„æŸå®³çº¦åœ?5k åQ?6kåQŒå’Œä¸åˆ’分范围时ç 表的大ž®éžå¸¸ç›¸ä¼û|¼Œè‡›_°‘也是在一个数é‡çñ”上ã€?
ã€€ã€€å†æ¥çœ‹çœ‹æŸå®³æ¯”例å˜åŒ–的趋势:当段è½å¾ˆž®æ—¶åQŒèŒƒå›´ä¸çš„æœ‰æ•ˆå€¼ç¨€ç–,æŸå®³æ¯”ä¾‹ä¼šåŠ å¤§ã€‚è€Œä¸åˆ’分范围æ—Óž¼Œç 表的去é‡å¤æœºåˆ¶ä¼šæœ‰æ›´å¤§ä½œç”¨åQŒæ— 效节点连æˆç‰‡åQŒæŸå®Ïx¯”例凞®ã€‚å之,ŒDµè½å¢žå¤§åQŒèŒƒå›´é‡Œæœ‰æ•ˆèŠ‚ç‚¹å¯†åº¦å¤§ï¼ŒæŸå®³æ¯”例é™ä½ŽåQŒè€Œä¸åˆ’分范围æ—Óž¼Œæ— 效节点å¯èƒ½æ— 法大片˜qžæŽ¥åQŒåŽ»é‡å¤æœºåˆ¶çš„æ•ˆç”¨é™ä½Žï¼ŒæŸå®³æ¯”例增大ã€?br />  ç”׃ºŽåˆ’分范围能ä‹É huffman æ ‘çš„èŠ‚ç‚¹ä»Žæœ€å¤?32k å‡åˆ°ä¸èƒö 320 个,从而ä‹É压羃速度显著改善。综上所˜qŽÍ¼ŒŒDµè½ž®ï¼ˆæ¯”如ä¸åˆ° 10kåQ‰ï¼Œä¸å®œåˆ’分范围åQŒå¦åˆ™åˆ’分范围是有益的ã€?/div>
Â
4. 解决了ç 表的问题åQŒçŽ°åœ¨å†å›žè¿‡å¤´æ¥çœ‹é™æ€ç¼–ç ã€?br />ã€€ã€€é™æ€ç¼–ç æ˜¯ gzip 预先讑֮šçš„ç¼–ç æ–¹æ¡ˆï¼Œå®ƒçš„ç 表是固定的ã€?br />  该如何åˆç†è®¾è®¡è¿™å¥—ç¼–ç ï¼Ÿä½œäØ“ huffman ¾~–ç 的补助,它的耗时应尽é‡å°‘åQŒå‰é¢è¯´˜q‡ï¼Œlz77 输出一个分ŒDµä¹‹å‰ï¼Œè¦æ¯”è¾?huffman ¾~–ç å’Œé™æ€ç¼–ç 的压羃¾l“æžœåQŒäؓ了直接利ç”?lz77 输出时åšçš„匹é…长度范围ã€åŒ¹é…è·¼›»èŒƒå›´çš„é¢‘çŽ‡çš„ç»Ÿè®¡ï¼Œé™æ€ç¼–ç é‡‡ç”¨äº†åŒæ ·çš„范å›ß_¼é™„åŠ ç çš„æ–ÒŽ¡ˆåQŒè¿™æ ·å¯ä»¥å¿«é€Ÿå¾—åˆ°é™æ€ç¼–ç 的压羃¾l“果大å°ã€?br />ã€€ã€€é™æ€ç¼–ç çš„ç é•¿çš„åˆ†é…æ˜¯˜q™æ ·çš„:29 个长度范围ä¸å‰?24 个范围的ç é•¿ä¸?7åQŒåŽ 5 个范围的ç é•¿ä¸?。原始å—节å€ég¸ 0 åQ?143 çš„ç é•¿äØ“ 8åQ?44 åQ?255 çš„ç é•¿äØ“ 9。è€?30 个跼›»èŒƒå›´çš„ç é•¿ä¸?5ã€‚æ ¹æ®è¿™äº›é¢„先设定的ç é•¿å»ºç«‹é™æ€çš„ l_tree å’?d_treeåQŒç¼–ç 也ž®×ƒñ”生了。结åˆå‰é¢æåˆ°çš„é™„åŠ ç 使•°çš„定义åQ?br />29 ä¸ªé•¿åº¦èŒƒå›´çš„é™„åŠ ç ä½é•¿ï¼š
{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 个跼›»èŒƒå›´çš„é™„åŠ ç ä½é•¿ï¼š
{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};
读者å¯ä»¥çŸ¥é“æ¯ä¸€ä¸ªå€¼çš„实际ç 长。长度范围值和原始å—节值å¾åœ¨ä¸€‹‚‰| ‘上,节点多所以ç 长较长,30 个跼›»èŒƒå›´å€¼åªéœ€è¦?5 ä½äºŒ˜q›åˆ¶æ•°è¡¨½Cºã€‚çŸåŒšw…的长度范围å€ég½é•¿è¾ƒçŸï¼Œå—节å€?0 åQ?143 çš„ä½é•¿ä¸½{‰ï¼Œå…¶ä»–å—节值和长匹é…çš„é•¿åº¦èŒƒå›´å€ÆD¾ƒé•Ñ€‚è¿™æ ïLš„分é…åæ˜ äº?gzip ä½œè€…å¯¹â€œå¤§å¤šæ•°â€æ–‡ä»¶ä¸å„ç§å€¼çš„频率的粗略估计。作ä¸ÞZ¸€ä¸ªé€šç”¨çš„压¾~©ç®—æ³•ï¼Œæ— æ³•é¢„å…ˆçŸ¥é“一个文件的实际情况åQŒä¸å¯èƒ½åšç²¾¼‹®çš„估计ã€?br />  ˜q›ä¸€æ¥çš„æ€è€ƒï¼šé™æ€ç¼–ç æœ‰å¿…è¦å—ï¼Ÿé™æ€ç¼–ç 采用了å’?huffman ¾~–ç 相åŒçš„范å›ß_¼é™„åŠ ç çš„æ–ÒŽ¡ˆåQŒåœ¨ç 长的分é…上ä¸å¯èƒ½è¶…˜q?huffman ¾~–ç åQŒå¦‚果能“获胜â€ï¼Œé‚£å°±æ˜¯èƒœåœ¨ä¸éœ€è¦ä¿å˜ç 表上åQŒè€Œå‰é¢åˆ†æžè¿‡åQŒç 表是很å°çš„,对压¾~©çŽ‡æ²¡æœ‰å¤šå¤§å½±å“åQŒæ‰€ä»?gzip è®¾è®¡çš„è¿™ä¸ªé™æ€ç¼–ç æ–¹æ¡ˆåº”è¯¥æ˜¯å¯æœ‰å¯æ— çš„ã€?br />
5. å…³äºŽå †æŽ’åºç®—法ã€?br />  ä¼ég¹Žå·²ç»è§£å†³äº†æ‰€æœ‰çš„éšùN¢˜åQŒä½†æ˜¯å¯¹äºŽæ²¡æœ‰å¦˜q‡æ•°æ®ç»“构的读者,ä»ç„¶æœ‰ä¸€ä¸ªä¼šå¯¹ç¨‹åºæ•ˆçއäñ”生媄å“的问题需è¦å…³æ³¨ï¼Œé‚£å°±æ˜¯â€œæŽ’åºâ€ã€?br />  已ç»è®²è¿‡åQŒhuffman ½Ž—法ž®±æ˜¯ä»Žä¸€ä¸ªèŠ‚ç‚¹åºåˆ—ä¸åQŒä¸æ–找å‡ÞZ¸¤ä¸ªæœ€ž®çš„节点åQŒäؓ它们å»ÞZ¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒå€égØ“˜q™ä¸¤ä¸ªèŠ‚ç‚¹ä¹‹å’Œï¼Œç„¶åŽä»ŽèŠ‚ç‚¹åºåˆ—ä¸å޻除˜q™ä¸¤ä¸ªèŠ‚ç‚¹ï¼ŒåŠ å…¥å®ƒä»¬çš„çˆ¶èŠ‚ç‚¹åˆ°åºåˆ—ä¸åQŒä¸æ–é‡å¤è¿™æ ïLš„æ¥éª¤åQŒç›´åˆ°èŠ‚ç‚¹åºåˆ—ä¸åªå‰©ä¸‹ä¸€ä¸ªèŠ‚ç‚V€‚如何快速地扑ևºæœ€ž®çš„å…ƒç´ å‘¢ï¼Ÿ
  在普通的¾U¿æ€§ç½—列的数殾l“æž„ä¸ï¼Œä»?N ä¸ªå…ƒç´ ä¸æ‰‘Ö‡ºæœ€ž®çš„å…ƒç´ çš„æ—¶é—´å’Œ N æˆæ£æ¯”,如果数æ®ä»¥æˆ‘们所è¦ä»‹¾lçš„â€œå †â€çš„¾l“æž„å˜å‚¨åQŒæ—¶é—´å’Œ lg N æˆæ£æ¯”(注:lg ä»?2 为底敎ͼŒå¦?lg 256 = 8åQŒlg 1024 = 10 ...åQ‰ã€?集åˆä¸çš„å…ƒç´ ‘Šå¤šåQŒå †æŽ’åº½Ž—æ³•çš„ä¼˜åŠ¿è¶Š½H出åQŒè€Œä¸”å †æŽ’åºéžå¸”R€‚åˆäºŽåœ¨æ•°æ®åºåˆ—ä¸ä¸æ–地å–走最ž®çš„å…ƒç´ òq¶åŠ å…¥æ–°çš„å…ƒç´ ã€?br />
5.1 ä»€ä¹ˆæ˜¯å †ï¼Ÿ
ã€€ã€€å †é¦–å…ˆæ˜¯ä¸€‹‚µâ€œå®Œå…¨äºŒå‰æ ‘â€ï¼ŒåÏ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Œå˜æ”„¡š„™åºåºæ˜¯ï¼šä»Žæ ¹å¼€å§‹ï¼Œä¾æ¬¡å˜æ”¾æ¯ä¸€å±‚从左至å³çš„节点ã€?br />5.3 如何å¯ÀL‰¾ä»ÀL„节点的å节点和父节点åQ?br />  数组ä¸ç¬¬ k ä¸ªå…ƒç´ ï¼Œå®ƒçš„å·¦å节点是第 2k ä¸ªå…ƒç´ ï¼Œå›_节点是第 2k + 1 ä¸ªå…ƒç´ ã€‚å®ƒçš„çˆ¶èŠ‚ç‚¹æ˜¯â”– k/2 ┚(注:â”?X ┚表½Cºå°äºŽç‰äº?X 的最大整敎ͼ‰ã€?br />5.4 å¦‚ä½•å»ºç«‹å †ï¼Ÿ
  先把 n ä¸ªå…ƒç´ ä¾‹Æ¡æ”¾å…¥æ•°¾l„ä¸åQŒä×oå˜é‡ k = â”?n/2 ┚,˜q™æ—¶½W?k ä¸ªå…ƒç´ æ˜¯æœ€åŽä¸€ä¸ªå…ƒç´ 的父节点,从第 k ä¸ªå…ƒç´ çš„ä¸¤ä¸ªåèŠ‚ç‚¹ä¸æ‰‘Ö‡ºè¾ƒå°çš„一个与 k å…ƒç´ æ¯”è¾ƒåQŒå¦‚æžœå°äº?k å…ƒç´ åQŒå°±å’?k å…ƒç´ äº¤æ¢ä¸€ä¸‹ä½¾|®ï¼Œæ¢ä½åŽçš„原先çš?k å…ƒç´ å†å’Œæ–°çš„å节ç‚ÒŽ¯”较(如果有å节点的è¯åQ‰ï¼Œç›´åˆ°å®ƒä¸å†å°äºŽæ–°çš„å节点或没有å节点。ä×o k = k - 1。å†é‡å¤ä¸Šé¢çš„åšæ³•ç›´åˆ?k < 1åQŒä¸€ä¸ªå †ž®±å¾æˆäº†ã€?br />5.5 å¦‚ä½•ä»Žå †ä¸æ‰¾å‡ºç¬¬äºŒä¸ªæœ€ž®çš„å…ƒç´ åQ?br />ã€€ã€€æŠŠå †ä¸ç¬¬ä¸€ä¸ªå…ƒç´ (最ž®çš„å…ƒç´ åQ‰å˜æ”‘Öˆ°å…¶ä»–地方åQŒæŠŠ½W?n ä¸ªå…ƒç´ ï¼ˆæœ€åŽä¸€ä¸ªï¼‰æ”‘Öˆ°½W¬ä¸€ä¸ªçš„ä½ç½®åQŒå†ç”¨å‰é¢çš„æ–ÒŽ³•和下层节点交æ¢ç›´åˆ°å®ƒæ”‘Öˆ°åˆé€‚çš„ä½ç½®åQŒè¿™æ—¶æ•°¾l„ä»ç„¶æ˜¯ä¸€ä¸ªå †åQŒç¬¬ä¸€ä¸ªå…ƒç´ 是最ž®çš„节点åQŒæ•°¾l„的最åŽä¸€ä¸ªæœ‰æ•ˆèŠ‚ç‚ÒŽ˜¯½W?n - 1 ä¸ªå…ƒç´ ã€?br />  èŠÞp´¹çš„æ—¶é—´å’Œäº¤æ¢çš„æ¬¡æ•°æˆæ£æ¯”åQŒæœ€å¤§çš„å¯èƒ½çš„äº¤æ¢æ¬¡æ•°æ˜¯åQ?å †çš„å±‚æ•° - 1 =â”?lg (å…ƒç´ æ•?+ 1) â”? 1åQˆæ³¨åQšâ” X ┒表½Cºå¤§äºŽç‰äº?X 的最ž®æ•´æ•ŽÍ¼‰ã€?br />  现在å¯ä»¥çœ‹åˆ°åQŒå †ä¹‹æ‰€ä»¥é‡‡ç”¨å®Œå…¨äºŒå‰æ ‘çš„åÅžå¼ï¼Œæ˜¯äØ“äº†æ ‘çš„å±‚æ•°å°½å¯èƒ½ž®‘ã€?br />  而抽出最åŽä¸€ä¸ªå…ƒç´ æ”¾åˆ°æ ‘æ ¹ï¼Œè€Œä¸æ˜¯æŠ½å‡ºç¬¬äºŒå±‚çš„å…ƒç´ ï¼Œæ˜¯äØ“äº†ç»´æŒå®Œå…¨äºŒå‰æ ‘的结构ï¼
5.6 å¦‚ä½•åŠ å…¥æ–°çš„å…ƒç´ åˆ°å †ä¸ï¼Ÿ
ã€€ã€€æŠŠç¬¬ä¸€ä¸ªå…ƒç´ å˜æ”‘Öˆ°å…¶ä»–地方åQŒæŠŠæ–°çš„å…ƒç´ æ”‘Öˆ°½W¬ä¸€ä¸ªçš„ä½ç½®åQŒå†ç”¨å‰é¢çš„æ–ÒŽ³•和下层节点交æ¢ï¼Œç›´åˆ°å®ƒè¢«æ”‘Öˆ°åˆé€‚çš„ä½ç½®åQŒæ¤æ—¶æ•°¾l„ä¸ä»ç„¶æ˜¯ä¸€ä¸ªå †ã€?br />
6. å»?huffman æ ‘å’Œ¾~–ç 的算法:
  如果现在æœ?n 个待¾~–ç 的节点,按照原始数å€ég»Žž®åˆ°å¤§å˜æ”‘Öœ¨æ•°ç»„ tree[n] ä¸ï¼Œé‚£ä¹ˆåQŒå°†è¦å¾ç«‹çš„ huffman æ ‘æ€Õd…±ä¼šæœ‰ 2n -1 节点åQŒåŒ…括å¶å节点和éžå¶å节ç‚V€‚申请一å—内å˜ï¼Œå¤§å°æ˜¯èƒ½æ”¾ä¸‹ huffman æ ‘çš„æ‰€æœ‰èŠ‚ç‚¹ï¼Œå…ˆæŠŠ n 个待¾~–ç 节点攑օ¥˜q™å—内å˜çš„左端,然åŽç”¨â€œå †æŽ’åºâ€ç®—æ³•å…ˆæŠŠå®ƒä»¬å¾æˆä¸€ä¸ªå †ã€?br />  然åŽä¸æ–ç”¨â€œå †æŽ’åºâ€ç®—法å–出频率最ž®çš„节点åQŒæŠŠå®ƒä»¬ä»Žå³åˆ°å·¦ã€ä»Žž®åˆ°å¤§æŽ’攑֜¨å†…å˜å—çš„å³ç«¯åQŒæ¯å½“å–å‡ÞZ¸¤ä¸ªèŠ‚ç‚¹ï¼Œ¾l™å®ƒä»¬ç”Ÿæˆä¸€ä¸ªçˆ¶èŠ‚ç‚¹åQŒé¢‘率ç‰äºŽå®ƒä»¬ä¹‹å’Œï¼ŒåŠ å…¥å †ä¸ã€‚è¿™æ ïL›´åˆ°å †ä¸åªå‰©ä¸‹ä¸€ä¸ªæ ¹èŠ‚ç‚¹åQŒè¿™æ—Óž¼Œå†…å˜ä¸ä»Žå·¦åˆ°å›_˜å‚¨çš„æ˜¯é¢‘率从大到ž®çš„æ‰€æœ‰èŠ‚ç‚¹ï¼Œä¸€‹‚?huffman æ ‘å…¶å®žä¹Ÿž®±å¾æˆäº†åQŒå±‚æ•°å°çš„节点在å‰ï¼Œå±‚数大的节点在åŽåQŒæ¯ä¸€å±‚çš„èŠ‚ç‚¹åˆæ˜¯æŒ‰é¢‘率从大到ž®ä¾‹Æ¡æŽ’列ã€?br />  甌™¯·ä¸¤ä¸ªæ•°ç»„åQšbl_count[]åQŒbl_base[]ã€‚ç½®æ ¹èŠ‚ç‚¹çš„ç é•¿ä¸?0åQŒä»Žå·¦è‡³å»I¼Œæ‰€æœ‰èŠ‚ç‚¹çš„ç é•¿(len)为它的父节点的ç é•?+ 1åQŒå¦‚果是å¶å节点åQŒbl_count[len]++åQŒå¾—åˆîCº†æ¯ä¸€å±‚上的å¶å节ç‚ÒŽ•°ç›®ã€‚ä×oå˜é‡ 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 />  现在所有待¾~–ç 节点都被赋予了ç 长,é历待编ç 节点,æ ÒŽ®å®ƒä»¬çš„ç 长得到它们的¾~–ç åQšåºå?n 递增åQŒtree[n].code = bl_base[ tree[n].len ] ++ã€?br />  注æ„åQšæˆ‘ä»¬å‰é¢è®¨è®ºç 表的时候说˜q‡ï¼Œgzip å¯?huffman ¾~–ç ˜q›è¡Œäº†æ”¹˜q›ï¼Œåªéœ€è¦å¾—到æ¯ä¸€ä¸ªå¶å节点(待编ç 节点)的ç 长,ž®±å¯ä»¥è¿›è¡Œç¼–ç ,而ä¸éœ€è¦å…³å¿ƒå®ƒçš„çˆ¶èŠ‚ç‚¹çš„ç¼–ç æ˜¯ä»€ä¹ˆã€‚而ä¿å˜ç 表时åQŒåªéœ€è¦ä¿å˜ç é•Ñ€?br />
动æ€?huffman 压羃和解压的整个‹¹ç¨‹åQ?br />压羃åQ?br />  lz77 的压¾~©è¿‡½E‹ä¸è¾“出未匹é…çš„å•åŒå—节åQŒå’ŒåŒšw…åQŒåƈ¾lŸè®¡å„å—节值和匚w…长度范围ã€åŒ¹é…è·¼›»èŒƒå›´çš„频率åQŒæ ¹æ®è¿™äº›é¢‘率å¾ç«‹ä¸¤‹‚?huffman æ ‘ï¼šltreeã€dtreeåQŒå¾—åˆ°è¿™ä¸¤æ£µæ ‘ä¸Šæ‰€æœ‰èŠ‚ç‚¹çš„é•¿åº¦å’Œç¼–ç ã€?br />  ¾lŸè®¡˜q™ä¸¤‹‚‰| ‘节点长度的ä‹É用频率,对å„节点长度建立 huffman æ ‘ï¼šbl_treeåQŒå¾—åˆ?bl_tree 的长度和¾~–ç ã€?br />  å˜å‚¨ bl_tree 的节炚w•¿åº¦æ•°¾l„ã€?br />  å†ç”¨ bl_tree 的编ç å˜å‚?ltreeã€dtree 的节炚w•¿åº¦æ•°¾l„ã€?br />  å†ç”¨ ltree 的编ç å˜å‚¨å„å—节值和匚w…长度范围åQˆåŠé™„åŠ ç )的æµåQ›ç”¨ dtree 的编ç å˜å‚¨åŒ¹é…è·¼›»èŒƒå›ß_¼ˆåŠé™„åŠ ç åQ‰çš„‹¹ã€?br />解压åQ?br />ã€€ã€€å…ˆæ ¹æ?bl_tree 的节炚w•¿åº¦æ•°¾l„å¾—åˆ?bl_tree 的编ç ã€?br />  å†ç”¨˜q™äº›¾~–ç 得到 ltreeã€dtree 的节炚w•¿åº¦æ•°¾l„,˜q›è€Œå¾—åˆ?ltreeã€dtree 的编ç ã€?br />ã€€ã€€å†æ ¹æ?ltreeã€dtree 的编ç åŠé™„åŠ ç 的定义åQŒå¾—åˆ?lz77 的输出的原始¾l“æžœåQšå„å—节值和匚w…长度的æµåQŒåŒ¹é…è·¼›Èš„‹¹ã€?/div>Â