锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏁版嵁鍘嬬緝鍙垎鎴愪袱縐嶇被鍨嬶紝涓縐嶅彨鍋氭棤鎹熷帇緙╋紝鍙︿竴縐嶅彨鍋氭湁鎹熷帇緙┿?br />鏃?
鎹熷帇緙╂槸鎸囦嬌鐢ㄥ帇緙╁悗鐨勬暟鎹繘琛岄噸鏋?鎴栬呭彨鍋氳繕鍘燂紝瑙e帇緙?錛岄噸鏋勫悗鐨勬暟鎹笌鍘熸潵鐨勬暟鎹畬鍏ㄧ浉鍚岋紱鏃犳崯鍘嬬緝鐢ㄤ簬瑕佹眰閲嶆瀯鐨勪俊鍙蜂笌鍘熷淇″彿瀹屽叏涓鑷寸殑鍦?
鍚堛傜鐩樻枃浠剁殑鍘嬬緝灝辨槸涓涓緢甯歌鐨勪緥瀛愩傛牴鎹洰鍓嶇殑鎶鏈按騫籌紝鏃犳崯鍘嬬緝綆楁硶涓鑸彲浠ユ妸鏅氭枃浠剁殑鏁版嵁鍘嬬緝鍒板師鏉ョ殑1/2锝?/4銆?br />鏈夋崯鍘嬬緝鏄寚浣跨敤鍘嬬緝鍚庣殑鏁版嵁榪涜閲嶆瀯錛岄噸鏋勫悗鐨勬暟鎹笌鍘熸潵鐨勬暟鎹湁鎵涓嶅悓錛屼絾涓嶄細璁╀漢瀵瑰師濮嬭祫鏂?br />琛?
杈劇殑淇℃伅閫犳垚璇В銆傛湁鎹熷帇緙╅傜敤浜庨噸鏋勪俊鍙蜂笉涓瀹氶潪瑕佸拰鍘熷淇″彿瀹屽叏鐩稿悓鐨勫満鍚堛備緥濡傦紝鍥懼儚鍜屽0闊崇殑鍘嬬緝灝卞彲浠ラ噰鐢ㄦ湁鎹熷帇緙╋紝鍥犱負鍏朵腑鍖呭惈鐨勬暟鎹線寰澶氫簬
鎴戜滑鐨勮瑙夌郴緇熷拰鍚緋葷粺鎵鑳芥帴鏀剁殑淇℃伅錛屼涪鎺変竴浜涙暟鎹屼笉鑷充簬瀵瑰0闊蟲垨鑰呭浘鍍忔墍琛ㄨ揪鐨勬剰鎬濅駭鐢熻瑙o紝浣嗗彲澶уぇ鎻愰珮鍘嬬緝姣斻?br />
鍘嬬緝鎶鏈ぇ鑷村彲浠ユ寜鐓т互涓嬬殑鏂規硶鍒嗙被錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鍘嬬緝鎶鏈?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------------------------------\
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽閫氱敤鏃犳崯鏁版嵁鍘嬬緝 聽聽聽聽聽聽聽聽聽聽聽聽澶氬獟浣撴暟鎹帇緙?澶у涓烘湁鎹熷帇緙?
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
| 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/----------------\聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------------------------------------\
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍩轟簬緇熻聽聽聽聽聽聽聽聽聽 鍩轟簬瀛楀吀聽聽聽闊抽鍘嬬緝聽聽聽聽聽聽聽聽 鍥懼儚鍘嬬緝聽聽聽聽聽聽聽聽聽聽聽聽聽聽 瑙嗛鍘嬬緝
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
妯″瀷鐨勫帇 聽聽聽聽聽聽聽聽妯″瀷鐨勫帇 聽聽聽聽聽聽聽聽| 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽緙╂妧鏈?聽聽聽聽聽聽聽聽聽聽聽聽緙╂妧鏈?聽聽聽聽聽聽聽聽MP3絳?聽聽聽聽/-------------------\聽聽聽聽聽聽聽聽聽聽聽聽AVI
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浜屽?鐏板害 褰╄壊
鐭㈤噺聽聽聽聽聽聽 MPEG2絳?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------\ 聽聽聽聽聽聽聽聽/-------------\聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍥懼儚 鍥懼儚 鍥懼儚 鍥懼儚
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Huffman 綆楁湳 LZ77 LZ78 LZW聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽| 聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽 聽|聽聽聽聽聽聽聽聽\聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽緙栫爜 聽聽聽聽緙栫爜 聽聽聽聽\-------------/聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浼犵湡鏈?FELICS GIF 聽聽聽聽聽聽聽聽PostScript
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 | 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鏍囧噯
聽聽聽聽JPEG絳?JPEG絳?Windows WMF絳?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽UNIX涓?聽聽聽聽聽聽聽聽聽 鎺ヨ繎鏃犳崯聽聽聽聽聽聽聽PKZIP銆丩Harc銆丄RJ銆?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鐨凜OMPACT聽 鍘嬬緝鏋侀檺聽聽聽聽聽聽聽聽UNIX涓嬬殑COMPRESS
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽紼嬪簭絳壜犅犅犅犅犅犅犅犅犅犅犅?鐨勯珮綰у簲鐢犅犅犅犵▼搴忕瓑
閫氱敤鏃犳崯鏁版嵁鍘嬬緝鐨勫巻鍙?br />縐戝瀹跺湪鐮旂┒涓彂鐜幫紝澶у鏁頒俊鎭殑琛ㄨ揪閮藉瓨鍦ㄧ潃涓瀹氱殑鍐椾綑搴︼紝閫氳繃閲囩敤涓瀹氱殑妯″瀷鍜岀紪鐮佹柟娉曪紝鍙互
闄嶄綆榪欑鍐椾綑搴︺傝礉灝斿疄楠屽鐨?Claude Shannon 鍜?MIT 鐨?R.M.Fano 鍑犱箮鍚屾椂鎻愬嚭浜嗘渶鏃╃殑瀵圭鍙瘋繘琛屾湁
鏁堢紪鐮佷粠鑰屽疄鐜版暟鎹帇緙╃殑 Shannon-Fano 緙栫爜鏂規硶銆?br />
D.A.Huffman
浜?952騫寸涓嬈″彂琛ㄤ簡浠栫殑璁烘枃鈥滄渶灝忓啑浣欎唬鐮佺殑鏋勯犳柟娉曗?A Method for the Construction of Minimum
Redundancy Codes)銆備粠姝わ紝鏁版嵁鍘嬬緝寮濮嬪湪鍟嗕笟紼嬪簭涓疄鐜板茍琚簲鐢ㄥ湪璁稿鎶鏈鍩熴俇NIX 緋葷粺涓婁竴涓帇緙╃▼搴?COMPACT
灝辨槸 Huffman 0 闃惰嚜閫傚簲緙栫爜鐨勫叿浣撳疄鐜般?0 騫翠唬鍒濓紝Huffman緙栫爜鍙堝湪CP/M 鍜孌OS 緋葷粺涓疄鐜幫紝鍏朵唬琛ㄧ▼搴忓彨
SQ銆傚湪鏁版嵁鍘嬬緝棰嗗煙錛孒uffman 鐨勮繖涓璁烘枃浜嬪疄涓婂紑鍒涗簡鏁版嵁鍘嬬緝鎶鏈竴涓煎緱鍥炲繂鐨勬椂浠o紝60 騫翠唬銆?0 騫翠唬涔冭嚦 80
騫翠唬鐨勬棭鏈燂紝鏁版嵁鍘嬬緝棰嗗煙鍑犱箮涓鐩磋 Huffman 緙栫爜鍙婂叾鍒嗘敮鎵鍨勬柇銆傚鏋滀笉鏄悗闈㈠皢瑕佹彁鍒扮殑閭d袱涓互鑹插垪浜猴紝涔熻鎴戜滑浠婂ぉ榪樿鍦?
Huffman緙栫爜鐨?0 鍜?1 鐨勭粍鍚堜腑嫻佽繛蹇樿繑銆?br />
80騫翠唬錛屾暟瀛﹀浠笉婊¤凍浜?Huffman
緙栫爜涓殑鏌愪簺鑷村懡寮辯偣錛屼粬浠粠鏂扮殑瑙掑害鍏ユ墜錛岄伒寰?Huffman
緙栫爜鐨勪富瀵兼濇兂錛岃璁″嚭鍙︿竴縐嶆洿涓虹簿紜紝鏇磋兘鎺ヨ繎淇℃伅璁轟腑鈥滅喌鈥濇瀬闄愮殑緙栫爜鏂規硶鈥斺旂畻鏈紪鐮併傚嚟鍊熺畻鏈紪鐮佺殑綺懼璁捐鍜屽崜瓚婅〃鐜幫紝浜轟滑緇堜簬鍙互鍚戠潃鏁版嵁鍘?
緙╃殑鏋侀檺鍓嶈繘浜嗐傚彲浠ヨ瘉鏄庯紝綆楁湳緙栫爜寰楀埌鐨勫帇緙╂晥鏋滃彲浠ユ渶澶у湴鍑忓皬淇℃伅鐨勫啑浣欏害錛岀敤鏈灝戦噺鐨勭鍙風簿紜〃杈懼師濮嬩俊鎭唴瀹廣傚綋鐒訛紝綆楁湳緙栫爜鍚屾椂涔熺粰紼嬪簭鍛樺拰璁?
綆楁満甯︽潵浜嗘柊鐨勬寫鎴橈細瑕佸疄鐜板拰榪愯綆楁湳緙栫爜錛岄渶瑕佹洿涓鴻壈鑻︾殑緙栫▼鍔沖姩鍜屾洿鍔犲揩閫熺殑璁$畻鏈虹郴緇熴備篃灝辨槸錛屽湪鍚屾牱鐨勮綆楁満緋葷粺涓婏紝綆楁湳緙栫爜铏界劧鍙互寰楀埌鏈濂界殑
鍘嬬緝鏁堟灉錛屼絾鍗磋娑堣椾篃璁稿嚑鍗佸嶇殑璁$畻鏃躲傝繖灝辨槸涓轟粈涔堢畻鏈紪鐮佷笉鑳藉湪鎴戜滑鏃ュ父浣跨敤鐨勫帇緙╁伐鍏蜂腑瀹炵幇鐨勪富瑕佸師鍥犮?br />
閭d箞錛岃兘涓嶈兘鏃㈠湪鍘嬬緝鏁?
鏋滀笂瓚呰秺 Huffman錛屽張涓嶅鍔犵▼搴忓緋葷粺璧勬簮鍜屾椂闂寸殑闇姹傚憿錛熸垜浠繀欏繪劅璋笅闈㈠皢瑕佷粙緇嶇殑涓や釜浠ヨ壊鍒椾漢銆傜洿鍒?1977
騫達紝鏁版嵁鍘嬬緝鐨勭爺絀跺伐浣滀富瑕侀泦涓簬鐔點佸瓧絎﹀拰鍗曡瘝棰戠巼浠ュ強緇熻妯″瀷絳夋柟闈紝鐮旂┒鑰呬滑涓鐩村湪緇炲敖鑴戞眮涓轟嬌鐢℉uffman緙栫爜鐨勭▼搴忔壘鍑烘洿蹇佹洿濂界殑鏀硅繘鏂?
娉曘?977 騫翠互鍚庯紝涓鍒囬兘鏀瑰彉浜嗐?br />
1977 騫達紝浠ヨ壊鍒椾漢 Jacob Ziv 鍜?Abraham Lempel
鍙戣〃浜嗚鏂団滈『搴忔暟鎹帇緙╃殑涓涓氱敤綆楁硶鈥?A Universal Alogrithem for Sequential Data
Compression)銆?978 騫達紝浠栦滑鍙戣〃浜嗚璁烘枃鐨勭畫綃団滈氳繃鍙彉姣旂巼緙栫爜鐨勭嫭绔嬪簭鍒楃殑鍘嬬緝鈥?Compression of
Individual Sequences via Variable-Rate Coding)銆傚湪榪欎袱綃囪鏂囦腑鎻愬嚭鐨勫帇緙╂妧鏈垎鍒縐頒負 LZ77
鍜?LZ78 (涓嶇煡涓轟粈涔堬紝浣滆呭悕瀛楃殑棣栧瓧姣嶈鍊掔疆浜?銆傜畝鍗曞湴璇達紝榪欎袱縐嶅帇緙╂柟娉曠殑鎬濊礬瀹屽叏涓嶅悓浜庝粠 Shannon 鍒?Huffman
鍒扮畻鏈帇緙╃殑浼犵粺鎬濊礬錛屼漢浠皢鍩轟簬榪欎竴鎬濊礬鐨勭紪鐮佹柟娉曠О浣溾滃瓧鍏糕濆紡緙栫爜銆傚瓧鍏稿紡緙栫爜涓嶄絾鍦ㄥ帇緙╂晥鏋滀笂澶уぇ瓚呰繃浜?
Huffman錛岃屼笖錛屽浜庡ソ鐨勫疄鐜幫紝鍏跺帇緙╁拰瑙e帇緙╃殑閫熷害涔熷紓甯告儕浜恒?br />
1984 騫達紝Terry Welch
鍙戣〃浜嗗悕涓衡滈珮鎬ц兘鏁版嵁鍘嬬緝鎶鏈?A Technique for High-Performance Data
Compression)鐨勮鏂囷紝鎻忚堪浜嗕粬鍦?Sperry Research
Center(鐜板湪鏄疷nisys鐨勪竴閮ㄥ垎)鐨勭爺絀舵垚鏋溿備粬瀹炵幇浜哃Z78 綆楁硶鐨勪竴涓彉縐?鈥斺?LZW銆侺ZW 緇ф壙浜?LZ77 鍜?LZ78
鍘嬬緝鏁堟灉濂姐侀熷害蹇殑浼樼偣錛岃屼笖鍦ㄧ畻娉曟弿榪頒笂鏇村鏄撹浜轟滑鎺ュ彈錛堟湁鐨勭爺絀惰呰涓烘槸鐢變簬 Welch 鐨勮鏂囨瘮 Ziv 鍜?Lempel
鐨勬洿瀹規槗鐞嗚В錛夛紝瀹炵幇涔熸瘮杈冪畝鍗曘備笉涔咃紝UNIX 涓婂嚭鐜頒簡浣跨敤 LZW 綆楁硶鐨?Compress
紼嬪簭錛岃紼嬪簭鎬ц兘浼樿壇錛屽茍鏈夐珮姘村鉤鐨勬枃妗o紝寰堝揩鎴愪負浜?UNIX 涓栫晫鐨勫帇緙╃▼搴忔爣鍑嗐傜揣闅忓叾鍚庣殑鏄?MS-DOS 鐜涓嬬殑ARC紼嬪簭(
System Enhancement Associates, 1985 )錛岃繕鏈夎薄 PKWare銆丳KARC
絳変豢鍒跺搧銆侺Z78鍜孡ZW涓鏃墮棿緇熸不浜哢NIX鍜孌OS涓ゅぇ騫沖彴銆?br />
80 騫翠唬涓湡浠ュ悗錛屼漢浠 LZ77
榪涜浜嗘敼榪涳紝闅忎箣璇炵敓浜嗕竴鎵規垜浠粖澶╄繕鍦ㄥぇ閲忎嬌鐢ㄧ殑鍘嬬緝紼嬪簭銆侶aruyasu Yoshizaki(Yoshi)鐨凩Harc鍜孯obert
Jung鐨凙RJ鏄叾涓袱涓憲鍚嶇殑渚嬪瓙銆侺Z77寰椾互鍜孡Z78銆丩ZW涓璧峰瀯鏂綋浠婄殑閫氱敤鏁版嵁鍘嬬緝棰嗗煙銆?br />
鐩墠錛屽熀浜庡瓧鍏告柟寮忕殑鍘嬬緝宸茬粡鏈変簡涓涓騫挎硾璁ゅ彲鐨勬爣鍑嗭紝浠庡彜鑰佺殑PKZip鍒扮幇鍦ㄧ殑WinZip錛岀壒鍒槸闅?br />鐫Internet涓婃枃浠朵紶杈撶殑嫻佽錛孼IP 鏍煎紡鎴愪負浜嗕簨瀹炰笂鐨勬爣鍑嗭紝娌℃湁鍝竴縐嶉氱敤鐨勬枃浠跺帇緙┿佸綊妗g郴緇熶笉鏀?br />鎸?ZIP 鏍煎紡銆傛湰绔犱富瑕佷粙緇嶇洰鍓嶇敤寰楁渶澶氬拰鎶鏈渶鎴愮啛鐨勬棤鎹熷帇緙╃紪鐮佹妧鏈紝鍖呮嫭鍖呭惈闇嶅か鏇?Huffman)緙栫爜銆佺畻鏈紪鐮併丷LE緙栫爜鍜岃瘝鍏哥紪鐮?銆傛敞鎰忔湁涓閮ㄥ垎鍘嬬緝綆楁硶鍙楀埌緹庡浗涓撳埄娉曠殑淇濇姢錛堜緥濡?LZW 綆楁硶鐨勬煇浜涢儴鍒嗗拰楂橀樁綆楁湳鍘嬬緝綆楁硶鐨勬煇浜涚粏鑺傜瓑錛夈?br />
4.1 浠欏啘-鑼冭涓庨湇澶浖緙栫爜
4.1.1 浠欏啘-鑼冭錛圫hannon-Fano錛夌紪鐮?br />浠欏啘-鑼冭緙栫爜綆楁硶闇瑕佺敤鍒頒笅闈袱涓熀鏈蹇碉細
1. Entropy(鐔?
(1) 鐔墊槸淇℃伅閲忕殑搴﹂噺鏂規硶錛岃〃紺轟竴鏉′俊鎭腑鐪熸闇瑕佺紪鐮佺殑淇℃伅閲忋備簨浠跺彂鐢熺殑鍙兘鎬ц秺灝忥紙鏁板涓婂氨
鏄鐜囪秺灝忥級錛岃〃紺烘煇涓浜嬩歡鍑虹幇鐨勬秷鎭秺澶氥?br />(2) 鏌愪釜浜嬩歡鐨勪俊鎭噺鐢↖i=-log2 pi琛ㄧず錛堟湁鏃剁О涓簊urprise錛夛紝 鍏朵腑pi涓虹i涓簨浠剁殑姒傜巼錛? pi 1瀵規暟浠?涓哄簳鏃訛紝鐔電殑鍗曚綅鏄?bits"銆?br />2. 淇℃簮S鐨勭喌
鎸夌収浠欏啘(Shannon)鐨勭悊璁猴紝淇℃簮S鐨勭喌瀹氫箟涓?br />鍏朵腑pi鏄鍙穝i鍦⊿涓嚭鐜扮殑姒傜巼錛沴og2(1/ pi)琛ㄧず鍖呭惈鍦╯i涓殑淇℃伅閲忥紝涔熷氨鏄紪鐮乻i鎵闇瑕佺殑浣嶆暟銆?br />渚嬪錛屼竴騫呯敤256綰х伆搴﹁〃紺虹殑鍥懼儚錛屽鏋滄瘡涓涓薄绱犵偣鐏板害鐨勬鐜囧潎涓簆i=1/256錛岀紪鐮佹瘡涓涓薄绱犵偣灝遍渶
瑕?浣嶃傦紙鏈澶х喌鍒嗗竷錛?br />鏈灝忕喌鍒嗗竷錛?闄や簡涓涓鍙峰鍏朵綑絎﹀彿鐨勬鐜囧叏涓?錛孒錛?bits.錛堝畾涔?log20錛?錛?br />
渚嬪錛屽涓嬮潰榪欐潯鍙嚭鐜頒簡 a b c 涓変釜瀛楃鐨勫瓧絎︿覆錛歛abbaccbaa錛屽瓧絎︿覆闀垮害涓?10錛屽瓧絎?a b c 鍒?br />鍒嚭鐜頒簡 5 3 2 嬈★紝鍒?a b c 鍦ㄤ俊鎭腑鍑虹幇鐨勬鐜囧垎鍒負 0.5 0.3 0.2錛屼粬浠殑鐔靛垎鍒負錛?br />Ea = -log2(0.5) = 1
Eb = -log2(0.3) = 1.737
Ec = -log2(0.2) = 2.322
鏁存潯淇℃伅鐨勭喌涔熷嵆琛ㄨ揪鏁翠釜瀛楃涓查渶瑕佺殑浣嶆暟涓猴細
Ea * 5 + Eb * 3 + Ec * 2 = 14.855 浣?br />濡傛灉鐢ㄨ綆楁満涓父鐢ㄧ殑 ASCII 緙栫爜錛岃〃紺轟笂闈㈢殑瀛楃涓查渶瑕佹暣鏁?0浣嶏紒淇℃伅涓轟粈涔堣兘琚帇緙╄屼笉涓㈠け鍘?br />鏈夌殑淇℃伅鍐呭鍛紵綆鍗曞湴璁詫紝鐢ㄨ緝灝戠殑浣嶆暟琛ㄧず杈冮綣佸嚭鐜扮殑絎﹀彿錛岃繖灝辨槸鏁版嵁鍘嬬緝鐨勫熀鏈噯鍒欍傦紙鎬庢牱鐢?0
1 榪欐牱鐨勪簩榪涘埗鏁扮爜琛ㄧず闆剁偣鍑犱釜浜岃繘鍒朵綅鍛紵紜疄寰堝洶闅撅紝浣嗕笉鏄病鏈夊姙娉曘備竴鏃︽壘鍒頒簡鍑嗙‘琛ㄧず闆剁偣鍑犱釜
浜岃繘鍒朵綅鐨勬柟娉曪紝灝辨帴榪戞棤鎹熷帇緙╃殑鏋侀檺浜嗐傦級
[渚?.1] 鏈変竴騫?0涓薄绱犵粍鎴愮殑鐏板害鍥懼儚錛岀伆搴﹀叡鏈?綰э紝鍒嗗埆鐢ㄧ鍙稟銆丅銆丆銆丏鍜孍琛ㄧず錛?0涓薄绱犱腑鍑?br />鐜扮伆搴鐨勮薄绱犳暟鏈?5涓紝鍑虹幇鐏板害B鐨勮薄绱犳暟鏈?涓紝鍑虹幇鐏板害C鐨勮薄绱犳暟鏈?涓瓑絳夛紝濡傝〃4-01鎵紺恒?br />濡傛灉鐢?涓綅琛ㄧず榪?涓瓑綰х殑鐏板害鍊鹼紝涔熷氨鏄瘡涓薄绱犵敤3浣嶈〃紺?絳夐暱緙栫爜)錛岀紪鐮佽繖騫呭浘鍍忔誨叡闇瑕?20
浣嶃?br />琛?-01 絎﹀彿鍦ㄥ浘鍍忎腑鍑虹幇鐨勬暟鐩?br />鎸夌収浠欏啘鐞嗚錛岃繖騫呭浘鍍忕殑鐔典負 H(S)=(15/40)脳log2(40/15) + (7/40)脳log2(40/7) +鈥?+ (5/40)
脳log2(40/5) = 2.196
榪欏氨鏄姣忎釜絎﹀彿鐢?.196浣嶈〃紺猴紝40涓薄绱犻渶鐢?7.84浣嶃?br />鏈鏃╅槓榪板拰瀹炵幇榪欑緙栫爜鐨勬槸Shannon(1948騫?鍜孎ano(1949騫?錛屽洜姝よ縐頒負浠欏啘-鑼冭(Shannon-Fano)綆?br />娉曘傝繖縐嶆柟娉曢噰鐢ㄤ粠涓婂埌涓嬬殑鏂規硶榪涜緙栫爜銆?br />棣栧厛鎸夌収絎﹀彿鍑虹幇鐨勯搴︽垨姒傜巼鎺掑簭錛屼緥濡傦紝A錛孊錛孋錛孌鍜孍錛屽琛?-02鎵紺恒?br />鐒跺悗浣跨敤閫掑綊鏂規硶鍒嗘垚涓や釜閮ㄥ垎錛屾瘡涓閮ㄥ垎鍏鋒湁榪戜技鐩稿悓鐨勬鏁幫紝濡傚浘4-01鎵紺恒?br />鎸夌収榪欑鏂規硶榪涜緙栫爜寰楀埌鐨勬諱綅鏁頒負91錛屽疄闄呯殑鍘嬬緝姣旂害涓?.3 : 1銆?br />琛?-02 Shannon-Fano綆楁硶涓句緥琛?br />絎?鍙?A B C D E
鍑虹幇鐨勬鏁?15 7 7 6 5
絎﹀彿 鍑虹幇鐨勬鏁?pi) log2(1/pi) 鍒嗛厤鐨勪唬鐮?闇瑕佺殑浣嶆暟
A 15 (0.375) 1.4150 00 30
B 7 (0.175) 2.5145 01 14
C 7 (0.175) 2.5145 10 14
D 6 (0.150) 2.7369 110 18
E 5 (0.125) 3.0000 111 15
絎?4 欏?br />4
鍥?-01 浠欏啘-鑼冭綆楁硶緙栫爜涓句緥
4.1.2 闇嶅か鏇?Huffman)緙栫爜
闇嶅か鏇煎湪1952騫存彁鍑轟簡鍙︿竴縐嶇紪鐮佹柟娉曪紝鍗充粠涓嬪埌涓婄殑緙栫爜鏂規硶銆傜幇浠ヤ竴涓叿浣撶殑渚嬪瓙璇存槑瀹冪殑緙栫爜姝?br />楠わ細
(1) 鍒濆鍖栵紝鏍規嵁絎﹀彿姒傜巼鐨勫ぇ灝忔寜鐢卞ぇ鍒板皬欏哄簭瀵圭鍙瘋繘琛屾帓搴忥紝濡傝〃4-03鍜屽浘4-02鎵紺恒?br />(2) 鎶婃鐜囨渶灝忕殑涓や釜絎﹀彿緇勬垚涓涓妭鐐癸紝濡傚浘4-02涓殑D鍜孍緇勬垚鑺傜偣P1銆?br />(3) 閲嶅姝ラ2錛屽緱鍒拌妭鐐筆2銆丳3鍜孭4錛屽艦鎴愪竴媯碘滄爲鈥濓紝鍏朵腑鐨凱4縐頒負鏍硅妭鐐廣?br />(4) 浠庢牴鑺傜偣P4寮濮嬪埌鐩稿簲浜庢瘡涓鍙風殑鈥滄爲鍙垛濓紝浠庝笂鍒頒笅鏍囦笂鈥?鈥?涓婃灊)鎴栬呪?鈥?涓嬫灊)錛岃嚦浜庡摢
涓負鈥?鈥濆摢涓負鈥?鈥濆垯鏃犲叧绱ц錛屾渶鍚庣殑緇撴灉浠呬粎鏄垎閰嶇殑浠g爜涓嶅悓錛岃屼唬鐮佺殑騫沖潎闀垮害鏄浉鍚岀殑銆?br />(5) 浠庢牴鑺傜偣P4寮濮嬮『鐫鏍戞灊鍒版瘡涓彾瀛愬垎鍒啓鍑烘瘡涓鍙風殑浠g爜錛屽琛?-03鎵紺恒?br />(6) 鎸夌収浠欏啘鐞嗚錛岃繖騫呭浘鍍忕殑鐔典負
H(S)=(15/39)脳log2(39/15) + (7/39)脳log2(39/7) + 鈥?+ (5/39)脳log2(39/5) = 2.1859
鍘嬬緝姣?.37:1銆?br />琛?-03 闇嶅か鏇肩紪鐮佷婦渚?br />鍥?-02 闇嶅か鏇肩紪鐮佹柟娉?br />闇嶅か鏇肩爜鐨勭爜闀胯櫧鐒舵槸鍙彉鐨勶紝浣嗗嵈涓嶉渶瑕佸彟澶栭檮鍔犲悓姝ヤ唬鐮侊紙鍓嶇紑浠g爜錛夈備緥濡傦紝鐮佷覆涓殑絎?浣嶄負0錛?br />閭f湯鑲畾鏄鍙稟錛屽洜涓鴻〃紺哄叾浠栫鍙風殑浠g爜娌℃湁涓涓槸浠?寮濮嬬殑錛屽洜姝や笅涓浣嶅氨琛ㄧず涓嬩竴涓鍙蜂唬鐮佺殑絎?
絎﹀彿 鍑虹幇鐨勬鏁?pi) log2(1/pi) 鍒嗛厤鐨勪唬鐮?闇瑕佺殑浣嶆暟
A 15(0.3846) 1.38 0 15
B 7(0.1795) 2.48 100 21
C 6(0.1538) 2.70 101 18
D 6(0.1538) 2.70 110 18
E 5(0.1282) 2.96 111 15
絎?5 欏?br />4
浣嶃傚悓鏍鳳紝濡傛灉鍑虹幇鈥?10鈥濓紝閭d箞瀹冨氨浠h〃絎﹀彿D銆傚鏋滀簨鍏堢紪鍐欏嚭涓鏈В閲婂悇縐嶄唬鐮佹剰涔夌殑鈥滆瘝鍏糕濓紝鍗崇爜
綈匡紝閭d箞灝卞彲浠ユ牴鎹爜綈夸竴涓爜涓涓爜鍦頒緷嬈¤繘琛岃瘧鐮併?br />涓庝粰鍐?鑼冭緙栫爜鐩稿悓錛岃繖涓ょ鏂規硶閮借嚜鍚悓姝ョ爜錛屽湪緙栫爜涔嬪悗鐨勭爜涓蹭腑涓嶉渶瑕佸彟澶栨坊鍔犳爣璁扮鍙鳳紙鍗沖湪
璇戠爜鏃跺垎鍓茬鍙風殑鐗規畩浠g爜錛夈?br />閲囩敤闇嶅か鏇肩紪鐮佹椂鏈変袱涓棶棰樺煎緱娉ㄦ剰錛?br />鈶犻湇澶浖鐮佹病鏈夐敊璇繚鎶ゅ姛鑳斤紝鍦ㄨ瘧鐮佹椂錛屽鏋滅爜涓蹭腑娌℃湁閿欒錛岄偅涔堝氨鑳戒竴涓帴涓涓湴姝g‘璇戝嚭浠g爜銆?br />浣嗗鏋滅爜涓蹭腑鏈夐敊璇紝鍝曚粎浠呮槸1浣嶅嚭鐜伴敊璇紝涓嶄絾榪欎釜鐮佹湰韜瘧閿欙紝鏇寸碂緋曠殑鏄竴閿欎竴澶т覆錛屽叏涔變簡濂楋紝
榪欑鐜拌薄縐頒負閿欒浼犳挱(error propagation)銆傝綆楁満瀵硅繖縐嶉敊璇篃鏃犺兘涓哄姏錛岃涓嶅嚭閿欏湪鍝噷錛屾洿璋堜笉涓婂幓
綰犳瀹冦?br />鈶¢湇澶浖鐮佹槸鍙彉闀垮害鐮侊紝鍥犳寰堥毦闅忔剰鏌ユ壘鎴栬皟鐢ㄥ帇緙╂枃浠朵腑闂寸殑鍐呭錛岀劧鍚庡啀璇戠爜錛岃繖灝遍渶瑕佸湪瀛樺偍
浠g爜涔嬪墠鍔犱互鑰冭檻銆?br />灝界濡傛錛岄湇澶浖鐮佽繕鏄緱鍒板箍娉涘簲鐢ㄣ?闇嶅か鏇肩紪鐮佹柟娉曠殑緙栫爜鏁堢巼姣斾粰鍐?鑼冭緙栫爜鏁堢巼楂樹竴浜涖?br />4.2 綆楁湳緙栫爜
綆楁湳緙栫爜鍦ㄥ浘鍍忔暟鎹帇緙╂爣鍑?濡侸PEG錛孞BIG)涓壆婕斾簡閲嶈鐨勮鑹層傚湪綆楁湳緙栫爜涓紝娑堟伅鐢?鍒?涔嬮棿鐨勫疄
鏁拌繘琛岀紪鐮侊紝綆楁湳緙栫爜鐢ㄥ埌涓や釜鍩烘湰鐨勫弬鏁幫細絎﹀彿鐨勬鐜囧拰緙栫爜闂撮殧銆備俊婧愮鍙風殑姒傜巼鍐沖畾鍘嬬緝緙栫爜鐨勬晥鐜囷紝
涔熷喅瀹氱紪鐮佽繃紼嬩腑淇℃簮絎﹀彿鐨勯棿闅旓紝鑰岃繖浜涢棿闅斿寘鍚湪0鍒?涔嬮棿銆傜紪鐮佽繃紼嬩腑鐨勯棿闅斿喅瀹氫簡絎﹀彿鍘嬬緝鍚庣殑杈?br />鍑恒傜畻鏈紪鐮佸櫒鐨勭紪鐮佽繃紼嬪彲鐢ㄤ笅闈㈢殑渚嬪瓙鍔犱互瑙i噴銆?br />[渚?.2] 鍋囪淇℃簮絎﹀彿涓簕00, 01, 10, 11}錛岃繖浜涚鍙風殑姒傜巼鍒嗗埆涓簕 0.1, 0.4, 0.2, 0.3 }錛屾牴鎹繖浜?br />姒傜巼鍙妸闂撮殧[0, 1)鍒嗘垚4涓瓙闂撮殧錛歔0, 0.1), [0.1, 0.5), [0.5, 0.7), [0.7, 1)錛屽叾涓璠x,y)琛ㄧず鍗婂紑鏀?br />闂撮殧錛屽嵆鍖呭惈x涓嶅寘鍚珁銆備笂闈㈢殑淇℃伅鍙患鍚堝湪琛?-04涓?br />琛?-04 淇℃簮絎﹀彿錛屾鐜囧拰鍒濆緙栫爜闂撮殧
濡傛灉浜岃繘鍒舵秷鎭簭鍒楃殑杈撳叆涓猴細10 00 11 00 10 11 01銆傜紪鐮佹椂棣栧厛杈撳叆鐨勭鍙鋒槸10錛屾壘鍒板畠鐨勭紪鐮佽寖鍥?br />鏄痆0.5, 0.7)銆傛秷鎭腑絎簩涓鍙?0鐨勭紪鐮佽寖鍥存槸[0, 0.1)錛屽洜姝ゅ氨鍙朳0.5, 0.7)鐨勭涓涓崄鍒嗕箣涓浣滀負鏂伴棿
闅擺0.5, 0.52)銆備緷姝ょ被鎺紝緙栫爜絎?涓鍙?1鏃跺彇鏂伴棿闅斾負[0.514, 0.52)錛岀紪鐮佺4涓鍙?0鏃訛紝鍙栨柊闂撮殧涓?br />[0.514, 0.5146)錛屸?銆傛秷鎭殑緙栫爜杈撳嚭鍙互鏄渶鍚庝竴涓棿闅斾腑鐨勪換鎰忔暟銆傛暣涓紪鐮佽繃紼嬪鍥?-03鎵紺恒?br />絎﹀彿 00 01 10 11
姒傜巼 0.1 0.4 0.2 0.3
鍒濆緙栫爜闂撮殧 [0, 0.1) [0.1, 0.5) [0.5, 0.7) [0.7, 1)
絎?6 欏?br />4
鍥?-03 綆楁湳緙栫爜榪囩▼涓句緥
榪欎釜渚嬪瓙鐨勭紪鐮佸拰璇戠爜鐨勫叏榪囩▼鍒嗗埆琛ㄧず鍦ㄨ〃4-05鍜岃〃4-06涓?br />鏍規嵁涓婇潰鎵涓劇殑渚嬪瓙錛屽彲鎶婅綆楄繃紼嬫葷粨濡備笅銆?br />鑰冭檻涓涓湁M涓鍙穒=(1,2,鈥?M)鐨勫瓧絎﹁〃闆嗭紝鍋囪姒傜巼p( i)=pi錛岃?br />銆傝緭鍏ョ鍙風敤xn琛ㄧず錛岀n涓瓙闂撮殧鐨勮寖鍥寸敤
琛ㄧず銆傚叾涓璴0=0錛宒0=1鍜宲0=0錛宭n琛ㄧず闂撮殧宸﹁竟鐣岀殑鍊?rn 琛ㄧず闂?br />闅斿彸杈圭晫鐨勫鹼紝dn=rn-ln琛ㄧず闂撮殧闀垮害銆傜紪鐮佹楠ゅ涓嬶細
姝ラ1錛氶鍏堝湪1鍜?涔嬮棿緇欐瘡涓鍙峰垎閰嶄竴涓垵濮嬪瓙闂撮殧錛屽瓙闂撮殧鐨勯暱搴︾瓑浜庡畠鐨勬鐜囷紝鍒濆瀛愰棿闅旂殑鑼?br />鍥寸敤I1=[l1錛宺1)=[ 錛?)琛ㄧず銆備護d1=r1-l1錛孡=l1鍜孯=r1銆?br />姝ラ2錛歀鍜孯鐨勪簩榪涘埗琛ㄨ揪寮忓垎鍒〃紺轟負錛?br />鍜?br />鍏朵腑ui 鍜寁i 絳変簬鈥?鈥濇垨鑰呪?鈥濄?br />鈶犲鏋渦1
鈮爒1 錛屼笉鍙戦佷換浣曟暟鎹紝杞埌姝ラ3錛?br />鈶″鏋渦1=v1錛屽氨鍙戦佷簩榪涘埗絎﹀彿u1銆?br />姣旇緝u2
鍜寁2錛氬鏋渦2鈮爒2 錛屼笉鍙戦佷換浣曟暟鎹紝杞埌姝ラ3錛?br />濡傛灉u2=v2錛屽氨鍙戦佷簩榪涘埗絎﹀彿u2銆?br />鈥?br />榪欑姣旇緝涓鐩磋繘琛屽埌涓や釜絎﹀彿涓嶇浉鍚屼負姝紝鐒跺悗榪涘叆姝ラ3銆?br />姝ラ3錛歯鍔?錛岃涓嬩竴涓鍙楓傚亣璁劇n涓緭鍏ョ鍙蜂負xn= i錛屾寜鐓т互鍓嶇殑姝ラ鎶婅繖涓棿闅斿垎鎴愬涓嬫墍紺虹殑
瀛愰棿闅旓細
絎?7 欏?br />4
浠=ln錛孯=rn 鍜?dn=rn-ln錛岀劧鍚庤漿鍒版楠?銆?br />琛?-05 緙栫爜榪囩▼
琛?-06 璇戠爜榪囩▼
[渚?.3] 鍋囪鏈?涓鍙風殑淇℃簮錛屽畠浠殑姒傜巼濡傝〃4-07鎵紺猴細
琛?-07 絎﹀彿姒傜巼
杈撳叆搴忓垪涓簒n錛?2錛?1錛?3錛屸︺傚畠鐨勭紪鐮佽繃紼嬪鍥?-04鎵紺猴紝鐜拌鏄庡涓嬨?br />杈撳叆絎?涓鍙鋒槸x1= 2錛屽彲鐭=2錛屽畾涔夊垵濮嬮棿闅旓紳[0.5, 0.75)錛岀敱姝ゅ彲鐭?br />d1=0.25錛屽乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.5=0.1(B)錛孯錛?.7錛?.11鈥?(B) 銆傛寜鐓ф楠?錛寀1=v1錛屽彂
閫?銆傚洜u2鈮爒2錛屽洜姝よ漿鍒版楠?銆?br />杈撳叆絎?涓瓧絎2= 1錛宨=1錛屽畠鐨勫瓙闂撮殧錛漑0.5, 0.625)錛岀敱姝ゅ彲
寰梔2=0.125銆傚乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.5=0.100 鈥?(B)錛孯錛?.101鈥?(B)銆傛寜鐓ф楠?錛?br />u2=v2=0錛屽彂閫?錛岃寀3鍜寁3涓嶇浉鍚岋紝鍥犳鍦ㄥ彂閫?涔嬪悗灝辮漿鍒版楠?銆?br />杈撳叆絎?涓瓧絎︼紝x3= 3錛宨=3錛屽畠鐨勫瓙闂撮殧錛漑0.59375, 0.609375)
錛岀敱姝ゅ彲寰梔3=0.015625銆傚乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.59375=0.10011 (B)錛孯錛?br />姝ラ 杈撳叆絎﹀彿 緙栫爜闂撮殧 緙栫爜鍒ゅ喅
1 10 [0.5, 0.7) 絎﹀彿鐨勯棿闅旇寖鍥碵0.5, 0.7)
2 00 [0.5, 0.52) [0.5, 0.7)闂撮殧鐨勭涓涓?/10
3 11 [0.514, 0.52) [0.5, 0.52)闂撮殧鐨勬渶鍚庝笁涓?/10
4 00 [0.514, 0.5146) [0.514, 0.52)闂撮殧鐨勭涓涓?/10
5 10 [0.5143, 0.51442) [0.514, 0.5146)闂撮殧鐨勭浜斾釜1/10寮濮嬶紝浜屼釜1/10
6 11 [0.514384, 0.51442 [0.5143, 0.51442)闂撮殧鐨勬渶鍚?涓?/10
7 01 [0.5143836, 0.514402) [0.514384, 0.51442)闂撮殧鐨?涓?/10錛屼粠絎?涓?/10寮濮?br />8 浠嶽0.5143876, 0.514402)涓夋嫨涓涓暟浣滀負杈撳嚭錛?.5143876
姝ラ 闂撮殧 璇戠爜絎﹀彿璇戠爜鍒ゅ喅
1 [0.5, 0.7) 10 0.51439鍦ㄩ棿闅?[0.5, 0.7)
2 [0.5, 0.52) 00 0.51439鍦ㄩ棿闅?[0.5, 0.7)鐨勭1涓?/10
3 [0.514, 0.52) 11 0.51439鍦ㄩ棿闅擺0.5, 0.52)鐨勭7涓?/10
4 [0.514, 0.5146) 00 0.51439鍦ㄩ棿闅擺0.514, 0.52)鐨勭1涓?/10
5 [0.5143, 0.51442) 10 0.51439鍦ㄩ棿闅擺0.514, 0.5146)鐨勭5涓?/10
6 [0.514384, 0.51442) 11 0.51439鍦ㄩ棿闅擺0.5143, 0.51442)鐨勭7涓?/10
7 [0.51439, 0.5143948) 01 0.51439鍦ㄩ棿闅擺0.51439, 0.5143948)鐨勭1涓?/10
8 璇戠爜鐨勬秷鎭細10 00 11 00 10 11 01
淇℃簮絎﹀彿ai 1 2 3 4
姒傜巼pi p1=0.5 p2=0.25 p3=0.125 p4=0.125
鍒濆緙栫爜闂撮殧 [0, 0.5) [0.5, 0.75) [0.75, 0.875) [0.875, 1)
絎?8 欏?br />4
0.609375=0.100111 (B)銆傛寜鐓ф楠?錛寀3=v3=0錛寀4=v4=1錛寀5=v5=1錛屼絾u6鍜寁6涓嶇浉鍚岋紝鍥犳鍦ㄥ彂閫?11涔嬪悗杞埌
姝ラ3銆?br />鈥?br />鍙戦佺殑絎﹀彿鏄細10011鈥︺傝緙栫爜鐨勬渶鍚庣殑絎﹀彿鏄粨鏉熺鍙楓?br />鍥?-04 綆楁湳緙栫爜姒傚康
灝辮繖涓緥瀛愯岃█錛岀畻鏈紪鐮佸櫒鎺ュ彈鐨勭1浣嶆槸鈥?鈥濓紝瀹冪殑闂撮殧鑼冨洿灝遍檺鍒跺湪[0.5, 1)錛屼絾鍦ㄨ繖涓寖鍥撮噷鏈?br />3縐嶅彲鑳界殑鐮佺2錛?3鍜?錛屽洜姝ょ1浣嶆病鏈夊寘鍚凍澶熺殑璇戠爜淇℃伅銆傚湪鎺ュ彈絎?浣嶄箣鍚庡氨鍙樻垚鈥?0鈥濓紝瀹冭惤鍦?br />[0.5, 0.75)鐨勯棿闅旈噷錛岀敱浜庤繖涓や綅琛ㄧず鐨勭鍙烽兘鎸囧悜2寮濮嬬殑闂撮殧錛屽洜姝ゅ氨鍙柇瀹氱涓涓鍙鋒槸2銆傚湪鎺ュ彈
姣忎綅淇℃伅涔嬪悗鐨勮瘧鐮佹儏鍐靛涓嬭〃4-08鎵紺恒?br />琛?-08 璇戠爜榪囩▼琛?br />鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鎴戜滑鍋囧畾緙栫爜鍣ㄥ拰璇戠爜鍣ㄩ兘鐭ラ亾娑堟伅鐨勯暱搴︼紝鍥犳璇戠爜鍣ㄧ殑璇戠爜榪囩▼涓嶄細鏃犻檺鍒跺湴榪愯
涓嬪幓銆傚疄闄呬笂鍦ㄨ瘧鐮佸櫒涓渶瑕佹坊鍔犱竴涓笓闂ㄧ殑緇堟絎︼紝褰撹瘧鐮佸櫒鐪嬪埌緇堟絎︽椂灝卞仠姝㈣瘧鐮併?br />鍦ㄧ畻鏈紪鐮佷腑闇瑕佹敞鎰忕殑鍑犱釜闂錛?br />(1) 鐢變簬瀹為檯鐨勮綆楁満鐨勭簿搴︿笉鍙兘鏃犻檺闀匡紝榪愮畻涓嚭鐜版孩鍑烘槸涓涓槑鏄劇殑闂錛屼絾澶氭暟鏈哄櫒閮芥湁16浣嶃?br />32浣嶆垨鑰?4浣嶇殑綺懼害錛屽洜姝よ繖涓棶棰樺彲浣跨敤姣斾緥緙╂斁鏂規硶瑙e喅銆?br />(2) 綆楁湳緙栫爜鍣ㄥ鏁翠釜娑堟伅鍙駭鐢熶竴涓爜瀛楋紝榪欎釜鐮佸瓧鏄湪闂撮殧[0, 1)涓殑涓涓疄鏁幫紝鍥犳璇戠爜鍣ㄥ湪鎺ュ彈
鍒拌〃紺鴻繖涓疄鏁扮殑鎵鏈変綅涔嬪墠涓嶈兘榪涜璇戠爜銆?br />(3) 綆楁湳緙栫爜涔熸槸涓縐嶅閿欒寰堟晱鎰熺殑緙栫爜鏂規硶錛屽鏋滄湁涓浣嶅彂鐢熼敊璇氨浼氬鑷存暣涓秷鎭瘧閿欍?br />綆楁湳緙栫爜鍙互鏄潤鎬佺殑鎴栬呰嚜閫傚簲鐨勩傚湪闈欐佺畻鏈紪鐮佷腑錛屼俊婧愮鍙風殑姒傜巼鏄浐瀹氱殑銆傚湪鑷傚簲綆楁湳緙栫爜
涓紝淇℃簮絎﹀彿鐨勬鐜囨牴鎹紪鐮佹椂絎﹀彿鍑虹幇鐨勯綣佺▼搴﹀姩鎬佸湴榪涜淇敼錛屽湪緙栫爜鏈熼棿浼扮畻淇℃簮絎﹀彿姒傜巼鐨勮繃紼嬪彨
鍋氬緩妯°傞渶瑕佸紑鍙戝姩鎬佺畻鏈紪鐮佺殑鍘熷洜鏄洜涓轟簨鍏堢煡閬撶簿紜殑淇℃簮姒傜巼鏄緢闅劇殑錛岃屼笖鏄笉鍒囧疄闄呯殑銆傚綋鍘嬬緝
娑堟伅鏃訛紝鎴戜滑涓嶈兘鏈熷緟涓涓畻鏈紪鐮佸櫒鑾峰緱鏈澶х殑鏁堢巼錛屾墍鑳藉仛鐨勬渶鏈夋晥鐨勬柟娉曟槸鍦ㄧ紪鐮佽繃紼嬩腑浼扮畻姒傜巼銆傚洜
姝ゅ姩鎬佸緩妯″氨鎴愪負紜畾緙栫爜鍣ㄥ帇緙╂晥鐜囩殑鍏抽敭銆?br />鎺ュ彈鐨勬暟瀛?闂撮殧 璇戠爜杈撳嚭
1 [0.5, 1) -
0 [0.5, 0.75) 2
0 [0.5, 0.609375) 1
1 [0.5625, 0.609375) -
1 [0.59375, 0.609375) 3
鈥?鈥?鈥?br />絎?9 欏?br />4
4.3 RLE緙栫爜
鍦ㄤ竴騫呭浘鍍忎腑緇忓父鍖呭惈鏈夎澶氶鑹茬浉鍚岀殑鍥懼潡銆傚湪榪欎簺鍥懼潡涓紝璁稿琛屼笂閮藉叿鏈夌浉鍚岀殑棰滆壊錛屾垨鑰呭湪涓琛?br />涓婃湁璁稿榪炵畫鐨勫儚绱犻兘鍏鋒湁鐩稿悓鐨勯鑹插箋傚湪榪欑鎯呭喌涓嬪氨涓嶉渶瑕佸瓨鍌ㄦ瘡涓涓儚绱犵殑棰滆壊鍊鹼紝鑰屼粎浠呭瓨鍌ㄤ竴涓?br />鍍忕礌鐨勯鑹插鹼紝浠ュ強鍏鋒湁鐩稿悓棰滆壊鐨勫儚绱犳暟鐩氨鍙互錛屾垨鑰呭瓨鍌ㄤ竴涓儚绱犵殑棰滆壊鍊鹼紝浠ュ強鍏鋒湁鐩稿悓棰滆壊鍊肩殑琛?br />鏁般傝繖縐嶅帇緙╃紪鐮佺О涓鴻紼嬬紪鐮?run length encoding錛孯LE)錛屽叿鏈夌浉鍚岄鑹插茍涓旀槸榪炵畫鐨勫儚绱犳暟鐩О涓鴻紼?br />闀垮害銆?br />鍋囧畾鏈変竴騫呯伆搴﹀浘鍍忥紝絎琻琛岀殑鍍忕礌鍊煎鍥?-05鎵紺猴細
鍥?-05 RLE緙栫爜鐨勬蹇?br />鐢≧LE緙栫爜鏂規硶寰楀埌鐨勪唬鐮佷負錛?0315084180銆備唬鐮佷腑鐢ㄩ粦浣撹〃紺虹殑鏁板瓧鏄紼嬮暱搴︼紝榛戜綋瀛楀悗闈㈢殑鏁板瓧浠?br />琛ㄥ儚绱犵殑棰滆壊鍊箋備緥濡傞粦浣撳瓧50浠h〃鏈夎繛緇?0涓儚绱犲叿鏈夌浉鍚岀殑棰滆壊鍊鹼紝瀹冪殑棰滆壊鍊兼槸8銆?br />瀵規瘮RLE緙栫爜鍓嶅悗鐨勪唬鐮佹暟鍙互鍙戠幇錛屽湪緙栫爜鍓嶈鐢?3涓唬鐮佽〃紺鴻繖涓琛岀殑鏁版嵁錛岃岀紪鐮佸悗鍙鐢?1涓唬
鐮佽〃紺轟唬琛ㄥ師鏉ョ殑73涓唬鐮侊紝鍘嬬緝鍓嶅悗鐨勬暟鎹噺涔嬫瘮綰︿負7:1錛屽嵆鍘嬬緝姣斾負7:1銆傝繖璇存槑RLE紜疄鏄竴縐嶅帇緙╂妧
鏈紝鑰屼笖榪欑緙栫爜鎶鏈浉褰撶洿瑙傦紝涔熼潪甯哥粡嫻庛?br />璇戠爜鏃舵寜鐓т笌緙栫爜鏃墮噰鐢ㄧ殑鐩稿悓瑙勫垯榪涜錛岃繕鍘熷悗寰楀埌鐨勬暟鎹笌鍘嬬緝鍓嶇殑鏁版嵁瀹屽叏鐩稿悓銆?br />RLE鎵鑳借幏寰楃殑鍘嬬緝姣旀湁澶氬ぇ錛岃繖涓昏鏄彇鍐充簬鍥懼儚鏈韓鐨勭壒鐐廣傚鏋滃浘鍍忎腑鍏鋒湁鐩稿悓棰滆壊鐨勫浘鍍忓潡瓚?br />澶э紝鍥懼儚鍧楁暟鐩秺灝戯紝鑾峰緱鐨勫帇緙╂瘮灝辮秺楂樸傚弽涔嬶紝鍘嬬緝姣斿氨瓚婂皬銆?br />RLE鍘嬬緝緙栫爜灝ゅ叾閫傜敤浜庤綆楁満鐢熸垚鐨勫浘鍍忥紝瀵瑰噺灝戝浘鍍忔枃浠剁殑瀛樺偍絀洪棿闈炲父鏈夋晥銆傜劧鑰岋紝RLE瀵歸鑹蹭赴瀵?br />鐨勮嚜鐒跺浘鍍忓氨鏄懼緱鍔涗笉浠庡績錛屽湪鍚屼竴琛屼笂鍏鋒湁鐩稿悓棰滆壊鐨勮繛緇儚绱犲線寰寰堝皯錛岃岃繛緇嚑琛岄兘鍏鋒湁鐩稿悓棰滆壊鍊肩殑
榪炵畫琛屾暟灝辨洿灝戙傚鏋滀粛鐒朵嬌鐢≧LE緙栫爜鏂規硶錛屼笉浠呬笉鑳藉帇緙╁浘鍍忔暟鎹紝鍙嶈屽彲鑳戒嬌鍘熸潵鐨勫浘鍍忔暟鎹彉寰楁洿
澶с傝娉ㄦ剰錛岃繖騫朵笉鏄RLE緙栫爜鏂規硶涓嶉傜敤浜庤嚜鐒跺浘鍍忕殑鍘嬬緝錛岀浉鍙嶏紝鍦ㄨ嚜鐒跺浘鍍忕殑鍘嬬緝涓繕鐪熷皯涓嶄簡RLE錛?br />鍙笉榪囨槸涓嶈兘鍗曠函浣跨敤RLE涓縐嶇紪鐮佹柟娉曪紝闇瑕佸拰鍏朵粬鐨勫帇緙╃紪鐮佹妧鏈仈鍚堝簲鐢ㄣ?br />4.4 璇嶅吀緙栫爜
鏈夎澶氬満鍚堬紝寮濮嬫椂涓嶇煡閬撹緙栫爜鏁版嵁鐨勭粺璁$壒鎬э紝涔熶笉涓瀹氬厑璁鎬綘浜嬪厛鐭ラ亾瀹冧滑鐨勭粺璁$壒鎬с傚洜姝わ紝浜?br />浠彁鍑轟簡璁歌澶氬鐨勬暟鎹帇緙╂柟娉曪紝灝藉彲鑳借幏寰楁渶澶х殑鍘嬬緝姣斻傝繖浜涙妧鏈粺縐頒負閫氱敤緙栫爜鎶鏈傝瘝鍏哥紪鐮?br />(Dictionary Encoding)鎶鏈氨灞炰簬榪欎竴綾匯?br />4.4.1 璇嶅吀緙栫爜鐨勬濇兂
璇嶅吀緙栫爜(dictionary encoding)鐨勬牴鎹槸鏁版嵁鏈韓鍖呭惈鏈夐噸澶嶄唬鐮佽繖涓壒鎬с備緥濡傛枃鏈枃浠跺拰鍏夋爡鍥懼儚
灝卞叿鏈夎繖縐嶇壒鎬с傝瘝鍏哥紪鐮佹硶鐨勭綾誨緢澶氾紝褰掔撼璧鋒潵澶ц嚧鏈変袱綾匯?br />絎竴綾昏瘝鍏哥畻娉曟槸浼佸浘鏌ユ壘姝e湪鍘嬬緝鐨勫瓧絎﹀簭鍒楁槸鍚﹀湪浠ュ墠杈撳叆鐨勬暟鎹腑鍑虹幇榪囷紝鐒跺悗杈撳嚭浠呬粎鏄寚鍚戞棭
鏈熷嚭鐜拌繃鐨勫瓧絎︿覆鐨勨滄寚閽堚濄傝繖縐嶇紪鐮佹蹇靛鍥?-06鎵紺恒?br />絎?10 欏?br />4
鍥?-06 絎竴綾昏瘝鍏告硶緙栫爜姒傚康
榪欓噷鎵鎸囩殑鈥滆瘝鍏糕濇槸鎸囩敤浠ュ墠澶勭悊榪囩殑鏁版嵁鏉ヨ〃紺虹紪鐮佽繃紼嬩腑閬囧埌鐨勯噸澶嶉儴鍒嗐傝繖綾葷紪鐮佺畻娉曢兘鏄互
Abraham Lempel鍜孞akob Ziv鍦?977騫村紑鍙戝拰鍙戣〃鐨勭О涓篖Z77綆楁硶涓哄熀紜鐨勶紝渚嬪1982騫寸敱Storer鍜孲zymanski
鏀硅繘鐨勭О涓篖ZSS綆楁硶 銆?br />絎簩綾昏瘝鍏哥畻娉曟槸浼佸浘浠庤緭鍏ョ殑鏁版嵁涓垱寤轟竴涓滅煭璇瘝鍏?dictionary of the phrases)鈥濓紝榪欑鐭
涓嶄竴瀹氭槸鍏鋒湁鍏蜂綋鍚箟鐨勭煭璇紝鍙互鏄換鎰忓瓧絎︾殑緇勫悎銆傜紪鐮佽繃紼嬩腑閬囧埌宸茬粡鍦ㄨ瘝鍏鎬腑鍑虹幇鐨勨滅煭璇濇椂錛岀紪
鐮佸櫒灝辮緭鍑鴻繖涓瘝鍏鎬腑鐨勭煭璇殑鈥滅儲寮曞彿鈥濓紝鑰屼笉鏄煭璇湰韜傝繖涓蹇靛鍥?-07鎵紺恒?br />鍥?-07 絎簩綾昏瘝鍏告硶緙栫爜姒傚康
J.Ziv鍜孉.Lempel鍦?978騫撮嬈″彂琛ㄤ簡浠嬬粛榪欑緙栫爜鏂規硶鐨勬枃绔犮傚湪浠栦滑鐨勭爺絀跺熀紜涓婏紝Terry A.Weltch
鍦?984騫村彂琛ㄤ簡鏀硅繘榪欑緙栫爜綆楁硶鐨勬枃绔狅紝鍥犳鎶婅繖縐嶇紪鐮佹柟娉曠О涓篖ZW(Lempel-Ziv Walch)鍘嬬緝緙栫爜錛屽湪楂?br />閫熺‖鐩樻帶鍒跺櫒涓?棣栧厛搴旂敤浜嗚繖縐嶇畻娉曘?br />4.4.2 LZ77綆楁硶
涓轟簡鏇村ソ鍦拌鏄嶭Z77綆楁硶鐨勫師鐞嗭紝棣栧厛浠嬬粛綆楁硶涓敤鍒扮殑鍑犱釜鏈錛?br />(1) 杈撳叆鏁版嵁嫻?input stream)錛氳琚帇緙╃殑瀛楃搴忓垪銆?br />(2) 瀛楃(character)錛氳緭鍏ユ暟鎹祦涓殑鍩烘湰鍗曞厓銆?br />(3) 緙栫爜浣嶇疆(coding position)錛氳緭鍏ユ暟鎹祦涓綋鍓嶈緙栫爜鐨勫瓧絎︿綅緗紝鎸囧墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑寮濮嬪瓧
絎︺?br />(4) 鍓嶅悜緙撳啿瀛樺偍鍣?Lookahead buffer)錛氬瓨鏀句粠緙栫爜浣嶇疆鍒拌緭鍏ユ暟鎹祦緇撴潫鐨勫瓧絎﹀簭鍒楃殑瀛樺偍鍣ㄣ?br />(5) 紿楀彛(window)錛氭寚鍖呭惈W涓瓧絎︾殑紿楀彛錛屽瓧絎︽槸浠庣紪鐮佷綅緗紑濮嬪悜鍚庢暟錛屼篃灝辨槸鏈鍚庡鐞嗙殑W涓瓧
絎?銆?婊戝姩紿楀彛)
(6) 鎸囬拡(pointer)錛氭寚鍚戠獥鍙d腑鐨勫尮閰嶄覆鐨勫紑濮嬩綅緗笖鍚暱搴︾殑鎸囬拡銆?br />LZ77緙栫爜綆楁硶鐨勬牳蹇冩槸鏌ユ壘浠庡墠鍚戠紦鍐插瓨鍌ㄥ櫒寮濮嬬殑涓庣獥鍙d腑鏈闀跨殑鍖歸厤涓層傜紪鐮佺畻娉曠殑鍏蜂綋鎵ц姝ラ濡?br />涓嬶細
絎?11 欏?br />4
(1) 鎶婄紪鐮佷綅緗緗埌杈撳叆鏁版嵁嫻佺殑寮濮嬩綅緗?br />(2) 鏌ユ壘紿楀彛涓渶闀跨殑鍖歸厤涓層?br />(3) 浠モ?Pointer, Length) Character鈥濅笁鍏冪粍鐨勬牸寮忚緭鍑猴紝鍏朵腑Pointer鏄寚鍚戠獥鍙d腑鍖歸厤涓茬殑鎸囬拡錛?br />Length琛ㄧず鍖歸厤瀛楃鐨勯暱搴︼紝Characters鏄墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑涓嶅尮閰嶇殑絎?涓瓧絎︺傛病鏈夊尮閰嶇殑瀛楃涓叉椂錛?br />杈撳嚭鈥?0, 0) Character鈥?br />(4) 濡傛灉鍓嶅悜緙撳啿瀛樺偍鍣ㄤ笉鏄┖鐨勶紝鍒欐妸緙栫爜浣嶇疆鍜岀獥鍙e悜鍓嶇Щ(Length+1)涓瓧絎︼紝鐒跺悗榪斿洖鍒版楠?銆?br />[渚?.4] 寰呯紪鐮佺殑鏁版嵁嫻佸琛?-09鎵紺猴紝緙栫爜榪囩▼濡傝〃4-10鎵紺恒傜幇浣滃涓嬭鏄庯細
(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず緙栫爜浣嶇疆錛岃緭鍏ユ暟鎹祦涓殑絎?涓瓧絎︿負緙栫爜浣嶇疆1銆?br />(3) 鈥滃尮閰嶄覆鈥濇爮琛ㄧず紿楀彛涓壘鍒扮殑鏈闀跨殑鍖歸厤涓層?br />(4) 鈥滃瓧絎︹濇爮琛ㄧず鍖歸厤涔嬪悗鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑絎?涓瓧絎︺?br />(5) 鈥滆緭鍑衡濇爮浠モ?Back_chars, Chars_length) Explicit_character鈥濇牸寮忚緭鍑恒傚叾涓紝
(Back_chars, Chars_length)鏄寚鍚戝尮閰嶄覆鐨勬寚閽堬紝鍛婅瘔璇戠爜鍣ㄢ滃湪榪欎釜紿楀彛涓悜鍚庨Back_chars涓瓧絎︾劧鍚?br />鎷瘋礉Chars_length涓瓧絎﹀埌杈撳嚭鈥濓紝Explicit_character鏄湡瀹炲瓧絎︺備緥濡傦紝琛?-10涓殑杈撳嚭鈥?5,2) C鈥濆憡
璇夎瘧鐮佸櫒鍥為5涓瓧絎︼紝鐒跺悗鎷瘋礉2涓瓧絎︹淎B鈥?br />琛?-09寰呯紪鐮佺殑鏁版嵁嫻?br />琛?-10 緙栫爜榪囩▼
4.4.3 LZSS綆楁硶
LZ77閫氳繃杈撳嚭鐪熷疄瀛楃瑙e喅浜嗗湪紿楀彛涓嚭鐜版病鏈夊尮閰嶄覆鐨勯棶棰橈紝浣嗚繖涓В鍐蟲柟妗堝寘鍚湁鍐椾綑淇℃伅銆傚啑浣欎俊
鎭〃鐜板湪涓や釜鏂歸潰錛屼竴鏄┖鎸囬拡錛屼簩鏄紪鐮佸櫒杈撳嚭鐨勫瓧絎﹀彲鑳藉寘鍚湪涓嬩竴涓尮閰嶄覆涓殑瀛楃銆?br />LZSS綆楁硶浠ユ瘮杈冩湁鏁堢殑鏂規硶瑙e喅榪欎釜闂錛屾濇兂鏄鏋滃尮閰嶄覆鐨勯暱搴︽瘮鎸囬拡鏈韓鐨勯暱搴?錛堟渶灝忓尮閰嶄覆闀?br />搴︼級闀垮氨杈撳嚭鎸囬拡錛屽惁鍒欏氨杈撳嚭鐪熷疄瀛楃銆傜敱浜庤緭鍑虹殑鍘嬬緝鏁版嵁嫻佷腑鍖呭惈鏈夋寚閽堝拰瀛楃鏈韓錛屼負浜嗗尯鍒嗗畠浠氨
闇瑕佹湁棰濆鐨勬爣蹇椾綅錛屽嵆ID浣嶃?br />LZSS緙栫爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
(1) 鎶婄紪鐮佷綅緗疆浜庤緭鍏ユ暟鎹祦鐨勫紑濮嬩綅緗?br />(2) 鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓煡鎵句笌紿楀彛涓渶闀跨殑鍖歸厤涓?br />鈶?Pointer 錛?鍖歸厤涓叉寚閽堛?br />鈶?Length 錛?鍖歸厤涓查暱搴︺?br />(3) 鍒ゆ柇鍖歸厤涓查暱搴ength鏄惁澶т簬絳変簬鏈灝忓尮閰嶄覆闀垮害(Length鈮IN_LENGTH)錛?br />濡傛灉鈥滄槸鈥濓細杈撳嚭鎸囬拡錛岀劧鍚庢妸緙栫爜浣嶇疆鍚戝墠縐誨姩Length涓瓧絎︺?br />浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A A B C B B A B C
姝ラ 浣嶇疆 鍖歸厤涓?瀛楃 杈撳嚭
1 1 -- A (0,0) A
2 2 A B (1,1) B
3 4 -- C (0,0) C
4 5 B B (2,1) B
5 7 A B C (5,2) C
絎?12 欏?br />4
濡傛灉鈥滃惁鈥濓細杈撳嚭鍓嶅悜緙撳啿瀛樺偍鍣ㄤ腑鐨勭1涓瓧絎︼紝鐒跺悗鎶婄紪鐮佷綅緗悜鍓嶇Щ鍔ㄤ竴涓瓧絎︺?br />(4) 濡傛灉鍓嶅悜緙撳啿瀛樺偍鍣ㄤ笉鏄┖鐨勶紝灝辮繑鍥炲埌姝ラ2銆?br />[渚?.5] 緙栫爜瀛楃涓插琛?-11鎵紺猴紝緙栫爜榪囩▼濡傝〃4-12鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず緙栫爜浣嶇疆錛岃緭鍏ユ暟鎹祦涓殑絎?涓瓧絎︿負緙栫爜浣嶇疆1銆?br />(3) 鈥滃尮閰嶁濇爮琛ㄧず紿楀彛涓壘鍒扮殑鏈闀跨殑鍖歸厤涓層?br />(4) 鈥滃瓧絎︹濇爮琛ㄧず鍖歸厤涔嬪悗鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑絎?涓瓧絎︺?br />(5) 鈥滆緭鍑衡濇爮鐨勮緭鍑轟負錛?br />鈶?濡傛灉鍖歸厤涓叉湰韜殑闀垮害Length鈮IN_LENGTH錛岃緭鍑烘寚鍚戝尮閰嶄覆鐨勬寚閽堬紝鏍煎紡涓?Back_chars,
Chars_length)銆傝鎸囬拡鍛婅瘔璇戠爜鍣ㄢ滃湪榪欎釜紿楀彛涓悜鍚庨Back_chars涓瓧絎︾劧鍚庢嫹璐滳hars_length涓瓧絎﹀埌
杈撳嚭鈥濄?br />鈶?濡傛灉鍖歸厤涓叉湰韜殑闀垮害Length鈮IN_LENGTH錛屽垯杈撳嚭鐪熷疄鐨勫尮閰嶄覆銆?br />琛?-11 杈撳叆鏁版嵁嫻?br />琛?-12 緙栫爜榪囩▼(MIN_LENGTH = 2)
鍦ㄧ浉鍚岀殑璁$畻鐜涓嬶紝LZSS綆楁硶姣擫Z77鍙幏寰楁瘮杈冮珮鐨勫帇緙╂瘮錛岃岃瘧鐮佸悓鏍風畝鍗曘傝繖涔熷氨鏄負浠涔堣繖縐嶇畻
娉曟垚涓哄紑鍙戞柊綆楁硶鐨勫熀紜錛岃澶氬悗鏉ュ紑鍙戠殑鏂囨。鍘嬬緝紼嬪簭閮戒嬌鐢ㄤ簡LZSS鐨勬濇兂銆備緥濡傦紝PKZip, ARJ, LHArc鍜?br />ZOO絳夌瓑錛屽叾宸埆浠呬粎鏄寚閽堢殑闀跨煭鍜岀獥鍙g殑澶у皬絳夋湁鎵涓嶅悓銆?br />LZSS鍚屾牱鍙互鍜岀喌緙栫爜鑱斿悎浣跨敤錛屼緥濡侫RJ灝變笌闇嶅か鏇肩紪鐮佽仈鐢紝鑰孭KZip鍒欎笌Shannon-Fano鑱旂敤錛屽畠鐨勫悗
緇増鏈篃閲囩敤闇嶅か鏇肩紪鐮併?br />4.4.4 LZ78綆楁硶
鍦ㄤ粙緇峀Z78綆楁硶涔嬪墠錛岄鍏堣鏄庡湪綆楁硶涓敤鍒扮殑鍑犱釜鏈鍜岀鍙鳳細
(1) 瀛楃嫻?Charstream)錛氳琚紪鐮佺殑鏁版嵁搴忓垪銆?br />(2) 瀛楃(Character)錛氬瓧絎︽祦涓殑鍩烘湰鏁版嵁鍗曞厓銆?br />(3) 鍓嶇紑(Prefix)錛?鍦ㄤ竴涓瓧絎︿箣鍓嶇殑瀛楃搴忓垪銆?br />(4) 緙-絎︿覆(String)錛氬墠緙錛嬪瓧絎︺?br />(5) 鐮佸瓧(Code word)錛氱爜瀛楁祦涓殑鍩烘湰鏁版嵁鍗曞厓錛屼唬琛ㄨ瘝鍏鎬腑鐨勪竴涓插瓧絎︺?br />(6) 鐮佸瓧嫻?Codestream)錛?鐮佸瓧鍜屽瓧絎︾粍鎴愮殑搴忓垪錛屾槸緙栫爜鍣ㄧ殑杈撳嚭銆?br />(7) 璇嶅吀(Dictionary)錛?緙-絎︿覆琛ㄣ傛寜鐓ц瘝鍏鎬腑鐨勭儲寮曞彿瀵規瘡鏉$紑-絎︿覆(String)鎸囧畾涓涓爜瀛?Code
浣嶇疆 1 2 3 4 5 6 7 8 9 10 11
瀛楃 A A B B C B B A A B C
姝ラ 浣嶇疆 鍖歸厤涓?杈撳嚭
1 1 -- A
2 2 A A
3 3 -- B
4 4 B B
5 5 -- C
6 6 B B (3,2)
7 8 A A B (7,3)
8 11 C C
絎?13 欏?br />4
word)銆?br />(8) 褰撳墠鍓嶇紑(Current prefix)錛氬湪緙栫爜綆楁硶涓嬌鐢紝鎸囧綋鍓嶆鍦ㄥ鐞嗙殑鍓嶇紑錛岀敤絎﹀彿P琛ㄧず銆?br />(9) 褰撳墠瀛楃(Current character)錛氬湪緙栫爜綆楁硶涓嬌鐢紝鎸囧綋鍓嶅墠緙涔嬪悗鐨勫瓧絎︼紝鐢ㄧ鍙稢琛ㄧず銆?br />(10) 褰撳墠鐮佸瓧(Current code word)錛?鍦ㄨ瘧鐮佺畻娉曚腑浣跨敤錛屾寚褰撳墠澶勭悊鐨勭爜瀛楋紝鐢╓琛ㄧず褰撳墠鐮佸瓧錛?br />String.W琛ㄧず褰撳墠鐮佸瓧鐨勭紑-絎︿覆銆?br />1. 緙栫爜綆楁硶
LZ78鐨勭紪鐮佹濇兂鏄笉鏂湴浠庡瓧絎︽祦涓彁鍙栨柊鐨勭紑-絎︿覆(String)錛岄氫織鍦扮悊瑙d負鏂扳滆瘝鏉♀濓紝鐒跺悗鐢ㄢ滀唬
鍙封濅篃灝辨槸鐮佸瓧(Code word)琛ㄧず榪欎釜鈥滆瘝鏉♀濄傝繖鏍蜂竴鏉ワ紝瀵瑰瓧絎︽祦鐨勭紪鐮佸氨鍙樻垚浜嗙敤鐮佸瓧(Code word)鍘繪浛
鎹㈠瓧絎︽祦(Charstream)錛岀敓鎴愮爜瀛楁祦(Codestream)錛屼粠鑰岃揪鍒板帇緙╂暟鎹殑鐩殑銆?br />鍦ㄧ紪鐮佸紑濮嬫椂璇嶅吀鏄┖鐨勶紝涓嶅寘鍚換浣曠紑-絎︿覆(string)銆傚湪榪欑鎯呭喌涓嬬紪鐮佸櫒灝辮緭鍑轟竴涓〃紺虹┖瀛楃涓?br />鐨勭壒孌婄爜瀛?渚嬪鈥?鈥?鍜屽瓧絎︽祦涓?Charstream)鐨勭涓涓瓧絎錛屽茍鎶婅繖涓瓧絎娣誨姞鍒拌瘝鍏鎬腑浣滀負涓涓敱涓
涓瓧絎︾粍鎴愮殑緙-絎︿覆(string)銆傚湪緙栫爜榪囩▼涓紝濡傛灉鍑虹幇綾諱技鐨勬儏鍐碉紝涔熺収姝ゅ姙鐞嗐?br />鍦ㄨ瘝鍏鎬腑宸茬粡鍖呭惈鏌愪簺緙-絎︿覆(String)涔嬪悗錛屽鏋溾滃綋鍓嶅墠緙P +褰撳墠瀛楃C鈥濆凡緇忓湪璇嶅吀涓紝灝辯敤瀛楃C
鏉ユ墿灞曡繖涓墠緙錛岃繖鏍風殑鎵╁睍鎿嶄綔涓鐩撮噸澶嶅埌鑾峰緱涓涓湪璇嶅吀涓病鏈夌殑緙-絎︿覆(String)涓烘銆傛鏃跺氨杈撳嚭琛?br />紺哄綋鍓嶅墠緙P鐨勭爜瀛?Code word)鍜屽瓧絎錛屽茍鎶奝+C娣誨姞鍒拌瘝鍏鎬腑錛岀劧鍚庡紑濮嬪鐞嗗瓧絎︽祦(Charstream)涓殑涓嬩竴
涓墠緙銆?br />LZ78緙栫爜鍣ㄧ殑杈撳嚭鏄爜瀛?瀛楃(W,C)瀵癸紝姣忔杈撳嚭涓瀵瑰埌鐮佸瓧嫻佷腑錛屽茍鐢ㄥ瓧絎鎵╁睍涓庣爜瀛梂鐩稿搴旂殑緙-
絎︿覆(String)錛岀敓鎴愭柊鐨勭紑-絎︿覆(String)錛岀劧鍚庢坊鍔犲埌璇嶅吀涓?br />LZ78緙栫爜鐨勫叿浣撶畻娉曞涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬫椂錛岃瘝鍏稿拰褰撳墠鍓嶇紑P閮芥槸絀虹殑銆?br />姝ラ2錛?褰撳墠瀛楃C 錛? 瀛楃嫻佷腑鐨勪笅涓涓瓧絎︺?br />姝ラ3錛?鍒ゆ柇P+C鏄惁鍦ㄨ瘝鍏鎬腑錛?br />(1) 濡傛灉鈥滄槸鈥濓細鐢–鎵╁睍P錛岃P 錛? P+C 錛?br />(2) 濡傛灉鈥滃惁鈥濓細
鈶?杈撳嚭涓庡綋鍓嶅墠緙P鐩稿搴旂殑鐮佸瓧鍜屽綋鍓嶅瓧絎錛?br />鈶?鎶婂瓧絎︿覆P+C 娣誨姞鍒拌瘝鍏鎬腑銆?br />鈶?浠 錛? 絀哄箋?br />(3) 鍒ゆ柇瀛楃嫻佷腑鏄惁榪樻湁瀛楃闇瑕佺紪鐮?br />鈶?濡傛灉鈥滄槸鈥濓細榪斿洖鍒版楠?銆?br />鈶?濡傛灉鈥滃惁鈥濓細鑻ュ綋鍓嶅墠緙P涓嶆槸絀虹殑錛岃緭鍑虹浉搴斾簬褰撳墠鍓嶇紑P鐨勭爜瀛楋紝鐒跺悗緇撴潫緙栫爜銆?br />2. 璇戠爜綆楁硶
鍦ㄨ瘧鐮佸紑濮嬫椂璇戠爜璇嶅吀鏄┖鐨勶紝瀹冨皢鍦ㄨ瘧鐮佽繃紼嬩腑浠庣爜瀛楁祦涓噸鏋勩傛瘡褰撲粠鐮佸瓧嫻佷腑璇誨叆涓瀵圭爜瀛?瀛楃
(W,C)瀵規椂錛岀爜瀛楀氨鍙傝冨凡緇忓湪璇嶅吀涓殑緙-絎︿覆錛岀劧鍚庢妸褰撳墠鐮佸瓧鐨勭紑-絎︿覆string.W 鍜屽瓧絎杈撳嚭鍒板瓧絎︽祦
(Charstream)錛岃屾妸褰撳墠緙-絎︿覆(string.W+C)娣誨姞鍒拌瘝鍏鎬腑銆傚湪璇戠爜緇撴潫涔嬪悗錛岄噸鏋勭殑璇嶅吀涓庣紪鐮佹椂鐢熸垚鐨?br />璇嶅吀瀹屽叏鐩稿悓銆?br />LZ78璇戠爜鐨勫叿浣撶畻娉曞涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬫椂璇嶅吀鏄┖鐨勩?br />姝ラ2錛?褰撳墠鐮佸瓧W 錛? 鐮佸瓧嫻佷腑鐨勪笅涓涓爜瀛椼?br />姝ラ3錛?褰撳墠瀛楃C 錛? 绱ч殢鐮佸瓧涔嬪悗鐨勫瓧絎︺?br />姝ラ4錛?鎶婂綋鍓嶇爜瀛楃殑緙-絎︿覆(string.W)杈撳嚭鍒板瓧絎︽祦(Charstream)錛岀劧鍚庤緭鍑哄瓧絎銆?br />姝ラ5錛?鎶妔tring.W+C娣誨姞鍒拌瘝鍏鎬腑銆?br />姝ラ6錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
絎?14 欏?br />4
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ2銆?br />(2) 濡傛灉鈥滃惁鈥濓紝鍒欑粨鏉熴?br />[渚?.6] 緙栫爜瀛楃涓插琛?-13鎵紺猴紝緙栫爜榪囩▼濡傝〃4-14鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず鍦ㄨ緭鍏ユ暟鎹腑鐨勫綋鍓嶄綅緗?br />(3) 鈥滆瘝鍏糕濇爮琛ㄧず娣誨姞鍒拌瘝鍏鎬腑鐨勭紑-絎︿覆錛岀紑-絎︿覆鐨勭儲寮曠瓑浜庘滄楠も濆簭鍙楓?br />(4) 鈥滆緭鍑衡濇爮浠?褰撳墠鐮佸瓧W, 褰撳墠瀛楃C)綆鍖栦負(W, C)鐨勫艦寮忚緭鍑恒?br />琛?-13 緙栫爜瀛楃涓?br />琛?-14 緙栫爜榪囩▼
涓嶭Z77鐩告瘮錛孡Z78鐨勬渶澶т紭鐐規槸鍦ㄦ瘡涓紪鐮佹楠や腑鍑忓皯浜嗙紑-絎︿覆(String)姣旇緝鐨勬暟鐩紝鑰屽帇緙╃巼涓嶭Z77
綾諱技銆?br />4.4.5 LZW綆楁硶
鍦↙ZW綆楁硶涓嬌鐢ㄧ殑鏈涓嶭Z78浣跨敤鐨勭浉鍚岋紝浠呭鍔犱簡涓涓湳璇斿墠緙鏍?Root)錛屽畠鏄敱鍗曚釜瀛楃緇勬垚鐨?br />緙-絎︿覆(String)銆傚湪緙栫爜鍘熺悊涓婏紝LZW涓嶭Z78鐩告瘮鏈夊涓嬪樊鍒細
鈶?LZW鍙緭鍑轟唬琛ㄨ瘝鍏鎬腑鐨勭紑-絎︿覆(String)鐨勭爜瀛?code word)銆傝繖灝辨剰鍛沖湪寮濮嬫椂璇嶅吀涓嶈兘鏄┖鐨勶紝瀹?br />蹇呴』鍖呭惈鍙兘鍦ㄥ瓧絎︽祦鍑虹幇涓殑鎵鏈夊崟涓瓧絎︼紝鍗沖墠緙鏍?Root)銆?br />鈶?鐢變簬鎵鏈夊彲鑳藉嚭鐜扮殑鍗曚釜瀛楃閮戒簨鍏堝寘鍚湪璇嶅吀涓紝姣忔緙栫爜寮濮嬫椂閮戒嬌鐢ㄤ竴涓瓧絎﹀墠緙(onecharacter
prefix)錛屽洜姝ゅ湪璇嶅吀涓鍔犵殑絎?涓紑-絎︿覆鏈変袱涓瓧絎︺?br />鐜板皢LZW緙栫爜綆楁硶鍜岃瘧鐮佺畻娉曚粙緇嶅涓嬨?br />1. 緙栫爜綆楁硶
LZW緙栫爜鏄洿緇曠О涓鴻瘝鍏哥殑杞崲琛ㄦ潵瀹屾垚鐨勩傝繖寮犺漿鎹㈣〃瀛樻斁縐頒負鍓嶇紑(Prefix)鐨勫瓧絎﹀簭鍒楋紝騫朵負姣忎釜琛?br />欏瑰垎閰嶄竴涓爜瀛?Code word)錛屾垨鑰呭彨鍋氬簭鍙鳳紝濡傝〃4-15鎵紺恒傝繖寮犺漿鎹㈣〃瀹為檯涓婃槸鎶?浣岮SCII瀛楃闆嗚繘琛屾墿
鍏咃紝澧炲姞鐨勭鍙風敤鏉ヨ〃紺哄湪鏂囨湰鎴栧浘鍍忎腑鍑虹幇鐨勫彲鍙橀暱搴SCII瀛楃涓層傛墿鍏呭悗鐨勪唬鐮佸彲鐢?浣嶃?0浣嶃?1浣嶃?br />12浣嶇敋鑷蟲洿澶氱殑浣嶆潵琛ㄧず銆俉elch鐨勮鏂囦腑鐢ㄤ簡12浣嶏紝12浣嶅彲浠ユ湁4096涓笉鍚岀殑12浣嶄唬鐮侊紝榪欏氨鏄錛岃漿鎹㈣〃
鏈?096涓〃欏癸紝鍏朵腑256涓〃欏圭敤鏉ュ瓨鏀懼凡瀹氫箟鐨勫瓧絎︼紝鍓╀笅3840涓〃欏圭敤鏉ュ瓨鏀懼墠緙(Prefix)銆?br />琛?-15 璇嶅吀
浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A B B C B C A B A
姝ラ 浣嶇疆 璇嶅吀 杈撳嚭
1 1 A (0,A)
2 2 B (0,B)
3 3 B C (2,C)
4 5 B C A (3,A)
5 8 B A (2,A)
鐮佸瓧(Code word) 鍓嶇紑(Prefix)
1
絎?15 欏?br />4
LZW緙栫爜鍣?杞歡緙栫爜鍣ㄦ垨紜歡緙栫爜鍣?灝辨槸閫氳繃綆$悊榪欎釜璇嶅吀瀹屾垚杈撳叆涓庤緭鍑轟箣闂寸殑杞崲銆侺ZW緙栫爜鍣ㄧ殑杈?br />鍏ユ槸瀛楃嫻?Charstream)錛屽瓧絎︽祦鍙互鏄敤8浣岮SCII瀛楃緇勬垚鐨勫瓧絎︿覆錛岃岃緭鍑烘槸鐢╪浣?渚嬪12浣?琛ㄧず鐨勭爜
瀛楁祦(Codestream)錛岀爜瀛椾唬琛ㄥ崟涓瓧絎︽垨澶氫釜瀛楃緇勬垚鐨勫瓧絎︿覆銆?br />LZW緙栫爜鍣ㄤ嬌鐢ㄤ簡涓縐嶅緢瀹炵敤鐨勫垎鏋?parsing)綆楁硶錛岀О涓鴻椽濠垎鏋愮畻娉?greedy parsing algorithm)銆傚湪
璐┆鍒嗘瀽綆楁硶涓紝姣忎竴嬈″垎鏋愰兘瑕佷覆琛屽湴媯鏌ユ潵鑷瓧絎︽祦(Charstream)鐨勫瓧絎︿覆錛屼粠涓垎瑙e嚭宸茬粡璇嗗埆鐨勬渶闀?br />鐨勫瓧絎︿覆錛屼篃灝辨槸宸茬粡鍦ㄨ瘝鍏鎬腑鍑虹幇鐨勬渶闀跨殑鍓嶇紑(Prefix)銆傜敤宸茬煡鐨勫墠緙(Prefix)鍔犱笂涓嬩竴涓緭鍏ュ瓧絎涔?br />灝辨槸褰撳墠瀛楃(Current character)浣滀負璇ュ墠緙鐨勬墿灞曞瓧絎︼紝褰㈡垚鏂扮殑鎵╁睍瀛楃涓測斺旂紑-絎︿覆(String)錛?br />Prefix+C銆傝繖涓柊鐨勭紑-絎︿覆(String)鏄惁瑕佸姞鍒拌瘝鍏鎬腑錛岃繕瑕佺湅璇嶅吀涓槸鍚﹀瓨鏈夊拰瀹冪浉鍚岀殑緙-絎︿覆String銆?br />濡傛灉鏈夛紝閭d箞榪欎釜緙-絎︿覆(String)灝卞彉鎴愬墠緙(Prefix)錛岀戶緇緭鍏ユ柊鐨勫瓧絎︼紝鍚﹀垯灝辨妸榪欎釜緙-絎︿覆(String)
鍐欏埌璇嶅吀涓敓鎴愪竴涓柊鐨勫墠緙(Prefix)錛屽茍鍒嗛厤緇欎竴涓唬鐮併?br />LZW緙栫爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
姝ラ1錛?寮濮嬫椂鐨勮瘝鍏稿寘鍚墍鏈夊彲鑳界殑鏍?Root)錛岃屽綋鍓嶅墠緙P鏄┖鐨勶紱
姝ラ2錛?褰撳墠瀛楃(C) 錛?瀛楃嫻佷腑鐨勪笅涓涓瓧絎︼紱
姝ラ3錛?鍒ゆ柇緙-絎︿覆P+C鏄惁鍦ㄨ瘝鍏鎬腑
(1) 濡傛灉鈥滄槸鈥濓細P 錛? P+C // (鐢–鎵╁睍P) 錛?br />(2) 濡傛灉鈥滃惁鈥?br />鈶?鎶婁唬琛ㄥ綋鍓嶅墠緙P鐨勭爜瀛楄緭鍑哄埌鐮佸瓧嫻?
鈶?鎶婄紑-絎︿覆P+C娣誨姞鍒拌瘝鍏?
鈶?浠 錛? C //(鐜板湪鐨凱浠呭寘鍚竴涓瓧絎);
姝ラ4錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ2錛?br />(2) 濡傛灉鈥滃惁鈥?br />鈶?鎶婁唬琛ㄥ綋鍓嶅墠緙P鐨勭爜瀛楄緭鍑哄埌鐮佸瓧嫻?
鈶?緇撴潫銆?br />LZW緙栫爜綆楁硶鍙敤浼爜琛ㄧず銆傚紑濮嬫椂鍋囪緙栫爜璇嶅吀鍖呭惈鑻ュ共涓凡緇忓畾涔夌殑鍗曚釜鐮佸瓧銆備緥濡傦紝256涓瓧絎︾殑鐮?br />瀛楋紝鐢ㄤ吉鐮佸彲浠ヨ〃紺烘垚錛?br />鈥?鈥?br />193 A
194 B
鈥?鈥?br />255
鈥?鈥?br />1305 abcdefxyF01234
鈥?鈥?br />Dictionary[j] 鈫?all n single-character錛?j錛?, 2錛?鈥︼紝n
j 鈫?n+1
Prefix 鈫?read first Character in Charstream
while((C 鈫?next Character)!=NULL)
絎?16 欏?br />4
2. 璇戠爜綆楁硶
LZW璇戠爜綆楁硶涓繕鐢ㄥ埌鍙﹀涓や釜鏈錛?br />鈶?褰撳墠鐮佸瓧(Current code word)錛氭寚褰撳墠姝e湪澶勭悊鐨勭爜瀛楋紝鐢╟W琛ㄧず錛岀敤string.cW琛ㄧず褰撳墠緙-絎︿覆錛?br />鈶?鍏堝墠鐮佸瓧(Previous code word)錛氭寚鍏堜簬褰撳墠鐮佸瓧鐨勭爜瀛楋紝鐢╬W琛ㄧず錛岀敤string.pW琛ㄧず鍏堝墠緙-絎?br />涓層?br />LZW璇戠爜綆楁硶寮濮嬫椂錛岃瘧鐮佽瘝鍏鎬笌緙栫爜璇嶅吀鐩稿悓錛屽畠鍖呭惈鎵鏈夊彲鑳界殑鍓嶇紑鏍?roots)銆侺ZW綆楁硶鍦ㄨ瘧鐮佽繃紼?br />涓細璁頒綇鍏堝墠鐮佸瓧(pW)錛屼粠鐮佸瓧嫻佷腑璇誨綋鍓嶇爜瀛?cW)涔嬪悗杈撳嚭褰撳墠緙-絎︿覆string.cW錛岀劧鍚庢妸鐢╯tring.cW鐨?br />絎竴涓瓧絎︽墿灞曠殑鍏堝墠緙-絎︿覆string.pW娣誨姞鍒拌瘝鍏鎬腑銆?br />LZW璇戠爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬭瘧鐮佹椂璇嶅吀鍖呭惈鎵鏈夊彲鑳界殑鍓嶇紑鏍?Root)銆?br />姝ラ2錛?cW 錛? 鐮佸瓧嫻佷腑鐨勭涓涓爜瀛椼?br />姝ラ3錛?杈撳嚭褰撳墠緙-絎︿覆string.cW鍒扮爜瀛楁祦銆?br />姝ラ4錛?鍏堝墠鐮佸瓧pW 錛? 褰撳墠鐮佸瓧cW銆?br />姝ラ5錛?褰撳墠鐮佸瓧cW 錛? 鐮佸瓧嫻佷腑鐨勪笅涓涓爜瀛椼?br />姝ラ6錛?鍒ゆ柇褰撳墠緙-絎︿覆string.cW鏄惁鍦ㄨ瘝鍏鎬腑
(1) 濡傛灉鈥滄槸鈥濓紝鍒欙細
鈶?鎶婂綋鍓嶇紑-絎︿覆string.cW杈撳嚭鍒板瓧絎︽祦銆?br />鈶?鎶婂厛鍓嶇紑-絎︿覆string.pW + 褰撳墠鍓嶇紑-絎︿覆string.cW鐨勭涓涓瓧絎娣誨姞鍒拌瘝鍏搞?br />(2) 濡傛灉鈥滃惁鈥濓紝鍒欙細
鈶?杈撳嚭鍏堝墠緙-絎︿覆string.pW + 鍏堝墠緙-絎︿覆string.pW鐨勭涓涓瓧絎﹀埌瀛楃嫻侊紝
鈶?鎶婂畠娣誨姞鍒拌瘝鍏鎬腑銆?br />姝ラ7錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ4銆?br />(2) 濡傛灉鈥滃惁鈥? 緇撴潫銆?br />LZW璇戠爜綆楁硶鍙敤浼爜琛ㄧず濡備笅錛?br />Codestream 鈫?cW for Prefix
Dictionary[j] 鈫?all n single-character錛?j錛?, 2錛?鈥︼紝n
j 鈫?n+1
cW 鈫?first code from Codestream
Charstream 鈫?Dictionary[cW]
pW 鈫?cW
While((cW 鈫?next Code word)!=NULL)
絎?17 欏?br />4
[渚?.7] 緙栫爜瀛楃涓插琛?-16鎵紺猴紝緙栫爜榪囩▼濡傝〃4-17鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ錛?br />(2) 鈥滀綅緗濇爮琛ㄧず鍦ㄨ緭鍏ユ暟鎹腑鐨勫綋鍓嶄綅緗紱
(3) 鈥滆瘝鍏糕濇爮琛ㄧず娣誨姞鍒拌瘝鍏鎬腑鐨勭紑-絎︿覆錛屽畠鐨勭儲寮曞湪鎷彿涓紱
(4) 鈥滆緭鍑衡濇爮琛ㄧず鐮佸瓧杈撳嚭銆?br />琛?-16 琚紪鐮佺殑瀛楃涓?br />琛?-17 LZW鐨勭紪鐮佽繃紼?br />琛?-18瑙i噴浜嗚瘧鐮佽繃紼嬨傛瘡涓瘧鐮佹楠よ瘧鐮佸櫒璇諱竴涓爜瀛楋紝杈撳嚭鐩稿簲鐨勭紑-絎︿覆錛屽茍鎶婂畠娣誨姞鍒拌瘝鍏鎬腑銆?br />渚嬪錛屽湪姝ラ4涓紝鍏堝墠鐮佸瓧(2)瀛樺偍鍦ㄥ厛鍓嶇爜瀛?pW)涓紝褰撳墠鐮佸瓧(cW)鏄?4)錛屽綋鍓嶇紑-絎︿覆string.cW鏄緭鍑?br />(鈥淎 B鈥?錛屽厛鍓嶇紑-絎︿覆string.pW ("B")鏄敤褰撳墠緙-絎︿覆string.cW ("A")鐨勭涓涓瓧絎︼紝鍏剁粨鏋?"B A")
娣誨姞鍒拌瘝鍏鎬腑錛屽畠鐨勭儲寮曞彿鏄?6)
琛?-18 LZW鐨勮瘧鐮佽繃紼?br />LZW綆楁硶寰楀埌鏅亶閲囩敤錛屽畠鐨勯熷害姣斾嬌鐢↙Z77綆楁硶鐨勯熷害蹇紝鍥犱負瀹冧笉闇瑕佹墽琛岄偅涔堝鐨勭紑-絎︿覆姣旇緝鎿?br />浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A B B A B A B A C
姝ラ 浣嶇疆 璇嶅吀 杈撳嚭
(1) A
(2) B
(3) C
1 1 (4) A B (1)
2 2 (5) B B (2)
3 3 (6) B A (2)
4 4 (7) A B A (4)
5 6 (8) A B A C (7)
6 -- -- -- (3)
姝ラ 浠g爜 璇嶅吀 杈撳嚭
(1) A
(2) B
(3) C
1 (1) -- -- A
2 (2) (4) A B B
3 (2) (5) B B B
4 (4) (6) B A A B
5 (7) (7) A B A A B A
6 (3) (8) A B A C C
絎?18 欏?br />4
浣溿傚LZW綆楁硶榪涗竴姝ョ殑鏀硅繘鏄鍔犲彲鍙樼殑鐮佸瓧闀垮害錛屼互鍙婂湪璇嶅吀涓垹闄よ佺殑緙-絎︿覆銆傚湪GIF鍥懼儚鏍煎紡鍜孶NIX
鐨勫帇緙╃▼搴忎腑宸茬粡閲囩敤浜嗚繖浜涙敼榪涙帾鏂戒箣鍚庣殑LZW綆楁硶銆?br />LZW綆楁硶鍙栧緱浜嗕笓鍒╋紝涓撳埄鏉冪殑鎵鏈夎呮槸緹庡浗鐨勪竴涓ぇ鍨嬭綆楁満鍏徃鈥擴nisys(浼樺埄緋葷粺鍏徃)錛岄櫎浜嗗晢涓?br />杞歡鐢熶駭鍏徃涔嬪錛屽彲浠ュ厤璐逛嬌鐢↙ZW綆楁硶銆?/font>
]]>
鏈 鐩磋鐨勬悳绱㈡柟寮忔槸欏哄簭鎼滅儲錛氫互寰呭帇緙╅儴鍒嗙殑絎竴涓瓧鑺備笌紿楀彛涓殑姣忎竴涓瓧鑺備緷嬈℃瘮杈冿紝褰撴壘鍒頒竴涓浉絳夌殑瀛楄妭鏃訛紝鍐嶆瘮杈冨悗緇殑瀛楄妭鈥︹?閬嶅巻浜嗙獥鍙e悗寰楀嚭鏈闀垮尮閰嶃?span lang="EN-US">gzip 鐢ㄧ殑鏄縐頒綔鈥?/span>鍝堝笇琛?span lang="EN-US">鈥?/span>鐨勬柟娉曟潵瀹炵幇杈冮珮鏁堢殑鎼滅儲銆?span lang="EN-US">鈥?/span>鍝堝笇錛?span lang="EN-US">hash錛?span lang="EN-US">鈥?/span>鏄垎鏁g殑鎰忔濓紝鎶婂緟鎼滅儲鐨勬暟鎹寜鐓у瓧鑺傚煎垎鏁e埌涓涓釜鈥?/span>妗?span lang="EN-US">鈥?/span>涓紝鎼滅儲鏃跺啀鏍規嵁瀛楄妭 鍊煎埌鐩稿簲鐨?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓幓瀵繪壘銆傜煭璇紡鍘嬬緝鐨勬渶鐭尮閰嶄負 3 涓瓧鑺傦紝gzip 浠?span lang="EN-US"> 3 涓瓧鑺傜殑鍊間綔涓哄搱甯岃〃鐨勭儲寮曪紝浣?span lang="EN-US"> 3 涓瓧鑺傚叡鏈?span lang="EN-US"> 2 鐨?span lang="EN-US"> 24 嬈℃柟縐嶅彇鍊鹼紝闇瑕?span lang="EN-US"> 16M 涓《錛屾《閲屽瓨鏀劇殑鏄獥鍙d腑鐨勪綅緗鹼紝紿楀彛鐨勫ぇ灝忎負 32K錛屾墍浠ユ瘡涓《鑷沖皯瑕佹湁澶т簬涓や釜瀛楄妭鐨勭┖闂達紝鍝堝笇琛ㄥ皢澶т簬 32M錛屼綔涓?span lang="EN-US"> 90 騫翠唬寮鍙戠殑紼嬪簭錛岃繖涓姹傛槸澶ぇ浜嗭紝鑰屼笖闅忕潃紿楀彛鐨勭Щ鍔紝鍝堝笇琛ㄩ噷鐨勬暟鎹細涓嶆柇榪囨椂錛岀淮鎶よ繖涔堝ぇ鐨勮〃錛屼細闄嶄綆紼嬪簭鐨勬晥鐜囷紝gzip 瀹氫箟鍝堝笇琛ㄤ負 2 鐨?span lang="EN-US"> 15 嬈℃柟錛?span lang="EN-US">32K錛変釜妗訛紝騫惰璁′簡涓涓搱甯屽嚱鏁版妸 16M 縐嶅彇鍊煎搴斿埌 32K 涓《涓紝涓嶅悓鐨勫艱瀵瑰簲鍒扮浉鍚岀殑妗朵腑鏄笉鍙伩鍏嶇殑錛屽搱甯屽嚱鏁扮殑浠誨姟鏄?span lang="EN-US">
1.浣垮悇縐嶅彇鍊煎敖鍙兘鍧囧寑鍦板垎甯冨埌鍚勪釜妗朵腑錛岄伩鍏嶈澶氫笉鍚岀殑鍊奸泦涓埌鏌愪簺妗朵腑錛岃屽彟涓浜涙槸絀烘《錛屼嬌鎼滅儲鐨勬晥鐜囬檷浣庛?/span>
2.鍑芥暟鐨勮綆楀敖鍙兘鍦扮畝鍗曪紝鍥犱負姣忔 鈥?/span>鎻掑叆鈥?/span>鍜?span lang="EN-US">鈥?/span>鎼滃鈥?/span>鍝堝笇琛ㄩ兘瑕佹墽琛屽搱甯屽嚱鏁幫紝鍝堝笇鍑芥暟鐨勫鏉傚害鐩存帴褰卞搷紼嬪簭鐨勬墽琛屾晥鐜囷紝瀹規槗鎯沖埌鐨勫搱甯屽嚱鏁版槸鍙?span lang="EN-US"> 3 涓瓧鑺傜殑宸﹁竟錛堟垨鍙寵竟錛?span lang="EN-US">15 浣嶄簩榪涘埗鍊鹼紝浣嗚繖鏍峰彧瑕佸乏杈癸紙鎴栧彸杈癸級2 涓瓧鑺傜浉鍚岋紝灝變細琚斁鍒板悓涓涓《涓紝鑰?span lang="EN-US"> 2 涓瓧鑺傜浉鍚岀殑姒傜巼鏄瘮杈冮珮鐨勶紝涓嶇鍚?span lang="EN-US">鈥?/span>騫沖潎鍒嗗竷鈥?/span>鐨勮姹傘?span lang="EN-US">
gzip 閲囩敤鐨勭畻娉曟槸錛?span lang="EN-US">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) 錛堣鏄庯細A 鎸?span lang="EN-US"> 3 涓瓧鑺備腑鐨勭 1 涓瓧鑺傦紝B 鎸囩 2 涓瓧鑺傦紝C 鎸囩 3 涓瓧鑺傦紝A(4,5) 鎸囩涓涓瓧鑺傜殑絎?span lang="EN-US"> 4,5 浣嶄簩榪涘埗鐮侊紝鈥淾鈥?/span>鏄簩榪涘埗浣嶇殑寮傛垨鎿嶄綔錛?span lang="EN-US">鈥?鈥?/span>鏄?span lang="EN-US">鈥?/span>榪炴帴鈥?/span>鑰屼笉鏄?span lang="EN-US">鈥?/span>鍔?span lang="EN-US">鈥?/span>錛?span lang="EN-US">鈥淾鈥?/span>浼樺厛浜?span lang="EN-US">鈥?鈥?/span>錛夎繖鏍蜂嬌 3 涓瓧鑺傞兘灝介噺鈥?/span>鍙備笌鈥?/span>鍒版渶鍚庣殑緇撴灉涓潵錛岃屼笖姣忎釜緇撴灉鍊?span lang="EN-US"> h 閮界瓑浜?span lang="EN-US"> ((鍓?span lang="EN-US">1涓?span lang="EN-US">h << 5)
^ c)鍙栧彸 15 浣嶏紝璁$畻涔熻繕綆鍗曘?span lang="EN-US">
鍝堝笇琛ㄧ殑鍏蜂綋瀹炵幇涔熷煎緱鎺㈣,鍥犱負鏃犳硶棰勫厛鐭ラ亾姣忎竴涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>浼氬瓨鏀懼灝戜釜鍏冪礌錛屾墍浠ユ渶綆鍗曠殑錛屼細鎯沖埌鐢ㄩ摼琛ㄦ潵瀹炵幇錛氬搱甯岃〃閲屽瓨鏀劇潃姣忎釜妗剁殑絎竴涓?鍏冪礌錛屾瘡涓厓绱犻櫎浜嗗瓨鏀劇潃鑷韓鐨勫鹼紝榪樺瓨鏀劇潃涓涓寚閽堬紝鎸囧悜鍚屼竴涓《涓殑涓嬩竴涓厓绱狅紝鍙互欏虹潃鎸囬拡閾炬潵閬嶅巻璇ユ《涓殑姣忎竴涓厓绱狅紝鎻掑叆鍏冪礌鏃訛紝鍏堢敤鍝堝笇鍑芥暟
綆楀嚭璇ユ斁鍒扮鍑犱釜妗朵腑錛屽啀鎶婂畠鎸傚埌鐩稿簲閾捐〃鐨勬渶鍚庛?/span>
榪欎釜鏂規鐨勭己鐐規槸棰戠箒鍦扮敵璇峰拰閲婃斁鍐呭瓨浼氶檷浣庤繍琛岄熷害錛涘唴瀛樻寚閽堢殑瀛樻斁鍗犳嵁浜嗛澶栫殑鍐呭瓨寮閿銆?/span>
鏈夋洿灝戝唴 瀛樺紑閿鍜屾洿蹇熺殑鏂規硶鏉ュ疄鐜板搱甯岃〃錛屽茍涓斾笉闇瑕侀綣佺殑鍐呭瓨鐢寵鍜岄噴鏀撅細gzip 鍦ㄥ唴瀛樹腑鐢寵浜嗕袱涓暟緇勶紝涓涓彨 head[]錛屼竴涓彨 pre[]錛屽ぇ灝忛兘涓?span lang="EN-US"> 32K錛屾牴鎹綋鍓嶄綅緗?span lang="EN-US"> strstart 寮濮嬬殑 3 涓瓧鑺傦紝鐢ㄥ搱甯屽嚱鏁拌綆楀嚭鍦?span lang="EN-US"> head[] 涓殑浣嶇疆 ins_h錛岀劧鍚庢妸 head[ins_h] 涓殑鍊艱鍏?span lang="EN-US"> pre[strstart]錛屽啀鎶婂綋鍓嶄綅緗?span lang="EN-US"> strstart 璁板叆 head[ins_h]銆?/span>
闅忕潃鍘嬬緝鐨勮繘琛岋紝head[]閲岃杞界潃鏈榪戠殑鍙兘鐨勫尮閰嶇殑浣嶇疆錛堝鏋滄湁鍖歸厤鐨勮瘽錛?span lang="EN-US">head[ins_h]涓嶄負 0錛夛紝pre[]涓殑鎵鏈変綅緗笌鍘熷鏁版嵁鐨勪綅緗浉瀵瑰簲錛屼絾姣忎竴涓綅緗繚瀛樼殑鍊兼槸鍓嶄竴涓渶榪戠殑鍙兘鐨勫尮閰嶇殑浣嶇疆銆?/span>
錛?span lang="EN-US">鈥?/span>鍙兘鐨勫尮閰?span lang="EN-US">鈥?/span>鏄寚鍝堝笇鍑芥暟璁$畻鍑虹殑
ins_h 鐩稿悓銆傦級欏虹潃 pre[] 涓殑鎸囩ず鎵句笅鍘伙紝鐩村埌閬囧埌
0錛屽彲浠ュ緱鍒版墍鏈夊尮閰嶅湪鍘熷鏁版嵁涓殑浣嶇疆錛?span lang="EN-US">0 琛ㄧず涓嶅啀鏈夋洿榪滅殑鍖歸厤銆?span lang="EN-US">
銆銆鎺ヤ笅鏉ュ緢鑷劧鍦拌瑙傚療 gzip 鍏蜂綋鏄浣曞垽鏂搱甯岃〃涓暟鎹殑榪囨椂錛屽浣曟竻鐞嗗搱甯岃〃鐨勶紝鍥犱負 pre[] 閲屽彧鑳藉瓨鏀?span lang="EN-US"> 32K 涓厓绱狅紝鎵浠ヨ繖欏瑰伐浣滄槸蹇呴』瑕佸仛鐨勩?span lang="EN-US">
銆 銆gzip 浠庡師濮嬫枃浠朵腑璇誨嚭涓や釜紿楀彛澶у皬鐨勫唴瀹癸紙鍏?span lang="EN-US"> 64K
瀛楄妭錛夊埌涓鍧楀唴瀛樹腑錛岃繖鍧楀唴瀛樹篃鏄竴涓暟緇勶紝縐頒綔 Window[]錛涚敵璇?span lang="EN-US"> head[]銆?span lang="EN-US">pre[] 騫舵竻闆訛紱strstart
緗負 0銆?/span>
鐒跺悗 gzip 杈規悳绱㈣竟鎻掑叆錛屾悳绱㈡椂閫氳繃璁$畻 ins_h錛屾鏌?span lang="EN-US"> head[] 涓槸鍚︽湁鍖歸厤錛屽鏋滄湁鍖歸厤錛屽垽鏂?span lang="EN-US"> strstart 鍑?span lang="EN-US"> head[] 涓殑浣嶇疆鏄惁澶т簬 1 涓獥鍙g殑澶у皬錛屽鏋滃ぇ浜?span lang="EN-US"> 1 涓獥鍙g殑澶у皬錛屽氨涓嶅埌 pre[] 涓幓鎼滅儲浜嗭紝鍥犱負 pre[] 涓繚瀛樼殑浣嶇疆鏇磋繙浜嗭紝濡傛灉涓嶅ぇ浜庯紝灝遍『鐫 pre[] 鐨勬寚紺哄埌 Window[] 涓愪釜鍖歸厤浣嶇疆寮濮嬶紝閫愪釜瀛楄妭涓庡綋鍓嶄綅緗殑鏁版嵁姣旇緝錛屼互鎵懼嚭鏈闀垮尮閰嶏紝pre[] 涓殑浣嶇疆涔熻鍒ゆ柇鏄惁瓚呭嚭涓涓獥鍙o紝濡傞亣鍒拌秴鍑轟竴涓獥鍙g殑浣嶇疆鎴栬?span lang="EN-US"> 0 灝變笉鍐嶆壘涓嬪幓錛屾壘涓嶅埌鍖歸厤灝辮緭鍑哄綋鍓嶄綅緗殑鍗曚釜瀛楄妭鍒板彟澶栫殑鍐呭瓨錛堣緭鍑烘柟娉曞湪鍚庢枃涓細浠嬬粛錛夛紝騫舵妸 strstart 鎻掑叆鍝堝笇琛紝strstart 閫掑錛屽鏋滄壘鍒頒簡鍖歸厤錛屽氨杈撳嚭鍖歸厤浣嶇疆鍜屽尮閰嶉暱搴﹁繖涓や釜鏁板瓧鍒板彟澶栫殑鍐呭瓨涓紝騫舵妸 strstart 寮濮嬬殑錛岀洿鍒?span lang="EN-US"> strstart + 鍖歸厤闀垮害 涓烘鐨勬墍鏈変綅緗兘鎻掑叆鍝堝笇琛紝strstart += 鍖歸厤闀垮害銆傛彃鍏ュ搱甯岃〃鐨勬柟娉曚負錛?span lang="EN-US">
pre[strstart % 32K] = head[ins_h];
head[ins_h] = strstart;
鍙?浠ョ湅鍑猴紝pre[] 鏄驚鐜埄鐢ㄧ殑錛屾墍鏈夌殑浣嶇疆閮藉湪涓涓獥鍙d互鍐咃紝浣嗘瘡涓涓綅緗繚瀛樼殑鍊間笉涓瀹氭槸涓涓獥鍙d互鍐呯殑銆?/span>
鍦ㄦ悳绱㈡椂錛?span lang="EN-US">head[] 鍜?span lang="EN-US"> pre[] 涓殑浣嶇疆鍊煎搴斿埌 pre[] 鏃朵篃瑕?span lang="EN-US"> % 32K銆傚綋
Window[] 涓殑鍘熷鏁版嵁灝嗚澶勭悊瀹屾瘯鏃訛紝瑕佹妸 Window[] 涓悗涓紿楃殑鏁版嵁澶嶅埗鍒板墠涓紿楋紝鍐嶈鍙?span lang="EN-US"> 32K 瀛楄妭鐨勬暟鎹埌鍚庝竴紿楋紝strstart -= 32K錛岄亶鍘?span lang="EN-US"> head[]錛屽煎皬浜庣瓑浜?span lang="EN-US"> 32K 鐨勶紝緗負 0錛屽ぇ浜?span lang="EN-US"> 32K 鐨勶紝-= 32K錛?span lang="EN-US">pre[] 鍚?span lang="EN-US"> head[] 涓鏍峰鐞嗐傜劧鍚庡悓鍓嶉潰涓鏍峰鐞嗘柊涓紿楃殑鏁版嵁銆?span lang="EN-US">
銆銆鍒嗘瀽錛氱幇鍦ㄥ彲浠?鐪嬪埌錛岃櫧鐒?span lang="EN-US"> 3 涓瓧鑺傛湁 16M 縐嶅彇鍊鹼紝浣嗗疄闄呬笂涓涓獥鍙e彧鏈?span lang="EN-US"> 32K 涓彇鍊奸渶瑕佹彃鍏ュ搱甯岃〃錛岀敱浜庣煭璇紡閲嶅鐨勫瓨鍦紝瀹為檯鍙湁 < 32K 縐嶅彇鍊兼彃鍏ュ搱甯岃〃鐨?span lang="EN-US"> 32K 涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓紝鑰屼笖鍝堝笇鍑芥暟鍙堢鍚?span lang="EN-US">鈥?/span>騫沖潎鍒嗗竷鈥?/span>鐨勮姹傦紝鎵浠ュ搱甯岃〃涓疄闄呭瓨鍦ㄧ殑鈥?/span>鍐茬獊鈥?/span>涓鑸笉浼氬錛屽鎼滅儲鏁堢巼鐨勫獎鍝嶄笉澶с傚彲浠ラ璁★紝鍦?span lang="EN-US">鈥?/span>涓鑸儏鍐?span lang="EN-US">鈥?/span>涓嬶紝姣?涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓瓨鏀劇殑鏁版嵁錛屾鏄垜浠鎵劇殑銆?/span>
鍝堝笇琛ㄥ湪鍚勭鎼滅儲綆楁硶涓紝瀹炵幇鐩稿鐨勬瘮杈冪畝鍗曪紝瀹規槗鐞嗚В錛?span lang="EN-US">鈥?/span>騫沖潎鎼滅儲閫熷害鈥?/span>鏈蹇紝鍝堝笇鍑芥暟鐨勮璁℃槸鎼滅儲閫熷害鐨勫叧 閿紝鍙絎﹀悎鈥?/span>騫沖潎鍒嗗竷鈥?/span>鍜?span lang="EN-US">鈥?/span>璁$畻綆鍗?span lang="EN-US">鈥?/span>錛屽氨甯稿父鑳芥垚涓鴻縐嶆悳绱㈢畻娉曚腑鐨勯閫夛紝鎵浠ュ搱甯岃〃鏄渶嫻佽鐨勪竴縐嶆悳绱㈢畻娉曘?/span>
浣嗗湪鏌愪簺鐗規畩鎯呭喌涓嬶紝瀹冧篃鏈夌己鐐癸紝姣? 濡傦細1.褰撻敭鐮?span lang="EN-US"> k 涓嶅瓨鍦ㄦ椂錛岃姹傛壘鍑哄皬浜?span lang="EN-US"> k 鐨勬渶澶ч敭鐮佹垨澶т簬 k 鐨勬渶灝忛敭鐮侊紝鍝堝笇琛ㄦ棤娉曟湁鏁堢巼鍦版弧瓚寵繖縐嶈姹傘?span lang="EN-US">2.鍝堝笇琛ㄧ殑鈥?/span>騫沖潎鎼滅儲閫熷害鈥?/span>鏄緩绔嬪湪姒傜巼璁虹殑鍩虹涓婄殑錛屽洜涓轟簨鍏堜笉鑳介鐭ュ緟鎼滅儲鐨勬暟鎹泦鍚堬紝鎴戜滑鍙兘鈥?/span>淇?璧?span lang="EN-US">鈥?/span>鎼滅儲閫熷害鐨?span lang="EN-US">鈥?/span>騫沖潎鍊?span lang="EN-US">鈥?/span>錛岃屼笉鑳?span lang="EN-US">鈥?/span>淇濊瘉鈥?/span>鎼滅儲閫熷害鐨?span lang="EN-US">鈥?/span>涓婇檺鈥?/span>銆傚湪鍚屼漢綾繪у懡鏀稿叧鐨勫簲鐢ㄤ腑錛堝鍖葷枟鎴栧畤鑸鍩燂級錛屽皢鏄笉鍚堥傜殑銆?/span>
榪欎簺鎯呭喌鍙婂叾浠栦竴浜涚壒孌婃儏
鍐典笅錛屾垜浠繀欏繪眰鍔╁叾浠?span lang="EN-US">鈥?/span>騫沖潎閫熷害鈥?/span>杈冧綆錛屼絾鑳芥弧瓚崇浉搴旂殑鐗規畩瑕佹眰鐨勭畻娉曘傦紙瑙併婅綆楁満紼嬪簭璁捐鑹烘湳銆嬬3鍗?鎺掑簭涓庢煡鎵撅級銆傚垢鑰?span lang="EN-US">鈥?/span>鍦ㄧ獥鍙d腑鎼滅儲鍖歸厤瀛楄妭涓?span lang="EN-US">鈥?/span>涓嶅睘浜庣壒孌婃儏鍐點?span lang="EN-US">
鏃墮棿涓庡帇緙╃巼鐨勫鉤琛★細
gzip 瀹氫箟浜嗗嚑縐嶅彲渚涢夋嫨鐨?span lang="EN-US"> level錛岃秺浣庣殑 level
鍘嬬緝鏃墮棿瓚婂揩浣嗗帇緙╃巼瓚婁綆錛岃秺楂樼殑 level 鍘嬬緝鏃墮棿瓚婃參浣嗗帇緙╃巼瓚婇珮銆?span lang="EN-US">
涓嶅悓鐨?span lang="EN-US"> level 瀵逛笅闈㈠洓涓彉閲忔湁涓嶅悓鐨勫彇鍊鹼細
nice_length
max_chain
max_lazy
good_length
nice_length錛?鍓嶉潰璇磋繃錛屾悳绱㈠尮閰嶆椂錛岄『鐫 pre[] 鐨勬寚紺哄埌 Window[] 涓愪釜鍖歸厤浣嶇疆寮濮嬶紝鎵懼嚭鏈闀垮尮閰嶏紝浣嗗湪榪欒繃紼嬩腑錛屽鏋滈亣鍒頒竴涓尮閰嶇殑闀垮害杈懼埌鎴栬秴榪?span lang="EN-US"> nice_length錛屽氨涓嶅啀璇曞浘瀵繪壘鏇撮暱鐨勫尮閰嶃傛渶浣庣殑 level 瀹氫箟 nice_length 涓?span lang="EN-US"> 8錛屾渶楂樼殑
level 瀹氫箟 nice_length 涓?span lang="EN-US"> 258錛堝嵆涓涓瓧鑺傝兘琛ㄧず鐨勬渶澶х煭璇尮閰嶉暱搴?span lang="EN-US"> 3 + 255錛夈?span lang="EN-US">
max_chain錛氳繖涓艱瀹氫簡欏虹潃 pre[] 鐨勬寚紺哄線鍓嶅洖婧殑鏈澶ф鏁般傛渶浣庣殑 level 瀹氫箟 max_chain 涓?span lang="EN-US"> 4錛屾渶楂樼殑 level 瀹氫箟
max_chain 涓?span lang="EN-US"> 4096銆傚綋 max_chain 鍜?span lang="EN-US"> nice_length 鏈夊啿紿佹椂錛屼互鍏堣揪鍒扮殑涓哄噯銆?/span>
|
聽聽聽
gzip
浣跨敤deflate綆楁硶榪涜鍘嬬緝銆倆lib錛屼互鍙婂浘褰㈡牸寮弍ng錛屼嬌鐢ㄧ殑鍘嬬緝綆楁硶涔熸槸deflate綆楁硶銆備粠gzip鐨勬簮鐮佷腑錛屾垜浠簡瑙e埌浜?
defalte綆楁硶鐨勫師鐞嗗拰瀹炵幇銆傛垜闃呰鐨刧zip鐗堟湰涓?
gzip-1.2.4銆備笅闈㈡垜浠皢瑕佸deflate綆楁硶鍋氫竴涓垎鏋愬拰璇存槑銆傞鍏堢畝鍗曚粙緇嶄竴涓嬪熀鏈師鐞嗭紝鐒跺悗璇︾粏鐨勪粙緇嶅疄鐜般?br />
f鍟妅錛屼笉甯︿綘浠繖鏍風殑鍟婏紝鏈夊ソ浜嬩笉鍙垜銆? |
The origins of zlib can be found in the history of Info-ZIP. Info-ZIP is loosely organized group of programmers who give the following reason for their existence:
Info-ZIP's purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc.
These free versions of Zip and UnZip are world class programs, and are in wide use on platforms ranging from the orphaned Amiga through MS-DOS PCs up to high powered RISC workstations. But these programs are designed to be used as command line utilities, not as library routines. People have found that porting the Info-ZIP source into an application could be a grueling exercise.
Fortunately for all of us, two of the Info-ZIP gurus took it upon themselves to solve this problem. Mark Adler and Jean-loup Gailly single-handedly created zlib, a set of library routines that provide a safe, free, and unpatented implementation of the deflate compression algorithm.
One of the driving reasons behind zlib's creation was for use as the compressor for PNG format graphics. After Unisys belatedly began asserting their patent rights to LZW compression, programmers all over the world were thrown into a panic over the prospect of paying royalties on their GIF decoding programs. The PNG standard was created to provide an unencumbered format for graphics interchange. The zlib version of the deflate algorithm was embraced by PNG developers, not only because it was free, but it also compressed better than the original LZW compressor used in GIF files.
zlib turns out to be good for more than graphics developers, however. The deflate algorithm makes an excellent general purpose compressor, and as such can be incorporated into all sorts of different software. For example, I use zlib as the compression engine in Greenleaf's ArchiveLib, a data compression library that work with ZIP archives. It's performance and compatibility mean I didn't have to reinvent the wheel, saving precious months of development time.
zlib's interface
As a library developer, I know that interfaces make or break a library. Performance issues are important, but if an awkward API makes it impossible to integrate a library into your program, you've got a problem.
zlib's interface is confined to just a few simple function calls. The entire state of a given compression or decompression session is encapsulated in a C structure of type z_stream, whose definition is shown in Figure 1.
typedef struct z_stream_s {
Bytef *next_in; /* next input byte */
uInt avail_in; /* number of bytes available at next_in */
uLong total_in; /* count of input bytes read so far */
Bytef *next_out; /* next output byte should be put there */
uInt avail_out; /* remaining free space at next_out */
uLong total_out; /* count of bytes output so far */
char *msg; /* last error message, NULL if no error */
struct internal_state *state; /* not visible by applications*/
alloc_func zalloc; /* used to allocate the internal state*/
free_func zfree; /* used to free the internal state */
voidpf opaque; /* private data passed to zalloc and zfree*/
int data_type; /* best guess about the data: ascii or binary*/
uLong adler; /* adler32 value of the uncompressed data */
uLong reserved; /* reserved for future use */
} z_stream;
Figure 1
The z_stream object definition
Using the library to compress or decompress a file or other data object consists of three main steps:
An overview of the process is shown in Figure 2.
Figure 2
The compression or decompression process
Steps 1 and 3 of the compression process are done using conventional
function calls. The zlib API, documented in header file zlib.h,
prototypes the following functions for initialization and termination of
the compression or decompression process:
Step 2 is done via repeated calls to either inflate() or deflate(), passing the z_stream object as a parameter. The entire state of the process is contained in that object, so there are no global flags or variables, which allows the library to be completely reentrant. Storing the state of the process in a single object also cuts down on the number of parameters that must be passed to the API functions.
When performing compression or decompression, zlib doesn't perform any I/O on its own. Instead, it reads data from an input buffer pointer that you supply in the z_stream object. You simply set up a pointer to the next block of input data in member next_in, and place the number of available bytes in the avail_in member. Likewise, zlib writes its output data to a memory buffer you set up in the next_out member. As it writes output bytes, zlib decrements the avail_out member until it drops to 0.
Given this interface, Step 2 of the compression process for an input file and an output file might look something like this:
z_stream z;
char input_buffer[ 1024 ];
char output_buffer[ 1024 ];
FILE *fin;
FILE *fout;
int status;
...
z.avail_in = 0;
z.next_out = output_buffer;
z.avail_out = 1024;
for ( ; ; ) {
if ( z.avail_in == 0 ) {
z.next_in = input_buffer;
z.avail_in = fread( input_buffer, 1, 1024, fin );
}
if ( z.avail_in == 0 )
break;
status = deflate( &z, Z_NO_FLUSH );
int count = 1024 - z.avail_out;
if ( count )
fwrite( output_buffer, 1, count, fout );
z.next_out = output_buffer;
z.avail_out = 1024;
}
Figure 3
The code to implement file compression
This method of handling I/O frees zlib from having to implement system dependent read and write code, and it insures that you can use the library to compress any sort of input stream, not just files. It's simply a matter of replacing the wrapper code shown above with a version customized for your data stream.
Wrapping it up
zlib's versatility is one of its strengths, but I don't always need all that flexibility. For example, to perform the simple file compression task Scott asked about at the start of this article, it would be nice to just be able to call a single function to compress a file, and another function to decompress. To make this possible, I created a wrapper class called zlibEngine.
zlibEngine provides a simple API that automates the compression and decompression of files and uses virtual functions to let you customize your user interface to zlib. The class definition is shown in its entirety in Figure 4. There are two different groups of members that are important to you in ZlibEngine. The first is the set of functions providing the calling interface to the engine. The second is the set of functions and data members used to create a user interface that is active during the compression process.
class ZlibEngine : public z_stream {
public :
ZlibEngine();
int compress( const char *input,
const char *output,
int level = 6 );
int decompress( const char *input,
const char *output );
void set_abort_flag( int i ){ m_AbortFlag = i; }
protected :
int percent();
int load_input();
int flush_output();
protected :
virtual void progress( int percent ){};
virtual void status( char *message ){};
protected :
int m_AbortFlag;
FILE *fin;
FILE *fout;
long length;
int err;
enum { input_length = 4096 };
unsigned char input_buffer[ input_length ];
enum { output_length = 4096 };
unsigned char output_buffer[ output_length ];
};
Figure 4
The ZlibEngine wrapper class
The Calling API
There are three C++ functions that implement the API needed to perform simple compression and decompression. Before using the engine, you must call the constructor, the first function. Since ZlibEngine is derived from the z_stream object used as the interface to zlib, the constructor is in effect also creating a z_stream object that will be used to communicate with zlib. In addition, the constructor initializes some of the z_stream member variables that will be used in either compression or decompression.
The two remaining functions are nice and simple: compress() compresses a file using the deflate algorithm. An optional level parameter sets a compression factor between 9 (maximum compression) and 0 (no compression.) decompress() decompresses a file, as you would expect. The compression level parameter isn't necessary when decompressing, due to the nature of the deflate algorithm. Both of these functions return an integer status code, defined in the zlib header file zlib.h. Z_OK is returned when everything works as expected. Note that I added an additional code, Z_USER_ABORT, used for an end user abort of the compression or decompression process.
The wrapper class makes it much easier to compress or decompress files using zlib. You only need to remember three things:
This means you can now perform compression with code this simple:
#include <zlibengn.h>
int foo()
{
ZlibEngine engine;
return engine.compress( "INPUT.DAT", "INPUT.DA_");
}
That's about as simple as you could ask for, isn't it?
The User Interface API
The calling API doesn't really make much of a case for creating the ZlibEngine class. Based on what you've seen so far, the compress() and decompress() functions don't really need to be members of a class. In theory, a global compress() function could just instantiate a z_stream object when called, without the caller even being aware of it.
The reason for creating this engine class is found in a completely different area: the user interface. It's really nice to be able to track the progress of your compression job while it's running. Conventional C libraries have to make do with callback functions or inflexible standardized routines in order to provide feedback, but C++ offers a better alternative through the use of virtual functions.
The ZlibEngine class has two virtual functions that are used to create a useful user interface: progress() is called periodically during the compression or decompression process, with a single integer argument that tells what percentage of the input file has been processed. status() is called with status messages during processing.
Both of these virtual functions have access to the ZlibEngine protected data element, m_AbortFlag. Setting this flag to a non-zero value will cause the compression or decompression routine to abort immediately. This easily takes care of another sticky user interface problem found when using library code.
Writing your own user interface then becomes a simple exercise. You simply derive a new class from ZlibEngine, and define your own versions of one or both of these virtual functions. Instantiate an object of your class instead of ZlibEngine, and your user interface can be as spiffy and responsive as you like!
Command line compression
I wrote a simple command line test program to demonstrate the use of class ZlibEngine. zlibtest.cpp does a simple compress/decompress cycle of the input file specified on the command line. I implement a progress function that simply prints out the current percent towards completion as the file is processed:
class MyZlibEngine : public ZlibEngine {
public :
void progress( int percent )
{
printf( "%3d%%\b\b\b\b", percent );
if ( kbhit() ) {
getch();
m_AbortFlag = 1;
}
}
};
Since class ZlibEngine is so simple, the derived class doesn't even have to implement a constructor or destructor. The derived version of progress() is able to provide user feedback as well as an abort function with just a few lines of code. zlibtest.cpp is shown in its entirety in Listing 1.
The OCX
To provide a slightly more complicated test of class ZlibEngine, I created a 32 bit OCX using Visual C++ 4.1. The interface to an OCX is defined in terms of methods, events, and properties. ZlibTool.ocx has the following interface:
|
Properties: |
InputFile |
|
|
OutputFile |
|
|
Level |
|
|
Status |
|
|
|
|
Methods: |
Compress() |
|
|
Decompress() |
|
|
Abort() |
|
|
|
|
Events: |
Progress() |
(Note that I chose to pass status information from the OCX using a property, not an event.)
ZlibTool.ocx is a control derived from a standard Win32 progress bar. The progress care gets updated automatically while compressing or decompressing, so you get some user interface functionality for free. Using it with Visual Basic 4.0 or Delphi 2.0 becomes a real breeze. After registering the OCX, you can drop a copy of it onto your form and use it with a minimal amount of coding.
Both the source code for the OCX and a sample Delphi 2.0 program are available on the DDJ listing service. A screen shot of the Delphi program in action is shown in Figure 5.
Figure 5
The Delphi 2.0 OCX test program
Reference material
The source code that accompanies this article can be downloaded from this Web page. It contains the following source code collections:
Each of the subdirectories contains a README.TXT file with documentation describing how to build and use the programs.
The source is split into two archives:
|
|
All source code and the OCX file. |
|
|
The supporting MFC and VC++ DLLs. Many people will already have these files on their systems: MFC40.DLL, MSVCRT40.DLL, and OLEPRO32.DLL. |
I haven't discussed the zlib code itself in this article. The best place to start gathering information about how to use zlib and the Info-ZIP products can be found on their home pages. Both pages have links to the most current versions of their source code as well:
|
Info-ZIP |
|
|
zlib |
|
Once you download the Info-ZIP code, the quick start documentation is found in source file zlib.h. If you cook up any useful code that uses zlib, you might want to forward copies to Greg Roelofs for inclusion on the zlib home page. Greg maintains the zlib pages, and you can reach him via links found there.
Feel-good plug
zlib can do a lot more than just compress files. Its versatile interface can be used for streaming I/O, in-memory compression, and more. Since Jean-loup Gailly and Mark Adler were good enough to make this capable tool available to the public, it only makes sense that we take advantage of it. I know I have, and I encourage you to do the same.