日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

霍夫曼編碼(Huffman Coding):一個(gè)“學(xué)生打敗老師”的傳奇壓縮文件算法

admin
2025年6月10日 21:14 本文熱度 230

大家好,你一定有過這樣的經(jīng)歷:硬盤空間告急,不得不把陳年舊照打包成一個(gè)巨大的`.zip`文件;或者在網(wǎng)速慢如蝸牛的年代,眼巴巴地等著一張小小的`.jpg`圖片加載出來。每當(dāng)這時(shí),“壓縮”就像一種現(xiàn)代魔法,無中生有地為我們擠出寶貴的存儲(chǔ)空間和帶寬。

但你有沒有想過,這個(gè)每天都在我們身邊發(fā)生的“魔法”,背后藏著怎樣絕妙的智慧?今天,讓我們撥開0和1的迷霧,回到70多年前的麻省理工,講述一個(gè)關(guān)于“偷懶”、“靈感”和一位學(xué)生用更優(yōu)雅的方案“打敗”老師的真實(shí)傳奇。

故事,從一門“逼死人”的期末考說起

時(shí)間是1951年,第二次世界大戰(zhàn)的硝煙剛剛散去,整個(gè)世界都籠罩在信息革命的黎明之中??藙诘隆は戕r(nóng)那篇奠定信息論基礎(chǔ)的論文《通信的數(shù)學(xué)理論》發(fā)表才不過三年,如何高效地表示和傳輸信息,成了當(dāng)時(shí)最前沿、最性感的科學(xué)問題。

羅伯特·法諾教授,信息論領(lǐng)域的先驅(qū)

在這樣的時(shí)代背景下,麻省理工學(xué)院(MIT)的羅伯特·法諾(Robert Fano)教授,無疑是站在浪潮之巔的大牛。他在信息論領(lǐng)域聲名顯赫,他的課堂座無虛席。

那一年,在《信息論》課程的期末,法諾教授給他的研究生們出了一個(gè)非同尋常的選擇題:

“你們有兩個(gè)選擇:

1. 參加傳統(tǒng)的期末考試,中規(guī)中矩地拿一個(gè)分?jǐn)?shù)。

2. 解決一個(gè)開放性問題——找到一種能被證明是最高效的二進(jìn)制編碼方法。

這不僅僅是一個(gè)挑戰(zhàn),更是一份邀請(qǐng)。法諾教授自己已經(jīng)和香農(nóng)共同提出了一種相當(dāng)出色的算法(后世稱為“香農(nóng)-法諾編碼”),但他內(nèi)心清楚,這個(gè)算法在某些情況下并非理論上的最優(yōu)解。他把這個(gè)尚未被攻克的堡壘,當(dāng)成禮物送給了他的學(xué)生們。

一個(gè)想“偷懶”的學(xué)生,和他的“神來之筆”

在這些學(xué)生中,有一個(gè)名叫大衛(wèi)·霍夫曼(David Huffman)的年輕人。面對(duì)這個(gè)挑戰(zhàn),他熱血沸騰,決定放手一搏。這既是對(duì)知識(shí)的渴望,或許也夾雜著一絲“逃避”枯燥期末復(fù)習(xí)的僥幸心理。

大衛(wèi)·霍夫曼,當(dāng)時(shí)還是一名研究生

然而,難題之所以是難題,就是因?yàn)樗鼤?huì)把人逼到絕境?;舴蚵鼜U寢忘食地工作了數(shù)月,嘗試了各種復(fù)雜的數(shù)學(xué)方法,但每一種都無法從邏輯上證明自己是“最優(yōu)”的。眼看交卷日期一天天逼近,他幾乎陷入絕望。

就在他準(zhǔn)備認(rèn)輸,把幾個(gè)月的草稿紙揉成一團(tuán)扔進(jìn)垃圾桶,然后去圖書館借復(fù)習(xí)資料時(shí),靈感,就像黑夜中的一道閃電,毫無征兆地?fù)糁辛怂?/span>

“我之前的一切努力,全都想反了!”

他意識(shí)到,包括他老師在內(nèi)的所有人,思考這個(gè)問題的方式都是“自頂向下”的:就像一個(gè)國王,試圖把整個(gè)王國不斷地一分為二,直到每個(gè)家庭。這種方法雖然直觀,但很難保證每次分割都是最完美的。

