ï»??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šä¾‹å¦‚,æ‚(zh¨¨n)¨æ„识到æ‚(zh¨¨n)¨çš„雇员å¯èƒ½æœ‰ä¸¤ä¸ªåœ°å€åQŒåÆˆä¸”åœæ¢è·Ÿítªé›‡å‘˜ï¼ˆemployeeåQ‰è¡¨ä¸çš„åœ°å€ åˆ—å˜å®½äº†ã€‚如æœå®ƒæ˜?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找资料: Â
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ß_(d¨¢)¼
三年是个å?
毕业˜q™ä¸ªä¸‰å¹´åQŒæˆ‘没有什么戮±ã€?br />
æ¥ä¸‹æ¥çš„三年呢?
å¯Ò(gu¨©)¯”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 ä¸å…许æ?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ˆemployee_addressåQ‰è¡¨ä¹‹é—´ç°åœ¨æœ?n:m 关系åQ‰ã€‚在雇员表上创å¾ä¸€ä¸ªä¸åŒ…å«åœ°å€åˆ—的视图ã€?
å¦‚æœæ‚(zh¨¨n)¨çœŸçš„è¦ç”¨æ–°å¥‡çš„æ–Ò(gu¨©)³•åQŒå¯ä»¥ä‹Éç”?RENAME TABLE 命ä×o(h¨´)¾l™åŸºè¡¨ä¸€ä¸ªæ–°çš„å¿UͼŒç„¶å®†åŸå§‹è¡¨åä½œä¸ø™¯¥è§†å›¾çš?br />å称。æ?zh¨¨n)¨çš„视图也å¯ä»¥˜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¾ä¼š(x¨¬)之间的桥æ¢ï¼Œ®†æ¥å¯ä»¥åšé”€å”®ï¼Œåšç®¡ç†ï¼Œç”¨è‡ªå·±é€æ¸¿U¯ç¯èµäh¥çš„æ™ºæ…§å’Œ¾l验在社ä¼?x¨¬)上打拼ã€?br />但是åQŒåœ¨æŠ€æœ¯ä¸Šæ¥è¯´åQŒè¯šå®åœ°è¯ß_(d¨¢)¼Œ˜q™åƈä¸é«˜æ·±ï¼Œä¸æ˜¯å—?½W¬ä¸€‹¹çš„å…¬å¸å¦‚微软ã€Sybaseã€Oracle ½{‰æ€ÀL˜¯é¢å‘½C¾ä¼š(x¨¬)大众的,˜q™æ ·æ‰èƒ½æœ‰å·¨å¤§çš„市场。但是他们往往也是站在½C¾ä¼š(x¨¬)的最™å¶å±‚的:(x¨¬)æ“作¾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Œæˆ‘也想æˆäØ“(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Ÿï¼‰å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¨¬)è¢«ç ´å(除é先进行解ç )。å¦å¤–,çŸè¯å¼å‹¾~©å的结æœï¼š(x¨¬)那些剩下的未被匹é…çš„å•ã€åŒå—节和得到匹é…çš„è·ç¦»ã€é•¿åº¦å€ég»ç„¶å…·æœ‰å–值分布ä¸å‡åŒ€æ€§ï¼Œå› æ¤åQŒä¸¤¿U勾~©æ–¹å¼çš„™åºåºä¸èƒ½å˜ã€?br />  在编ç å¼å‹ç¾ƒå,以迾l的八ä½ä½œäØ“(f¨´)一个å—节,åŸå…ˆæœªå‹¾~©æ–‡ä»¶ä¸æ‰€å…ähœ‰çš„å—节å–å€ég¸å‡åŒ€çš„å€‘Ö‘è¢«å½»åº•ç ´å,æˆäØ“(f¨´)éšæœºæ€§å–å€û|¼Œæ Ò(gu¨©)®¾lŸè®¡å¦çŸ¥è¯†ï¼Œéšæœºæ€§å–值具有å‡åŒ€æ€§çš„們֑åQˆæ¯”如抛¼‹¬å¸è¯•验åQŒæŠ›ä¸€åƒæ¬¡åQŒæ£å颿œä¸Šçš„æ¬¡æ•°éƒ½æ¥è¿‘äº?500 ‹Æ¡ï¼‰ã€‚å› æ¤ï¼Œ¾~–ç å¼å‹¾~©åçš„ç»“æœæ— 法冘q›è¡Œ¾~–ç å¼å‹¾~©ã€?br />  çŸè¯å¼å‹¾~©å’Œ¾~–ç å¼å‹¾~©æ˜¯ç›®å‰è®¡ç®—机科å¦ç•Œç ”究出的仅有的两¿Uæ— æŸå‹¾~©æ–¹æ³•ï¼Œå®ƒä»¬éƒ½æ— æ³•é‡å¤è¿›è¡Œï¼Œæ‰€ä»¥ï¼Œå‹ç¾ƒæ–‡äšgæ— æ³•å†æ¬¡å‹ç¾ƒåQˆå®é™…上åQŒèƒ½å夘q›è¡Œçš„勾~©ç®—法是ä¸å¯æƒŒ™±¡çš„ï¼Œå› äØ“(f¨´)最¾lˆä¼š(x¨¬)å‹ç¾ƒåˆ?0 å—节åQ‰ã€?br />=====================================
åQˆè¡¥å……)
å‹ç¾ƒæ–‡äš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Œå¯ä»¥å»æ‰è¿™ä¸ªå节点。)
         æ ?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ƒ½æ— 法和下层节点交æ¢ï¼‰åQŒå¿…™åȬ¦åˆè¿™æ ·ä¸¤ä¸ªæ¡ä»Ó¼š(x¨¬)
