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