哈夫曼樹的創建

????????要了解哈夫曼樹,可以先了解一下哈夫曼編碼,假設我們有幾個字母,他們的出現頻率是A: 1?B: 2?C: 3?D: 4?E: 5?F: 6 G: 7。那么如果想要壓縮數據的同時讓訪問更加快捷,就要讓頻率高的字母離根節點比較進,容易訪問,頻率低的離根節點遠。

所以,構建哈夫曼樹的步驟,是一直找最小頻率的兩個節點,組成一個樹,拿上面的例子:

A B的頻率最低,所以第一步先把AB當作左右孩子構建樹,現在AB相當于一個節點,權值為3。

再次比較,最小的權值是3,3(一個是AB節點的根,一個是C節點)接著構成樹。

現在最小的是權值為4,5節點,相當于4,5節點構成樹,但此時上面的樹仍然存在。

這里直接放最后樹的結果了:

現在梳理一下步驟:

1.先找到最小的兩個點,構建他們的根節點。
2.把這兩個點從節點中去除,把他們的根節點加入進來。
3.循環這個過程直到只有一個節點。

????????首先我們要寫一個尋找權值最小并且構建根節點的函數,這里我們用一個數組用來存放普通的樹節點,根據數學推導,(會增加 n-1 個節點,因為最開始是2個節點增加一個)哈夫曼樹最后是 2n-1 個節點,這里先創建n個節點,后面可以realloc擴容。

????????哈夫曼樹的創建先創建 n?的節點的空間,給 n 個節點賦值,也就是初始值。這里的parent是告訴所有節點都在可比較的范圍內,如果parent為1,那么說明節點已經參與構建樹,也就是再尋找最小值時跳過。

typedef struct HuffmanTree {TreeNode* array;int length;
}HuffmanTree;HuffmanTree* HuffmanTreeInit(int length,int* data,HuffmanTree* H) {H = (HuffmanTree*)malloc(sizeof(HuffmanTree));H->array = (TreeNode*)malloc(sizeof(TreeNode) * length);H->length = length;for (int i = 0; i < length; i++) {H->array[i].val = data[i];H->array[i].lchild = NULL;H->array[i].rchild = NULL;H->array[i].parent = 0;}return H;
}

????????接著是尋找最小的兩個值的節點,index數組存放的是兩個節點的序號,最后返回,前后兩個for循環一樣,只不過要注意第二個for循環 && j!=index[0] ,為了找到第二個最小值,不和第一個重復。

int* FindTwoMin(HuffmanTree* H) {int* index = (int*)malloc(sizeof(int) * 2);int min1 = 1000;int min2 = 1000;for (int i = 0; i < H->length; i++) {if (H->array[i].parent == 0) {if (H->array[i].val < min1) {min1 = H->array[i].val;index[0] = i;}}}for (int j = 0; j < H->length; j++) {if (H->array[j].parent == 0) {if (H->array[j].val < min2 && j!=index[0]) {min2 = H->array[j].val;index[1] = j;}}}return index;
}

最后就是構建哈夫曼樹:

void CreatHuffmanTree(HuffmanTree* H) {int i = H->length,count=H->length;while( i < count * 2 - 1) {先找到最小的兩個節點的序號int* index = FindTwoMin(H);創建最小兩個節點的根H->array = (TreeNode*)realloc(H->array,sizeof(TreeNode) * (i + 1));H->array[i].val = H->array[index[0]].val + H->array[index[1]].val;H->array[i].parent = 0;H->array[i].lchild = &H->array[index[0]];H->array[i].rchild = &H->array[index[1]];把parent置為非0,表示已經構建H->array[index[0]].parent = i;H->array[index[1]].parent = i;樹的容量值更新H->length++;i++;}
}

????????最后是主函數和結果,最后用先序遍歷打印了一下哈夫曼樹,符合上面哈夫曼樹的圖。?

這就是文章的全部內容了,希望對你有所幫助,如有錯誤歡迎評論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24137.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

立創·天空星開發板-GD32F407VE-GPIO