霍夫曼的革命性想法是,徹底顛覆這個(gè)過程,采用“自底向上”的策略。他的方法簡單到令人發(fā)指:

  1. 統(tǒng)計(jì)頻率:
    先數(shù)一數(shù)每個(gè)字符出現(xiàn)了多少次。
  2. 從最小的開始:
    不去管那些出現(xiàn)次數(shù)多的“大人物”,而是每次都挑出頻率最低、最不起眼的兩個(gè)字符。
  3. 合并同類項(xiàng):
    將這兩個(gè)“小可憐”合并成一個(gè)新的“小團(tuán)體”(在數(shù)據(jù)結(jié)構(gòu)里稱為樹節(jié)點(diǎn)),這個(gè)團(tuán)體的“權(quán)重”(頻率)就是它倆之和。
  4. 循環(huán)往復(fù):
    把這個(gè)新團(tuán)體放回隊(duì)伍里,繼續(xù)重復(fù)第二步,直到所有字符最終合并成一個(gè)唯一的、龐大的家族(根節(jié)點(diǎn))。

這個(gè)過程就像玩樂高,不是先規(guī)劃好整個(gè)城堡再填充細(xì)節(jié),而是從最小的1x1積木塊開始,一步步搭建起宏偉的建筑。這個(gè)算法不僅被證明是絕對(duì)最優(yōu)的,而且實(shí)現(xiàn)起來異常簡單?;舴蚵眠@個(gè)漂亮的解法,完美地回應(yīng)了老師的挑戰(zhàn)。從此,這個(gè)由學(xué)生發(fā)明的、比老師的方案更優(yōu)秀的算法,被冠以他的名字——霍夫曼編碼(Huffman Coding)。

霍夫曼編碼到底有多聰明?

讓我們用一個(gè)具體的例子 `SUCCESS IS SUCCESS` 來感受它的魔力。

第一步:統(tǒng)計(jì)頻率

  • S: 6次
  • C: 4次
  • U: 2次
  • E: 2次
  • I: 1次
  • ' ': 2次

第二步:建樹(“自底向上”的魔法)

(為簡化,我們忽略空格)

  1. 初始隊(duì)列:[ (I,1), (U,2), (E,2), (C,4), (S,6) ]
  2. 取出最小的 (I,1) 和 (U,2),合并成 (IU,3)。隊(duì)列變?yōu)椋篬 (E,2), (IU,3), (C,4), (S,6) ]
  3. 取出最小的 (E,2) 和 (IU,3),合并成 (EIU,5)。隊(duì)列變?yōu)椋篬 (C,4), (EIU,5), (S,6) ]
  4. 取出最小的 (C,4) 和 (EIU,5),合并成 (CEIU,9)。隊(duì)列變?yōu)椋篬 (S,6), (CEIU,9) ]
  5. 最后,合并 (S,6) 和 (CEIU,9),得到根節(jié)點(diǎn) (SCEIU,15)。樹建成!

第三步:分配編碼(左0右1)

從根節(jié)點(diǎn)開始,往左孩子走記為`0`,往右孩子走記為`1`,直到葉子節(jié)點(diǎn)。我們可以得到一套獨(dú)一無二的編碼:

  • S: 0
  • C: 100
  • E: 1010
  • I: 10110
  • U: 10111

看到了嗎?出現(xiàn)最多的`S`,編碼最短(只有1位)。出現(xiàn)最少的`I`和`U`,編碼最長。這就是霍夫曼編碼的精髓,它用長短不一的編碼,實(shí)現(xiàn)了整體最優(yōu)的“節(jié)約”。

用Python親手實(shí)現(xiàn)這個(gè)傳奇算法

光說不練假把式。下面是完整的Python代碼,包括壓縮和解壓。你可以親手運(yùn)行,感受這個(gè)算法的簡潔與強(qiáng)大。

