中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網(wǎng)站建設(shè)彩票網(wǎng)谷歌搜索引擎免費入口

網(wǎng)站建設(shè)彩票網(wǎng),谷歌搜索引擎免費入口,廣州制作網(wǎng)站哪家專業(yè),企業(yè)銷售網(wǎng)站建設(shè)一、個人理解在遠程通訊中,需要把字符轉(zhuǎn)成二進制的字符串進行傳輸,例如我們需要傳輸ABCD,我們可以用定長的字符串進行表示,例如:A:00B:01C:02D:03這樣可能就造成空間的浪費,我們多存儲了一個0號位。那用變長呢&#xf…

一、個人理解

在遠程通訊中,需要把字符轉(zhuǎn)成二進制的字符串進行傳輸,例如我們需要傳輸ABCD,我們可以用定長的字符串進行表示,例如:

  1. A:00

  1. B:01

  1. C:02

  1. D:03

這樣可能就造成空間的浪費,我們多存儲了一個0號位。那用變長呢,會怎么樣,我們試試,例如:

  1. A:0

  1. B:00

  1. C:01

  1. D:1

如果接收到的二進制字符串為:0000101,在解碼時是否就會出現(xiàn)歧義,可以是AAAADAD,也可以是ABCC,也可以是BBDC等等。

從而引入了哈夫曼編碼,也稱為最優(yōu)前綴碼。之前我們已經(jīng)實現(xiàn)了哈夫曼樹,可以參考文章鏈接《數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)-學(xué)習(xí)-17-二叉樹之哈夫曼樹》,從哈夫曼樹這個中間結(jié)果,轉(zhuǎn)換出我們想要的哈夫曼編碼。

二、為什么哈夫曼編碼得出二進制字符串最短呢?

  1. 在生成哈夫曼樹之前,我們需要統(tǒng)計字符在數(shù)據(jù)中出現(xiàn)的概率,出現(xiàn)的概率越高,編碼會越短。

  1. 之前介紹過的哈夫曼樹的特點,權(quán)值越大的結(jié)點離根結(jié)點越近,也就是路徑越短。

  1. 哈夫曼樹規(guī)定走左子樹就標記為0,走右子樹就標記為1,從根結(jié)點到各個葉子節(jié)點的標記拼接起來,就是這個字符的哈夫曼編碼。

三、結(jié)構(gòu)體定義

typedef char** HaffmanCode;

四、函數(shù)實現(xiàn)

1、生成哈夫曼編碼

(1)定義
Status CreateHaffmanCode(HaffmanTree HT, HaffmanCode* HC, HaffmanTreeLentype ArrayLen)
{JudgeAllNullPointer(HT);//Init HaffmanCode*HC          = (HaffmanCode)MyMalloc(sizeof(char*) * ArrayLen);char* TmpHC = (char*)MyMalloc(sizeof(char) * (ArrayLen - 1));//臨時數(shù)組存放哈夫曼編碼中間結(jié)果,長度n,編碼最長需要n-1,所以分配n-1。HaffmanTreeLentype TmpHCLen = 0;HaffmanTreeLentype i,j;HaffmanTreeLentype TmpParentIndex;//上一個結(jié)點的父親索引。HaffmanTreeLentype TmpIndex;//上一個結(jié)點的索引號。for(i = 1; i <= ArrayLen; i++){TmpParentIndex = HT[i].ParentIndex;TmpIndex       = i;while(HT[TmpParentIndex].ParentIndex != 0){if(HT[TmpParentIndex].LeftChildIndex == TmpIndex){TmpHC[TmpHCLen] = '0';TmpHCLen++;}else if (HT[TmpParentIndex].RightChildIndex == TmpIndex){TmpHC[TmpHCLen] = '1';TmpHCLen++;}else{Log("Internal Error : Perant LeftChildIndex and RightChildIndex != TmpIndex",Error);}TmpIndex       = TmpParentIndex;TmpParentIndex = HT[TmpParentIndex].ParentIndex;}//根節(jié)點判斷if(HT[TmpParentIndex].LeftChildIndex == TmpIndex){TmpHC[TmpHCLen] = '0';TmpHCLen++;}else if(HT[TmpParentIndex].RightChildIndex == TmpIndex){TmpHC[TmpHCLen] = '1';TmpHCLen++;}else{Log("Internal Error : Root Node Perant LeftChildIndex and RightChildIndex != TmpIndex",Error);}//將TmpHC中的字符倒序?qū)懭際C中。(*HC)[i-1] = (char*)MyMalloc(sizeof(char) * (TmpHCLen + 1));//編碼最長需要n,加上\0,所以分配n+1。for(j = TmpHCLen - 1; j >= 0; j--){(*HC)[i-1][TmpHCLen - 1 - j] = TmpHC[j];if(j == 0)//因為j是無符號長整型,j不能等于負數(shù),當j=-1,退出循環(huán),導(dǎo)致程序core掉,由此添加此判斷,避免問題的發(fā)生。{break;}}(*HC)[i-1][TmpHCLen] = '\0';TmpHCLen             = 0;}free(TmpHC);TmpHC = NULL;Log("Create HaffmanCode     : OK\n",Info);return SuccessFlag;
}