本文以 立創天空星開發板-GD32F407VET6-青春版 作為學習的板子&#xff0c;記錄學習筆記。 立創天空星開發板-GD32F407VE-GPIO 基礎概念三極管MOS管 GPIO輸出模式輸出線與GPIO輸入模式GPIO點燈 基礎概念 GPIO&#xff0c;全稱為“通用輸入/輸出”&#xff08;General Purpose …

算法金 | 這次終于能把張量(Tensor)搞清楚了!

大俠幸會&#xff0c;在下全網同名[算法金] 0 基礎轉 AI 上岸&#xff0c;多個算法賽 Top [日更萬日&#xff0c;讓更多人享受智能樂趣] 1. 張量&#xff08;Tensor&#xff09;基礎概念 1.1 張量的定義與重要性 張量是深度學習中用于表示數據的核心結構&#xff0c;它可以視…

《帝國時代 III:決定版》秘籍 怎么在蘋果電腦上玩《帝國時代 III:決定版》

《帝國時代 III&#xff1a;決定版》是一款讓玩家沉浸于歷史長河體驗從大航海時代到工業革命時期的游戲。下面我們來看看《帝國時代 III&#xff1a;決定版》是什么類型的游戲&#xff0c;《帝國時代 III&#xff1a;決定版》Mac安裝教程的相關內容。 一、《帝國時代 III&…

【BOM02】本地存儲

一&#xff1a;什么是本地存儲 數據存儲在用戶瀏覽器中&#xff0c;用戶設置、讀取方便&#xff0c;同時頁面刷新時不會丟失數據。存儲在瀏覽器中數據約5M&#xff0c;分為sessionStorage和localStorage兩種存儲方式 二&#xff1a;localStorage存儲 作用 將數據永久存儲在…

opencv實戰小結-銀行卡號識別

實戰1-銀行卡號識別 項目來源&#xff1a;opencv入門 項目目的&#xff1a;識別傳入的銀行卡照片中的卡號 難點&#xff1a;銀行卡上會有一些干擾項&#xff0c;如何排除這些干擾項&#xff0c;并且打印正確的號碼是一個問題 最終效果如上圖 實現這樣的功能需要以下幾個步驟…

基于Amazon Linux使用pip安裝certbot并使用Apache配置證書的完整步驟

配置證書 1. 更新系統和安裝必要的軟件包 首先&#xff0c;確保系統和包管理器是最新的&#xff1a; sudo dnf update -y sudo dnf install -y python3 python3-pip python3-virtualenv httpd mod_ssl2. 創建并激活虛擬環境 為了避免依賴沖突&#xff0c;使用virtualenv創建…

算法導論實戰(三)(算法導論習題第二十四章)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;算法啟示錄 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目錄 前言 第二十四章 24.1-3 24.1-4 2…

筆記:DST與HPPC測試方法

一、DST測試方法&#xff1a; DST全稱為Dynamic Stress Test,是一種動態壓力測試方法&#xff0c;主要用于評估電池在實際使用條件下的綜合性能&#xff0c;模擬了車輛在行駛過程中可能會遇到的各種動態負載變化&#xff0c;如加速、減速、怠速等工況。 它的目的是評估電池在…

setattr前端接收方法深度解析

setattr前端接收方法深度解析 在前端開發中&#xff0c;setattr可能是一個較為陌生的概念&#xff0c;但它卻在某些場景下扮演著關鍵角色。setattr是一個Python內置函數&#xff0c;用于設置對象屬性的值。然而&#xff0c;在前端與后端交互的過程中&#xff0c;我們有時需要處…

【Week-R2】使用LSTM實現火災預測(tf版本)

【Week-R2】使用LSTM實現火災預測&#xff08;tf版本&#xff09; 一、 前期準備1.1 設置GPU1.2 導入數據1.3 數據可視化 二、數據預處理(構建數據集)2.1 設置x、y2.2 歸一化2.3 劃分數據集 三、模型創建、編譯、訓練、得到訓練結果3.1 構建模型3.2 編譯模型3.3 訓練模型3.4 模…

