Ⅰ Python算法之哈夫曼编码
问题: 哈夫曼编码,英文名称 Huffman Coding,有时也翻译为霍夫曼编码,在1952年提出的,是最好的编码方式。哈夫曼编码在电子通讯方面有着重要的应用,同时也广泛应用于数据压缩坦槐,其压缩率通常在20% 90%之间 赫夫曼码是可变字长编码(VLC)的一种。哈夫曼树是最优二叉树, 带权路径长度最小的二叉树。
原理:
假设有几个数字40,10,20,16,14。
首先将这五个数字按照从小到大的顺序排列:10, 14,16,20, 40。
构建哈夫曼树:
1.首先选取10,14
2.重新排序:16,20,24,40
3.重新排序24,36,40,60
4.按照二叉羡信冲树左0右1,构建哈兄歼夫曼树
所以最终得到数字10的编码为100,数字14的编码为101,数字16的编码为110,数字20的编码为111,数字40的编码为0。
代码:
运行结果:
Ⅱ 甯哥敤镄勬暟鎹铡嬬缉绠楁硶链夊摢浜涳纻
鍦ㄦ暟瀛楀寲镞朵唬锛屾暟鎹镄勫瓨鍌ㄥ拰浼犺緭鏁堢巼鏄惧缑灏や负閲嶈併备负浜嗗噺灏忓瓨鍌ㄧ┖闂村拰甯﹀介渶姹傦纴钖勭嶆暟鎹铡嬬缉绠楁硶濡傞洦钖庢槬绗嬭埇娑岀幇銆傝繖浜涚畻娉曚緷鎹涓嶅悓镄勫师鐞嗗拰阃傜敤鍦烘櫙锛屽垎涓哄彲阃嗗拰闱炲彲阃嗕袱绉岖被鍨嬶纴镞ㄥ湪鍦ㄤ缭璇佹暟鎹瀹屾暣镐х殑鍓嶆彁涓嬶纴灏藉彲鑳藉湴铡嬬缉鏁版嵁浣撶Н銆傝╂垜浠娣卞叆鎺㈣ㄤ竴涓嬭繖浜涘父鐢ㄧ殑鏁版嵁铡嬬缉绠楁硶銆
棣栧厛锛屽彲阃嗗帇缂╃畻娉曪纴濡侣uffman缂栫爜锛屼互鍏舵棤鎹熺壒镐ц屽弹鍒伴潚镌愩傚畠阃氲繃瀵规暟鎹镄勯戠巼鍒嗘瀽锛屼负姣忎釜瀛楃﹀垎閰嶆渶鐭镄勭紪镰侊纴浠庤屽疄鐜伴珮鏁堢殑铡嬬缉銆傝繖绉岖紪镰佹柟寮忕‘淇濅简瑙e帇钖庣殑鏁版嵁涓庡师濮嬫暟鎹涓镊达纴阃傜敤浜庡规暟鎹鍑嗙‘镐ц佹眰鏋侀珮镄勫満鏅銆
鎺ョ潃锛岄潪鍙阃嗗帇缂╃畻娉曞侸PEG锛屼互鐗虹壊涓瀹氱殑鏁版嵁绮剧‘搴︽崲鍙栨洿楂樼殑铡嬬缉姣斻傝繖绫荤畻娉曞湪锲惧儚澶勭悊鍜岃嗛戝帇缂╀腑骞挎硾搴旂敤锛屽挨鍏舵槸鍦ㄥ硅呜夎川閲忚佹眰鐩稿硅缉浣庣殑𨱍呭喌涓嬶纴鑳芥樉镢楀噺灏忔暟鎹閲忋
鏁版嵁铡嬬缉镄勭瓥鐣ュ氱嶅氭牱锛屽寘𨰾锘轰簬鍐呭圭殑缂栫爜锛埚傚瓧绗︿覆涓棰戠箒瀛楃︾殑棰戠巼缂栫爜锛夈佽〃绀烘柟娉曪纸濡傞湇澶镟肩紪镰佸规椂搴忔暟鎹镄勯珮鏁埚勭悊锛変互鍙婂规暟鎹娴佽勫緥镐х殑鍒╃敤锛埚傛父绋嬬紪镰佸拰RLE锛岀敤浜庤繛缁閲嶅嶆暟鎹镄勫帇缂╋级銆备緥濡傦纴"this is a example"阃氲繃棰戠巼缂栫爜鑳藉噺灏忓埌54姣旂壒锛屾瘆铡熷136姣旂壒鑺傜渷绾2.5鍊岖殑瀛桦偍绌洪棿銆
Delta鍜娈elta-of-Delta缂栫爜鍒椤湪澶勭悊鏂囦欢铡嗗彶璁板綍鍜屽崟璋冨簭鍒楁椂琛ㄧ幇鍑鸿壊锛岄厤钖圧LE绛夋妧链锛岃兘鏄捐宪闄崭绠鏁版嵁澶у皬銆侱elta阃氲繃阃愪釜鍏幂礌镄勫樊寮傛潵铡嬬缉鏁版嵁锛岃屼簩阒跺樊鍒嗙紪镰佸垯杩涗竴姝ュ垎鏋愬墠钖庝袱涓鍏幂礌镄勫樊寮傦纴涓よ呭湪鐗瑰畾鍦烘櫙涓嬮兘鑳芥彁渚涢珮鏁埚帇缂┿
Zig-zag缂栫爜鐗瑰埆阍埚硅礋鏁帮纴涓嶥elta缁揿悎鑳芥湁鏁埚勭悊灏忔暟锛屽疄鐜伴珮鏁埚瓨鍌ㄣ侴oogle寮婧愮殑Snappy浠ュ叾蹇阃熺殑铡嬬缉阃熷害鍜屽悎鐞嗙殑铡嬬缉鏁堟灉锛屽箍娉涘簲鐢ㄤ簬寮婧愰”鐩锛岃孡Z4鍒欎互鍏跺瓧鑺傜骇镄勫揩阃熻В铡嬫ц兘锛岀壒鍒阃傚悎瀹炴椂鏁版嵁浼犺緭銆
Simple8b绠楁硶绠鍗曢珮鏁堬纴涓扑负灏忔暣鏁拌捐★纴浣嗗帇缂╃巼鍙鑳借缉浣庛侺ZO鍒欎互蹇阃熷帇缂╄侀暱锛屼絾瑙e帇阃熷害鐣ラ娄簬LZ4锛屾洿阃傚悎澶勭悊澶у潡鏁版嵁銆侱EFLATE绠楁硶鏄疴ip鏂囦欢镄勯粯璁ゅ帇缂╂柟寮忥纴瀹幂粨钖堜简LZ77鍜孒uffman缂栫爜锛屾彁渚涗简涓绉嶅钩琛$殑铡嬬缉绛栫暐銆
杩戝勾𨱒ワ纴Zstandard浠ュ叾楂樻晥镄勫帇缂╁拰蹇阃熺殑瑙e帇鑳藉姏宕闇插ご瑙掞纴涓烘湭𨱒ユ暟鎹铡嬬缉鎶链镄勫彂灞曟弿缁树简骞块様鍓嶆櫙銆傝孊it-packing鍒欓氲繃铡婚櫎涓嶅繀瑕佺殑浣嶏纴杩涗竴姝ヨ妭鐪佸瓨鍌ㄧ┖闂达纴浣嗗彲鑳藉奖鍝嶆暟鎹镄勮诲彇阃熷害銆
TDengine鏁版嵁搴挞噰鐢ㄤ简涓阒舵靛帇缂╋纸鍖呮嫭Delta銆丼imple8b銆亃ig-zag鍜孡Z4锛夊拰浜岄桩娈甸氱敤铡嬬缉绛栫暐锛屼互阃傚簲涓嶅悓鍦烘櫙镄勯渶姹伞傞夋嫨铡嬬缉绠楁硶镞讹纴闇瑕佺患钖堣冭槛铡嬬缉鏁堢巼銆佽В铡嬮熷害浠ュ强鏁版嵁镄勫师濮嬬簿搴︼纴浠ユ垒鍒版渶阃傚悎镄勮В鍐虫柟妗堛
鍦ㄦ暟瀛楀寲涓栫晫涓锛屾暟鎹铡嬬缉绠楁硶鏄鎻愬崌瀛桦偍鍜屼紶杈撴晥鐜囩殑鍏抽敭宸ュ叿銆傛疮涓绉岖畻娉曢兘链夊叾镫鐗圭殑浼桦娍鍜岄傜敤锣冨洿锛屼简瑙e苟𨱔垫椿杩愮敤杩欎簺宸ュ叿锛岃兘甯锷╂垜浠镟村ソ鍦扮$悊鏁版嵁锛岄檷浣庡瓨鍌ㄦ垚链锛屾彁楂樻暟鎹澶勭悊阃熷害銆
Ⅲ 利用哈夫曼编码进行压缩压缩率一般达到多少
哈夫曼编码进行压缩的压缩率是根据平均码长来计算的,压缩率比较低。
例如:用三位二进行数进行的等长编码平均长度为3,而根据哈夫曼树编码的平均码长为:
4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61
2.61/3=0.87=87%
其平均码长是等长码的87%,所以平均压缩率为13%。
哈夫曼编码,又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。
压缩率,描述压缩文件的效果名,是文件压缩后的大小与压缩前的大小之比,例如:把100m的文件压缩后是90m,压缩率为90/100*100%=90%,压缩率一般是越小越好,但是压得越小,解压时间越长。
(3)霍夫曼编码压缩算法扩展阅读
哈夫曼编码的具体方法:先按出现的概率大小排队,把两个最小的概率相加,作为新的概率 和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。
每次相 加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”, 将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的哈夫曼编码。