哈夫曼樹Python實現

哈夫曼樹構建原則:

  1. .統計頻率:對待編碼字符(或數據塊)的頻率進行統計。
  2. .初始化森林:將每個字符視為一棵只有根節點的二叉樹,權值為頻率。
  3. .合并樹:重復以下操作,直到只剩一棵樹:
    • 選取權值最小的兩棵樹合并,新樹的根節點權值為兩者之和。
    • 權值較小的樹作為左子樹,較大的為右子樹(約定方向不影響結果)。
  4. 生成編碼:從根節點出發,向左子樹路徑標記0,向右標記1,到葉子節點的路徑即為該字符的哈夫曼編碼。

?引用python模塊說明:

heapq.heapify?是?heapq?模塊(堆隊列算法)的核心函數,用于將普通列表原地轉換為最小堆數據結構

import heapq# 原始未排序列表
data = [3, 1, 4, 1, 5, 9, 2, 6]
print("轉換前:", data)  # [3, 1, 4, 1, 5, 9, 2, 6]# 原地轉換為最小堆
heapq.heapify(data)print("轉換后:", data)  # 輸出可能: [1, 1, 2, 3, 5, 9, 4, 6]
print("最小元素:", data[0])  # 1 (始終是堆頂)

圖示化:

? ? ? 1 ? ?← 堆頂 (最小元素)
? ? / ? \
? ?1 ? ? 2
? / \ ? / \
?3 ? 5 9 ? 4
/
6?

import heapqclass Node:def __init__(self, char=None, freq=0, left=None, right=None):self.char = char    # 字符(僅葉子節點有)self.freq = freq    # 頻率self.left = left    # 左子節點self.right = right  # 右子節點# 用于優先隊列比較def __lt__(self, other):return self.freq < other.freqdef build_huffman_tree(freq_dict):heap = [Node(char=char, freq=freq) for char, freq in freq_dict.items()]heapq.heapify(heap)  # 轉為最小堆while len(heap) > 1:left = heapq.heappop(heap)  # 彈出最小頻率節點right = heapq.heappop(heap) # 彈出次小頻率節點merged = Node(freq=left.freq + right.freq, left=left, right=right)heapq.heappush(heap, merged)  # 合并后的樹放回堆中,繼續轉為最小堆return heap[0]  # 返回哈夫曼樹的根節點def generate_codes(root, current_code="", code_dict={}):if root is None:returnif root.char is not None:  # 葉子節點,則加入字典code_dict[root.char] = current_codegenerate_codes(root.left, current_code + "0", code_dict)  #遞歸調用generate_codes(root.right, current_code + "1", code_dict) #遞歸調用return code_dict# 示例:壓縮字符串 "aabbbcd"
freq = {'a': 2, 'b': 3, 'c': 1, 'd': 1}
huffman_tree = build_huffman_tree(freq)
codes = generate_codes(huffman_tree)
print("哈夫曼編碼:", codes)  # 輸出如 {'b': '0', 'a': '10', 'c': '110', 'd': '111'}

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

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

相關文章

Dockerfile的學習與實踐

Dockerfile通過一系列的命令和參數&#xff0c;構建自定義鏡像。一般步驟如下&#xff1a; 一. 常用命令說明 基礎命令具體命令描述例子FROMFROM[基礎鏡像:版本號]基于指定的基礎鏡像構建自定義鏡像FROM eclipse-temurin:17-jdk-alpineRUNRUN構建容器需要運行的命令&#xff0…

【三大前端語言之一】靜態網頁語言:HTML詳解

你知道你在瀏覽器中所看到的每一個按鈕&#xff0c;每一個框&#xff0c;都是怎么創造出來的嗎&#xff1f;它們并非魔法&#xff0c;而是由一種被稱為HTML的語言精心構建的骨架。作為前端世界的三大基石之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;HTML是萬…

04、誰發明了深度學習的方法,是怎么發明的?

深度學習的發展是多位研究者長期探索的結果,其核心方法的形成并非由單一人物 “發明”,而是歷經數十年理論積累與技術突破的產物。以下從關鍵人物、核心技術突破及歷史背景三個維度,梳理深度學習方法的起源與發展脈絡: 一、深度學習的奠基者與關鍵貢獻者 1. Geoffrey Hin…

Jmeter ServerAgent在arm環境啟動報錯no libsigar-aarch64-linux.so in java.library.path

使用Jmeter壓測的時候&#xff0c;用ServerAgent監測arm服務器的性能指標&#xff0c;在啟動ServerAgent時&#xff0c;報錯了&#xff1a;no libsigar-aarch64-linux.so in java.library.path 解決方案&#xff1a; 下載libsigar-aarch64-linux.so文件&#xff0c;放置在Serv…

AJAX攔截器失效排查指南:當你的beforeSend有效但error/complete沉默時

問題現象 開發者常遇到這樣的場景&#xff1a; $.ajaxSetup({beforeSend: () > console.log("? 觸發"), // 正常執行error: () > console.log("? 未觸發"), // 靜默失效complete: () > console.log("? 未觸發") // 同樣沉默 })…

【模型微調】負樣本選擇

1.核心設計理念 非對稱檢索任務&#xff08;例如&#xff0c;用一個簡短的問題去文檔庫里查找答案&#xff09;的一個核心挑戰是查詢&#xff08;query&#xff09;和文檔&#xff08;passage&#xff09;在文本特征上的巨大差異。以往的研究發現&#xff0c;為查詢和文檔提供…

下載安裝redis