åQ‘ï¼æ‰€æœ‰ä¸Šå±‚节炚wƒ½å¤§äº½{‰äºä¸‹å±‚节点ã€?br />åQ’ï¼æŸèŠ‚ç‚¹ï¼Œè®‘Ö…¶è¾ƒå¤§çš„å节点为ï½åQŒè¾ƒ?y¨u)®çš„å节点äØ?f¨´)ï½ï¼Œï½ä¸‹çš„ä“Q一层的所有节炚wƒ½åº”大äºç‰äºï½ä¸‹çš„该层的所有节ç‚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ˆæˆ´Â·éœå¤«æ›û|¼‰æå‡ºå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½•两个节点的父节点都大äºï¼ˆæˆ–ç‰äºï¼‰˜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ˆå¶å节点)数å‡åQ‘ã€?br />åQ’ï¼äºŒå‰¾~–ç æ ?w¨¨i)çš„å¤–éƒ¨èŠ‚ç‚¹çš„åŠ æƒèµ\径长度(å€ég¹˜ä»¥èµ\径长度)之和åQŒç‰äºæ‰€æœ‰å†…部节点å€ég¹‹å’Œã€‚(˜q™ä¸¤æ¡éƒ½å¯ä»¥é€šè¿‡å¯¹èŠ‚ç‚Ò(gu¨©)•°˜q用数å¦å½’纳法æ¥è¯æ˜åQŒç•™¾l™å¤§å®¶åš¾lƒä¹ (f¨¤n)。)
å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¨¬)å¢åŠ åŠ æƒè·¯å¾„长度。)
åQ•ï¼éšç€å†…部节点数é€ä¸ªå¢åŠ åQŒå†…部节炚w›†åˆæ€È»´æŒæ®åŒ–ã€?br />
[ 本帖ç”?ncs 最åç¼–è¾‘äº 2006-3-3 14:54 ]
æœçƒ¦æ›´å¤šç›¸å…³ä¸»é¢˜çš„帖å?
zip
åŸç†
Â
  如æœä¸–ç•Œä¸Šä»æ²¡æœ‰ä¸€ä¸ªå‹¾~©ç¨‹åºï¼Œæˆ‘们看了å‰é¢çš„勾~©åŸç†ï¼Œ®†æœ‰ä¿¡å¿ƒä¸€å®šèƒ½ä½œå‡ºä¸€ä¸ªå¯ä»¥å‹¾~©å¤§å¤šæ•°æ ¼å¼ã€å†…容的数æ®çš„程åºï¼Œå½“æˆ‘ä»¬ç€æ‰‹è¦åšè¿™æ ·ä¸€ä¸ªç¨‹åºçš„æ—¶å€™ï¼Œä¼?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ºçš„æ•°å—大å°çš„范围是有é™çš„,ï½ä½çš„二˜q›åˆ¶æ•°èƒ½è¡¨ç¤ºçš„æœ€å¤§å€¼æ˜¯åQ’çš„ï½æ¬¡æ–¹å‡å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 ä½ï¼Œå—典的容é‡å—到é™åˆ¶ã€‚æ‰€ä»¥åŒæ ·éœ€è¦å–èˆã€‚)
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 çœ‹ä¼¼å¤æ‚ã€ä¸ç›´è§‚çš„åšæ³•çš„æ„义有更好的ç†è§£ã€‚)
最直观的æœç´¢æ–¹å¼æ˜¯™åºåºæœçƒ¦åQšä»¥å¾…勾~©éƒ¨åˆ†çš„½W¬ä¸€ä¸ªå—节丽H—å£ä¸çš„æ¯ä¸€ä¸ªå—节例ơ比较,当找åˆîC¸€ä¸ªç›¸½{‰çš„å—节æ—Ó¼Œå†æ¯”较å¾lçš„å—节…â€?éå†äº†çª—å£å得出最长匹é…。gzip 用的是被¿UîC½œâ€œå“ˆå¸Œè¡¨â€çš„æ–Ò(gu¨©)³•æ¥å®ç°è¾ƒé«˜æ•ˆçš„æœç´¢ã€‚â€œå“ˆå¸Œï¼ˆhashåQ‰â€æ˜¯åˆ†æ•£çš„æ„æ€ï¼ŒæŠŠå¾…æœçƒ¦çš„æ•°æ®æŒ‰ç…§å—节值分散到一个个“桶â€ä¸åQŒæœç´¢æ—¶å†æ ¹æ®å—节值到相应的“桶â€ä¸åÕd¯»æ‰¾ã€‚çŸè¯å¼å‹ç¾ƒçš„æœ€çŸåŒ¹é…䨓(f¨´) 3 个å—节,gzip ä»?3 个å—节的å€ég½œä¸ºå“ˆå¸Œè¡¨çš„烦引,ä½?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Œä‹Éæœçƒ¦çš„æ•ˆç‡é™ä½ã€?.函数的计½—å°½å¯èƒ½åœ°ç®€å•ï¼Œå› äØ“(f¨´)æ¯æ¬¡â€œæ’å…¥â€å’Œâ€œæœå¯ Z€å“ˆå¸Œè¡¨éƒ½è¦æ‰§è¡Œå“ˆå¸Œå‡½æ•°åQŒå“ˆå¸Œå‡½æ•°çš„夿‚度直æ¥åª„å“程åºçš„æ‰§è¡Œæ•ˆç‡åQŒå®¹æ˜“æƒ³åˆ°çš„å“ˆå¸Œå‡½æ•°æ˜¯å– 3 个å—节的左边åQˆæˆ–匙¾¹åQ?5 ä½äºŒ˜q›åˆ¶å€û|¼Œä½†è¿™æ ·åªè¦å·¦è¾¹ï¼ˆæˆ–å³è¾¹ï¼‰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›åˆ¶ç ,“^â€æ˜¯äºŒè¿›åˆ¶ä½çš„异或æ“作,â€?â€æ˜¯â€œè¿æ¥â€è€Œä¸æ˜¯â€œåŠ â€ï¼Œâ€œ^â€ä¼˜å…ˆäºâ€?â€ï¼‰˜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 相åŒã€‚)™åºç€ 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[] ä¸å»æœçƒ¦äº†ï¼Œå› 䨓(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¸ä¸€å®šæ˜¯ä¸€ä¸ªçª—å£ä»¥å†…的。在æœçƒ¦æ—Ó¼Œ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Œå¯¹æœçƒ¦æ•ˆç‡çš„媄å“ä¸å¤§ã€‚å¯ä»¥é¢„计,在“一般情况â€ä¸‹åQŒæ¯ä¸ªâ€œæ¡¶â€ä¸å˜æ”¾çš„æ•°æ®ï¼Œæ£æ˜¯æˆ‘ä»¬è¦æ‰¾çš„。哈希表在儿Uæœç´¢ç®—法ä¸åQŒå®ç°ç›¸å¯¹çš„æ¯”较½€å•,å®Ò(gu¨©)˜“ç†è§£åQŒâ€œåã^凿œç´¢é€Ÿåº¦â€æœ€å¿«ï¼Œå“ˆå¸Œå‡½æ•°çš„设计是æœçƒ¦é€Ÿåº¦çš„关键,åªè¦½W¦åˆâ€œåã^å‡åˆ†å¸ƒâ€å’Œâ€œè®¡½—简å•â€ï¼Œ®±å¸¸å¸¸èƒ½æˆäØ“(f¨´)è¯¸ç§æœçƒ¦½—法ä¸çš„首选,所以哈希表是最‹¹è¡Œçš„一¿Uæœç´¢ç®—法。但在æŸäº›ç‰¹ŒDŠæƒ…况下åQŒå®ƒä¹Ÿæœ‰¾~ºç‚¹åQŒæ¯”如:(x¨¬)1.当键ç ?k ä¸å˜åœ¨æ—¶åQŒè¦æ±‚找出å°äº?k çš„æœ€å¤§é”®ç æˆ–å¤§äº k 的最®é”®ç ï¼Œå“ˆå¸Œè¡¨æ— æ³•æœ‰æ•ˆç‡åœ°æ»¡‘Œ™¿™¿Uè¦æ±‚ã€?.哈希表的“åã^凿œç´¢é€Ÿåº¦â€æ˜¯å»ºç«‹åœ¨æ¦‚ç‡è®ºçš„基¼‹€ä¸Šçš„åQŒå› 个Zº‹å…ˆä¸èƒ½é¢„知待æœçƒ¦çš„æ•°æ®é›†åˆï¼Œæˆ‘们åªèƒ½â€œä¿¡èµ–â€æœç´¢é€Ÿåº¦çš„“åã^å‡å€¼â€ï¼Œè€Œä¸èƒ½â€œä¿è¯â€æœç´¢é€Ÿåº¦çš„“上é™â€ã€‚在åŒäh¾cÀL€§å‘½æ”¸å…³çš„应用ä¸åQˆå¦‚åŒÈ–—或宇航领域)åQŒå°†æ˜¯ä¸åˆé€‚的。这些情况åŠ(qi¨¢ng)其他一些特ŒDŠæƒ…况下åQŒæˆ‘们必™åÀL±‚助其他“åã^å‡é€Ÿåº¦â€è¾ƒä½ï¼Œä½†èƒ½æ»¡èƒö相应的特ŒDŠè¦æ±‚çš„½—法。(è§ã€Šè®¡½—机½E‹åºè®¾è®¡è‰ºæœ¯ã€‹ç¬¬3å?æ’åºä¸æŸ¥æ‰¾ï¼‰ã€‚幸而“在½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‡ï¼Œæœçƒ¦åŒš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 æ£å¥½èƒ½å½’å…¥å†åé¢çš„一个匹é…,那懒惰匹é…å¯èƒ½æ˜¯æœ‰ç›Šçš„。)
7. ¾l¼åˆè€ƒè™‘å„ç§å› ç´ åQˆåŒ¹é…数和未匚w…çš„å•åŒå—节在åŸå§‹æ–‡äšg䏿‰€å 的比例åQŒå一个匹é…长度大äºå‰ä¸€ä¸ªåŒ¹é…长度的概ç‡åQŒç‰½{‰ï¼‰åQŒç»˜q‡æ”¹˜q›çš„æ‡’惰匚w…½—法åQŒå¯¹æ€Èš„å‹ç¾ƒç‡å³ä½¿æœ‰è´¡çŒ®åQŒä¹Ÿä»æ˜¯å¾ˆå°çš„,而且也ä»ç„¶å¾ˆæœ‰å¯èƒ½ä¼š(x¨¬)é™ä½å‹ç¾ƒç‡ã€‚å†è€ƒè™‘到时间的¼‹®å®šçš„æ˜æ˜„¡š„å¢åŠ ä¸å‹¾~©ç‡çš„丼‹®å®šçš„å¾®å¼Şqš„å¢ç›ŠåQŒä¹Ÿè®¸æœ€å¥½çš„æ”¹è¿›æ˜¯æœæ–地攑ּƒæ‡’惰匚w…ã€?/div>
Â
¾~–ç å¼å‹¾~©çš„å‡ ç‚¹è€ƒè™‘å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¯å‹çš„æ•°æ®ï¼ˆå¦‚æœæœ‰ï¼‰çš„频ç‡ä¸å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Œå½“ç„Ó¼Œä¸¤ç§æƒ…况也都有å¯èƒ½é™ä½å‹¾~©ç‡å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ˆé¢‘ç‡é«˜çš„节点)ä¸é™æ€ç¼–ç 预先拟定的优势节点相近åQŒé‡‡ç”¨é™æ€ç¼–ç åæœ‰ç¨è®¸æ”¹å–„,其他部分则ä¸é™æ€ç¼–ç 预先拟定的优势节点有一定分æ§ï¼Œé‡‡ç”¨é™æ€ç¼–ç åä¼?x¨¬)有½E许ä¸åˆ©ã€‚之所以说“ç¨è®¸â€ï¼Œæ˜¯å› 为我们已知åŒä¸€ä¸ªæ®µè½é‡Œçš„å„éƒ¨åˆ†æ•°æ®æˆ–è€…äº’ç›æ€¿ƒ˜q›ï¼Œæˆ–者仅有ç¨è®¸å¦¨å®»I¼Œè¯´æ˜å®ƒä»¬çš„优势节ç‚Ò(gu¨©)˜¯å¤§è‡´‘‹åŒçš„。考虑到拆分åå¯èƒ½è¦å¤šä¿å˜å‡ 䆾ç 表å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Œæ˜¯å› 䨓(f¨´)¾~–ç æ˜¯ä¸å®šé•¿çš„,没有ç é•¿åQŒè§£å‹æ—¶æ— 法æ£ç¡®è¯Õd–¾~–ç 。ç é•¿å¿…™åÀL˜¯å®šé•¿çš„,也就是说必须é™åˆ¶ huffman æ ?w¨¨i)的最大层æ•ͼŒä½¿ç é•¿çš„ä½æ•°èƒ½æ°å¥½è¡¨½Cø™¿™ä¸ªå±‚数。é™åˆ?huffman æ ?w¨¨i)的最大层数的æ–Ò(gu¨©)³•是:(x¨¬)如æœè§„定的最大层æ•îCØ“(f¨´) nåQŒåˆ™åœ?n - 1 层找åˆîC¸€ä¸ªå¶å节ç‚?aåQˆå¦‚æ?n - 1 层没有å¶å节点,®±é€å±‚地往上寻找,直到扑ֈ°ä¸€ä¸ªå¶å节点)å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Œç é•¿å˜åŒ–å的媄å“å°ã€‚å‡è®¾æ¯ä¸€å±‚节点的频ç‡ç›¸è¿‘å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ä½ã€‚)˜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€‚)˜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 çš„è¿™äº›åšæ³•进行阅读(æºä»£ç )ã€åˆ†æã€æŒ–æ˜å…¶ä¸çš„æ™ºæ…§å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 的节点)åQŒä¸€¿U方法是ä¿å˜æœ‰æ•ˆèŠ‚ç‚¹çš„åŸå§‹å€¼å’Œæ–°ç¼–ç çš„ç é•¿åQŒå½“有效节点‘…过所有节点的1/4åQŒè¿™¿U方法ä¿å˜çš„ç 表的大®ä¼š(x¨¬)‘…过 3.1.1 的方法ã€?br />  gzip 采用的方法是åQšåœ¨ 3.1.1 的基¼‹€ä¸Šï¼Œäºè‹¥òq²ç§ç 长之外åQŒå¢åŠ ä¸€äº›ç‰¹ŒDŠçš„å€û|¼Œä»–们表示当å‰ä¸ŞZ¹‹å‰ä¸€ä¸ªç 长或 0 ç é•¿åQˆæ— 效节点)的é‡å¤ï¼Œé‡åˆ°˜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‘)的情况ä¸å¸¸è§å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¨¬)对å‹ç¾ƒç‡äñ”生ä¸è‰¯åª„å“ã€‚å› æ¤è¦æ±‚划分åå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šä¸æ˜¯â€œåŒ¹é…å—节数â€ï¼‰å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¨¬)媄å“勾~©ç‡çš„ã€?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>
Â
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¨¬)å¯¹ç¨‹åºæ•ˆç‡äñ”生媄å“的问题需è¦å…³æ³¨ï¼Œé‚£å°±æ˜¯â€œæ’åºâ€ã€?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 的最大整æ•ͼ‰ã€?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 ä¸ªå…ƒç´ ï¼ˆæœ€å一个)攑ֈ°½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 的最®æ•´æ•ͼ‰ã€?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›ï¼Œåªéœ€è¦å¾—到æ¯ä¸€ä¸ªå¶å节点(待编ç 节点)的ç 长,®±å¯ä»¥è¿›è¡Œç¼–ç ,而ä¸éœ€è¦å…³å¿ƒå®ƒçš„çˆ¶èŠ‚ç‚¹çš„ç¼–ç æ˜¯ä»€ä¹ˆã€‚而ä¿å˜ç 表时å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)é™„åŠ ç )的æµå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>Â