(2)參數(shù)

參數(shù)名

說明

HT

傳入?yún)?shù)類型為HaffmanTree 的哈夫曼樹。

HC

傳入?yún)?shù)類型為HaffmanCode*的哈夫曼編碼數(shù)組指針。

ArrayLen

傳入?yún)?shù)類型為HaffmanTreeLentype的權(quán)值數(shù)組長度。

(3)實現(xiàn)思路

A,B,C,D,E對應(yīng)的權(quán)值如下:

HaffmanTreeLentype WeightArray[]  = {2,4,2,3,3};

生成哈夫曼樹如下:

2023-3--[Info]--HaffmanTree            :
[ Index | Weight | ParentIndex | LeftChildIndex | RightChildIndex ]
[ 0     | 0      | 0           | 0              | 0               ]
[ 1     | 2      | 6           | 0              | 0               ]
[ 2     | 4      | 8           | 0              | 0               ]
[ 3     | 2      | 6           | 0              | 0               ]
[ 4     | 3      | 7           | 0              | 0               ]
[ 5     | 3      | 7           | 0              | 0               ]
[ 6     | 4      | 8           | 1              | 3               ]
[ 7     | 6      | 9           | 4              | 5               ]
[ 8     | 8      | 9           | 6              | 2               ]
[ 9     | 14     | 0           | 7              | 8               ]

圖示如下:

從根節(jié)點開始遍歷到每個葉子結(jié)點算出哈夫曼編碼比較困難,我們反其道而行之,從葉子結(jié)點開始遍歷到根節(jié)點,但我們算出的結(jié)果是一個倒序的,我們需要一個臨時數(shù)組來存儲倒序編碼,最后再正序填寫回哈夫曼編碼數(shù)組中即可。

例如我們來算一個A,父親是權(quán)值4,走左子樹為0,0寫入臨時數(shù)組,

char TmpHC[] = {'0'}; 

再往上走,父親是權(quán)值8,走左子樹為0,0寫入臨時數(shù)組,

char TmpHC[] = {'0','0'}; 

再往上走,父親是權(quán)值14,走右子樹為1,1寫入臨時數(shù)組,

char TmpHC[] = {'0','0','1'}; 

倒序?qū)懟毓蚵幋a數(shù)組就是100。其他的大家自己可以算一下,是不是這樣,至于和老師講的可能有不一樣的地方,例如最后形成的編碼,只是由于數(shù)組中選出兩個最小的值,哪個是左子樹索引,哪個是右子樹索引,不一樣導(dǎo)致,但不影響編碼。最終得出的哈夫曼編碼如下:

2023-3--[Info]--HaffmanCode            :
[ Index | Code    ]
[ 1     | 100     ]
[ 2     | 11      ]
[ 3     | 101     ]
[ 4     | 00      ]
[ 5     | 01      ]

2、銷毀哈夫曼編碼

(1)定義
Status DestoryHaffmanCode(HaffmanCode HC,HaffmanTreeLentype ArrayLen)
{JudgeAllNullPointer(HC);HaffmanTreeLentype i;for(i = 0; i < ArrayLen; i++){free(HC[i]);HC[i] = NULL;}free(HC);HC = NULL;Log("Destory HaffmanCode    : OK\n",Info);return SuccessFlag;
}

(2)參數(shù)

參數(shù)名

說明

HC

傳入?yún)?shù)類型為HaffmanCode*的哈夫曼編碼數(shù)組指針。