import heapqfrom collections import Counter# 1. 定義霍夫曼樹的節(jié)點(diǎn)class Node:    def __init__(self, char, freq):        self.char = char        self.freq = freq        self.left = None        self.right = None    # 讓heapq能夠比較節(jié)點(diǎn)大小    def __lt__(self, other):        return self.freq < other.freqdef build_huffman_tree(text):    """根據(jù)文本構(gòu)建霍夫曼樹"""    # 統(tǒng)計(jì)字符頻率    freq_counter = Counter(text)
    # 創(chuàng)建一個(gè)優(yōu)先隊(duì)列(最小堆),用于存放節(jié)點(diǎn)    # heapq能確保我們每次都取出頻率最小的節(jié)點(diǎn)    priority_queue = [Node(char, freq) for char, freq in freq_counter.items()]    heapq.heapify(priority_queue)    # 當(dāng)隊(duì)列中只剩一個(gè)節(jié)點(diǎn)(根節(jié)點(diǎn))時(shí),樹就建好了    while len(priority_queue) > 1:        # 取出兩個(gè)頻率最小的節(jié)點(diǎn)        left_node = heapq.heappop(priority_queue)        right_node = heapq.heappop(priority_queue)        # 合并成一個(gè)新的父節(jié)點(diǎn),頻率為兩者之和        # 父節(jié)點(diǎn)的字符可以設(shè)為None,因?yàn)樗挥糜跇?gòu)建樹        merged_node = Node(None, left_node.freq + right_node.freq)        merged_node.left = left_node        merged_node.right = right_node        # 將新節(jié)點(diǎn)放回優(yōu)先隊(duì)列        heapq.heappush(priority_queue, merged_node)
    # 返回樹的根節(jié)點(diǎn)    return priority_queue[0]def generate_codes(node, prefix="", code_map={}):    """遍歷霍夫曼樹,生成每個(gè)字符的編碼"""    if node is None:        return    # 如果是葉子節(jié)點(diǎn),說明它代表一個(gè)真實(shí)字符    if node.char is not None:        code_map[node.char] = prefix
    # 往左走,路徑加'0';往右走,路徑加'1'    generate_codes(node.left, prefix + "0", code_map)    generate_codes(node.right, prefix + "1", code_map)
    return code_mapdef huffman_compress(text):    """主函數(shù):執(zhí)行霍夫曼壓縮"""    if not text:        return "", {}    # 1. 構(gòu)建霍夫曼樹    root = build_huffman_tree(text)
    # 2. 生成編碼表    codes = generate_codes(root, "", {})
    # 3. 用生成的編碼表來編碼原文    encoded_text = "".join([codes[char] for char in text])
    return encoded_text, codes# --- 開始測(cè)試 ---original_text = "beep boop beep"# 執(zhí)行壓縮compressed_text, huffman_codes = huffman_compress(original_text)# 計(jì)算原始大小和壓縮后的大?。僭O(shè)ASCII,每個(gè)字符8位)original_size = len(original_text) * 8compressed_size = len(compressed_text)print(f"原始文本: {original_text}\n")print("霍夫曼編碼表:")for char, code in sorted(huffman_codes.items()):    print(f"  '{char}': {code}")print(f"\n壓縮后的文本: {compressed_text}\n")print(f"原始大小 (ASCII): {original_size} 位")print(f"壓縮后大小: {compressed_size} 位")print(f"壓縮率: {100 * (1 - compressed_size / original_size):.2f}%")


不朽的遺產(chǎn)

如今,霍夫曼編碼已經(jīng)成為計(jì)算機(jī)科學(xué)的基石之一。雖然現(xiàn)代壓縮工具(如 `zip`, `gzip`)通常會(huì)結(jié)合更復(fù)雜的算法(如LZ77)來獲得更高的壓縮率,但霍夫曼編碼依然是它們不可或缺的一環(huán),尤其是在處理最后一步的編碼階段。

從你手機(jī)里每一張`.jpg`照片的圖像數(shù)據(jù),到`.mp3`音樂文件的悠揚(yáng)旋律,再到互聯(lián)網(wǎng)上傳輸?shù)臒o數(shù)數(shù)據(jù)包,背后都有霍夫曼編碼的影子。它就像一個(gè)勤勤懇懇的幕后英雄,默默地為我們的數(shù)字世界減負(fù)。

故事講完了。下一次,當(dāng)你右鍵點(diǎn)擊文件夾選擇“添加到壓縮文件”時(shí),或許可以會(huì)心一笑。

因?yàn)槟阒?,你即將運(yùn)行的,不僅僅是一段冰冷的代碼,更是一個(gè)70多年前的傳奇。它關(guān)于一個(gè)學(xué)生的靈光乍現(xiàn),關(guān)于“自底向上”的逆向思維,也關(guān)于人類智慧如何用最優(yōu)雅的方式,戰(zhàn)勝了看似無解的難題。


閱讀原文:原文鏈接


該文章在 2025/6/11 9:55:31 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

guochan91shipin| 中文字幕精品无码一 区| 欧美久久一次| 精品久久久久久无| 天天色天天日天天射射久久| 亚洲九九不卡在线| 日韩A√一本道| 亚洲 国产偷拍自| 成人美女特黄视频看| 中文字幕天堂AV| 亚洲AV在线偷拍自拍| 欧美日韩一区二区三区巨吊| 99久久精品少妇高潮喷水| AV国产传媒高清| 国产日韩123区线观看| 天天操夜夜操夜夜奸一区二区、| 日韩亚洲欧洲一区二区三区| 少妇 日 一区| 极品日本少妇| 好吊妇免费视频| 美女的奶头久久久| 欧美日韩第二页| 亚洲精品乱码在线观看| 中国AV流白浆| 全网最黄亚洲AV| 日韩欧美中文亚洲一区| 中文字幕日本三级| 妞干样日韩| 亚洲综合一二三区| 色一区二区三区在线| 亚洲三级网址| 午夜成人色色电影| 在线有黄片| 极品丝袜少妇在线影院| 色综合久久一区| 久久久久夜色精品国产成人片| 久久精品日本giga| 日日爽日日操| 亚洲欧洲人成视频在线| 久久一线二线三线视频| 一级成人片99|