有任何問題&#xff0c;都可以私信博主&#xff0c;共同探討學習。 正文開始 一、下載安裝redis一、啟動redis總結 一、下載安裝redis redis官方下載地址是github&#xff0c;有條件的同學可以自行搜索下載。針對部分網速不太好的同學&#xff0c;可以通過網盤獲取&#xff0c…

flutter 項目配置Gradle下載代理

如圖&#xff0c; 在Android Studio中配置代理是不生效的。 需要在flutter sdk的Gradle中去配置代理

世冠科技亮相TMC,以國產MBD工具鏈賦能汽車電控系統開發新未來

2025年6月12日至13日&#xff0c;第十七屆國際汽車動力系統技術年會&#xff08;TMC2025&#xff09;在南通國際會展中心盛大召開。作為全球汽車動力系統領域規模最大、規格最高、內容最前沿的標桿性國際盛會&#xff0c;匯聚了來自全球整車企業、核心零部件供應商、頂尖科研機…

將本地項目與遠程 Git 倉庫關聯的完整步驟

將本地項目與遠程 Git 倉庫關聯的完整步驟 現在的情景是&#xff1a;本地文件項目已經寫好了&#xff0c;亦或者遠程倉庫已經建好了&#xff0c;需要與本地項目關聯起來 以下是詳細的操作流程&#xff0c;我會用清晰的步驟說明如何將你的本地項目與遠程 Git 倉庫關聯&#xf…

3DS 轉換為 STP 全攻略:迪威模型網在線轉換詳解

在三維模型創作與應用的多元場景中&#xff0c;不同格式的文件承擔著獨特的角色。3DS&#xff08;3D Studio&#xff09;格式是 Autodesk 3ds Max 早期廣泛使用的文件格式&#xff0c;常用于游戲開發、影視特效制作等領域&#xff0c;能夠存儲模型的幾何形狀、材質、動畫等信息…

Linux下iptables和firewalld詳解

Linux下iptables和firewalld詳解 Linux下iptables和firewalld簡述Iptables四表五鏈策略與規則鏈命令參數Firewalld終端管理工具圖形管理工具服務的訪問控制列表Linux下iptables和firewalld 簡述 ? 保障數據的安全性是繼保障數據的可用性之后最為重要的一項工作。防火墻作為公…

Kafka Connect高級開發:自定義擴展與復雜場景應對

引言 在掌握Kafka Connect基礎操作與內置連接器應用后&#xff0c;面對企業復雜的業務需求&#xff0c;如對接非標準數據源、實現特定數據處理邏輯&#xff0c;就需要深入到高級開發領域。本篇博客將圍繞自定義Connector開發、數據轉換編程、錯誤處理與容錯機制展開&#xff0…

吳恩達機器學習筆記:正則化2

1.正則化線性回歸 對于線性回歸的求解&#xff0c;我們之前推導了兩種學習算法&#xff1a;一種基于梯度下降&#xff0c;一種基于正規方程。 正則化線性回歸的代價函數為&#xff1a; J ( θ ) 1 2 m [ ∑ i 1 m ( h θ ( x ( i ) ) ? y ( i ) ) 2 λ ∑ j 1 n θ j 2 …

Unity中的Resources加載

Unity的Resources加載是Unity引擎中一種在運行時動態加載資源&#xff08;assets&#xff09;的方式&#xff0c;允許開發者將資源放置在特定的Resources文件夾中&#xff0c;并通過代碼按名稱加載這些資源&#xff0c;而無需在場景中預先引用。這種方式在需要動態加載資源時非…

對Vue2響應式原理的理解-總結

根據這張圖進行總結 在組件實例初始化階段&#xff0c;通過 observe() 方法對 data 對象進行遞歸遍歷。在這個過程中&#xff0c;Vue 使用 Object.defineProperty() 為data 中的每個屬性定義 getter 和 setter 來攔截對象屬性的“讀取“操作和“寫入”操作。 Vue 的依賴追蹤是…

基于深度學習的智能音頻增強系統:技術與實踐

前言 在音頻處理領域&#xff0c;音頻增強技術一直是研究的熱點。音頻增強的目標是改善音頻信號的質量&#xff0c;去除噪聲、回聲等干擾&#xff0c;提高音頻的可聽性和可用性。傳統的音頻增強方法主要依賴于信號處理技術&#xff0c;如濾波器設計、頻譜減法等&#xff0c;但這…

從代碼學習深度強化學習 - DQN PyTorch版

文章目錄 前言DQN 算法核心思想Q-Learning 與函數近似經驗回放 (Experience Replay)目標網絡 (Target Network)PyTorch 代碼實現詳解1. 環境與輔助函數2. 經驗回放池 (ReplayBuffer)3. Q網絡 (Qnet)4. DQN 主類5. 訓練循環6. 設置超參數與開始訓練訓練結果與分析總結前言 歡迎…

AI與大數據如何驅動工業品電商平臺的智能決策?

在轟鳴的工廠里&#xff0c;一臺關鍵設備因某個密封圈失效而驟然停機。生產線停滯、訂單延誤、經濟損失每分鐘都在擴大。此刻&#xff0c;采購經理在工業品電商平臺上瘋狂搜索&#xff0c;卻迷失在海量零件參數與供應商信息中。工業品的沉默&#xff0c;往往意味著生產線的沉默…

連接器全解析:數據庫連接器和文件連接器的區別和聯系

目錄 一、數據庫連接器和文件連接器的基本概念 1. 數據庫連接器 2. 文件連接器 二、數據庫連接器和文件連接器的區別 1. 數據存儲方式 2. 數據處理能力 3. 數據安全性 4. 數據更新頻率 三、數據庫連接器和文件連接器的聯系 1. 數據交互 2. 數據處理流程 3. 應用場景…