ArrayLen

傳入?yún)?shù)類型為HaffmanTreeLentype的權(quán)值數(shù)組長度。

四、虛機測試

[gbase@czg2 Tree]$ make
gcc -Wall -g ../Log/Log.c BinaryTree.c HaffmanTree.c main.c -o TestBinaryTree -I ../Log/
[gbase@czg2 Tree]$ ./TestBinaryTree 
2023-3--[Info]--Init Global Array      : OK
2023-3--[Info]--Init Binary Tree       : OK
2023-3--[Info]--New Binary Search Tree : OK
2023-3--[Info]--PreOrderTraverse       : [6 ,3 ,2 ,1 ,5 ,8 ,7 ], CurSize : 7
2023-3--[Info]--InOrderTraverse        : [1 ,2 ,3 ,5 ,6 ,7 ,8 ], CurSize : 7
2023-3--[Info]--PostOrderTraverse      : [1 ,2 ,5 ,3 ,7 ,8 ,6 ], CurSize : 7
2023-3--[Info]--PreOrderTraverseNoRcs  : [6 ,3 ,2 ,1 ,5 ,8 ,7 ], CurSize : 7
2023-3--[Info]--InOrderTraverseNoRcs   : [1 ,2 ,3 ,5 ,6 ,7 ,8 ], CurSize : 7
2023-3--[Info]--PostOrderTraverseNoRcs : [1 ,2 ,5 ,3 ,7 ,8 ,6 ], CurSize : 7
2023-3--[Info]--LevelOrderBinaryTree   : [6 ,3 ,8 ,2 ,5 ,7 ,1 ], CurSize : 7
2023-3--[Info]--SqQueue Data           :
Data           : [1 ,2 ,3 ,0 ,0 ,4 ,5 ,0 ,6 ,0 ,0 ,7 ,0 ,0 ,0 ]
FrontIndex     : 0
RearIndex      : 15
SqQueueLen     : 15
2023-3--[Info]--Init Binary Tree       : OK
2023-3--[Info]--PreOrderTraverse       : [1 ,2 ,3 ,4 ,5 ,6 ,7 ], CurSize : 7
2023-3--[Info]--InOrderTraverse        : [3 ,2 ,5 ,6 ,4 ,7 ,1 ], CurSize : 7
2023-3--[Info]--PostOrderTraverse      : [3 ,6 ,5 ,7 ,4 ,2 ,1 ], CurSize : 7
2023-3--[Info]--PreOrderTraverseNoRcs  : [1 ,2 ,3 ,4 ,5 ,6 ,7 ], CurSize : 7
2023-3--[Info]--InOrderTraverseNoRcs   : [3 ,2 ,5 ,6 ,4 ,7 ,1 ], CurSize : 7
2023-3--[Info]--PostOrderTraverseNoRcs : [3 ,6 ,5 ,7 ,4 ,2 ,1 ], CurSize : 7
2023-3--[Info]--LevelOrderBinaryTree   : [1 ,2 ,3 ,4 ,5 ,7 ,6 ], CurSize : 7
2023-3--[Info]--Init Binary Tree       : OK
2023-3--[Info]--Copy Tree              : OK
2023-3--[Info]--PreOrderTraverse       : [1 ,2 ,3 ,4 ,5 ,6 ,7 ], CurSize : 7
2023-3--[Info]--InOrderTraverse        : [3 ,2 ,5 ,6 ,4 ,7 ,1 ], CurSize : 7
2023-3--[Info]--PostOrderTraverse      : [3 ,6 ,5 ,7 ,4 ,2 ,1 ], CurSize : 7
2023-3--[Info]--Tree Depth             : 4
2023-3--[Info]--Tree Depth             : 5
2023-3--[Info]--Tree Depth             : 5
2023-3--[Info]--Tree Node Num          : 7
2023-3--[Info]--Tree Node Num          : 7
2023-3--[Info]--Tree Node Num          : 7
2023-3--[Info]--Tree Leaves Node Num   : 3
2023-3--[Info]--Tree Leaves Node Num   : 3
2023-3--[Info]--Tree Leaves Node Num   : 3
2023-3--[Info]--Create HaffmanTree     : OK
2023-3--[Info]--HaffmanTree            :
[ Index | Weight | ParentIndex | LeftChildIndex | RightChildIndex ]
[ 0     | 0      | 0           | 0              | 0               ]
[ 1     | 2      | 6           | 0              | 0               ]
[ 2     | 4      | 8           | 0              | 0               ]
[ 3     | 2      | 6           | 0              | 0               ]
[ 4     | 3      | 7           | 0              | 0               ]
[ 5     | 3      | 7           | 0              | 0               ]
[ 6     | 4      | 8           | 1              | 3               ]
[ 7     | 6      | 9           | 4              | 5               ]
[ 8     | 8      | 9           | 6              | 2               ]
[ 9     | 14     | 0           | 7              | 8               ]
2023-3--[Info]--Create HaffmanCode     : OK
2023-3--[Info]--HaffmanCode            :
[ Index | Code    ]
[ 1     | 100     ]
[ 2     | 11      ]
[ 3     | 101     ]
[ 4     | 00      ]
[ 5     | 01      ]
2023-3--[Info]--Destory HaffmanCode    : OK
2023-3--[Info]--Destory HaffmanTree    : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
2023-3--[Info]--Destroy BT Node        : OK
http://www.risenshineclean.com/news/36314.html