超詳細的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我們常常涉及到對象的比較&#xff0c;不同于基本數據類型&#xff0c;對于我們的自定義對象&#xff0c;需要我們自己去建立比較標準&#xff0c;例如我們自定義一個People類&#xff0c;這個類有name和age兩個屬性&#xff0c;那么問…

[數據集][圖像分類]蘑菇分類數據集3122張215類別

數據集類型&#xff1a;圖像分類用&#xff0c;不可用于目標檢測無標注文件 數據集格式&#xff1a;僅僅包含jpg圖片&#xff0c;每個類別文件夾下面存放著對應圖片 圖片數量(jpg文件個數)&#xff1a;3122 分類類別數&#xff1a;215 類別名稱:[“almond_mushroom”,“amanita…

實驗筆記之——DPVO(Deep Patch Visual Odometry)

本博文記錄本文測試DPVO的過程&#xff0c;本博文僅供本人學習記錄用~ 《Deep Patch Visual Odometry》 代碼鏈接&#xff1a;GitHub - princeton-vl/DPVO: Deep Patch Visual Odometry 目錄 配置過程 測試記錄 參考資料 配置過程 首先下載代碼以及創建conda環境 git clo…

Data Management Controls

Data Browsing and Analysis Data Grid 以標準表格或其他視圖格式&#xff08;例如&#xff0c;帶狀網格、卡片、瓷磚&#xff09;顯示數據。Vertical Grid 以表格形式顯示數據&#xff0c;數據字段顯示為行&#xff0c;記錄顯示為列。Pivot Grid 模擬微軟Excel的樞軸表功…

有待挖掘的金礦:大模型的幻覺之境

人工智能正在迅速變得無處不在&#xff0c;在科學和學術研究中&#xff0c;自回歸的大型語言模型&#xff08;LLM&#xff09;走在了前列。自從LLM的概念被整合到自然語言處理&#xff08;NLP&#xff09;的討論中以來&#xff0c;LLM中的幻覺現象一直被廣泛視為一個顯著的社會…

Oracle EBS AP發票創建會計科目提示:APP-SQLAP-10710:無法聯機創建會計分錄

系統版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 問題癥狀: 提交“創建會計科目”請求提示錯誤信息如下: APP-SQLAP-10710:無法聯機創建會計分錄。 請提交應付款管理系統會計流程,而不要為此事務處理創建會計分錄解決方法 數據修復SQL腳本: UPDATE ap_invoi…

LabVIEW閥性能試驗臺測控系統

本項目開發的閥性能試驗臺測控系統是為滿足國家和企業相關標準而設計的&#xff0c;主要用于汽車氣壓制動系統控制裝置和調節裝置等產品的綜合性能測試。系統采用工控機控制&#xff0c;配置電器控制柜&#xff0c;實現運動控制、開關量控制及傳感器信號采集&#xff0c;具備數…

vue封裝一個查詢URL參數方法

vue封裝一個查詢URL參數方法 在 Vue 中&#xff0c;你可以封裝一個查詢 URL 參數的方法來獲取 URL 中的查詢參數。以下是一個示例代碼&#xff1a; export const getQueryParam (param) > {const urlParams new URLSearchParams(window.location.search);return urlPara…

算法-分治策略

概念 分治算法&#xff08;Divide and Conquer&#xff09;是一種解決問題的策略&#xff0c;它將一個問題分解成若干個規模較小的相同問題&#xff0c;然后遞歸地解決這些子問題&#xff0c;最后合并子問題的解得到原問題的解。分治算法的基本思想是將復雜問題分解成若干個較…

東方博宜1565 - 成績(score)

問題描述 牛牛最近學習了 C 入門課程&#xff0c;這門課程的總成績計算方法是&#xff1a; 總成績作業成績 20% 小測成績 30% 期末考試成績 50%。 牛牛想知道&#xff0c;這門課程自己最終能得到多少分。 輸入 三個非負整數 A、B、C &#xff0c;分別表示牛牛的作業成績、…