相關(guān)文章:

  • 國際交友網(wǎng)站怎么建設(shè)外貿(mào)營銷網(wǎng)站建設(shè)
  • 網(wǎng)站建設(shè)的背景有哪些網(wǎng)站首頁布局設(shè)計模板
  • php網(wǎng)站qq互聯(lián)營銷網(wǎng)站建設(shè)教學(xué)
  • 現(xiàn)在主流web開發(fā)工具福州百度推廣優(yōu)化排名
  • wordpress 摘要標簽seo人員工作內(nèi)容
  • 全網(wǎng)營銷型網(wǎng)站建設(shè)公司濰坊住房公積金
  • java做的網(wǎng)站怎么打開網(wǎng)頁新手怎么引流推廣推廣引流
  • 阿壩州網(wǎng)站制作杭州seo聯(lián)盟
  • 做圖書網(wǎng)站的代碼企業(yè)管理培訓(xùn)課程視頻
  • 做網(wǎng)站前需要準備什么條件深圳網(wǎng)
  • 上海網(wǎng)站建設(shè)價格表加強服務(wù)保障滿足群眾急需m
  • 哪個網(wǎng)站兼職做圖好優(yōu)化營商環(huán)境建議
  • 網(wǎng)站備案人什么意思百度端口開戶推廣
  • @安徽網(wǎng)站建設(shè)武漢網(wǎng)絡(luò)優(yōu)化知名樂云seo
  • 注冊網(wǎng)站后如何注銷賬號網(wǎng)絡(luò)seo首頁
  • 閑魚網(wǎng)站如何賺錢上海十大營銷策劃公司
  • 網(wǎng)件路由器設(shè)置seo北京公司
  • 湖北做網(wǎng)站平臺哪家好百度 營銷怎么收費
  • 百度公司做網(wǎng)站可靠嗎網(wǎng)頁設(shè)計培訓(xùn)
  • 網(wǎng)站開發(fā)的技術(shù)指標企業(yè)網(wǎng)站建設(shè)規(guī)劃
  • 新鄭龍湖網(wǎng)站建設(shè)網(wǎng)絡(luò)營銷方法有哪些
  • wp網(wǎng)站如何做多級聯(lián)動篩選框搜索關(guān)鍵詞排名一般按照什么收費
  • 網(wǎng)站建設(shè)論文 網(wǎng)站建設(shè)論文單頁網(wǎng)站排名優(yōu)化
  • 軟件項目管理名詞解釋seo矩陣培訓(xùn)
  • vs網(wǎng)站開發(fā)效果圖手機免費建網(wǎng)站
  • 北京微網(wǎng)站建設(shè)設(shè)計服務(wù)公司東莞網(wǎng)絡(luò)公司網(wǎng)絡(luò)推廣
  • 建設(shè)銀行網(wǎng)站首頁口關(guān)鍵詞優(yōu)化方法有什么步驟
  • 網(wǎng)站建設(shè)需要會什么軟件有哪些內(nèi)容seo網(wǎng)站推廣工作內(nèi)容
  • 免費h5網(wǎng)站模版谷歌seo服務(wù)
  • 瑞安做網(wǎng)站百度云盤官網(wǎng)登錄入口