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

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

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

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

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

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

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

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

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

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

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

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

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

2. 解決一個(gè)開(kāi)放性問(wèn)題——找到一種能被證明是最高效的二進(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é)生,和他的“神來(lái)之筆”

在這些學(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é)方法,但每一種都無(wú)法從邏輯上證明自己是“最優(yōu)”的。眼看交卷日期一天天逼近,他幾乎陷入絕望。

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

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

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

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

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

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

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

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

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

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

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

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

  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)。樹(shù)建成!

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

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

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

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

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

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

import heapqfrom collections import Counter# 1. 定義霍夫曼樹(shù)的節(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)建霍夫曼樹(shù)"""    # 統(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í),樹(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)建樹(shù)        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)
    # 返回樹(shù)的根節(jié)點(diǎn)    return priority_queue[0]def generate_codes(node, prefix="", code_map={}):    """遍歷霍夫曼樹(shù),生成每個(gè)字符的編碼"""    if node is None:        return    # 如果是葉子節(jié)點(diǎn),說(shuō)明它代表一個(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)建霍夫曼樹(shù)    root = build_huffman_tree(text)
    # 2. 生成編碼表    codes = generate_codes(root, "", {})
    # 3. 用生成的編碼表來(lái)編碼原文    encoded_text = "".join([codes[char] for char in text])
    return encoded_text, codes# --- 開(kāi)始測(cè)試 ---original_text = "beep boop beep"# 執(zhí)行壓縮compressed_text, huffman_codes = huffman_compress(original_text)# 計(jì)算原始大小和壓縮后的大小(假設(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)來(lái)獲得更高的壓縮率,但霍夫曼編碼依然是它們不可或缺的一環(huán),尤其是在處理最后一步的編碼階段。

從你手機(jī)里每一張`.jpg`照片的圖像數(shù)據(jù),到`.mp3`音樂(lè)文件的悠揚(yáng)旋律,再到互聯(lián)網(wǎng)上傳輸?shù)臒o(wú)數(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)勝了看似無(wú)解的難題。


閱讀原文:原文鏈接


該文章在 2025/6/11 9:55:31 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(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è)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(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

天天干夜夜对白| 日韩欧美国产一二三区| 欧美日韩国产一区精品| 精品人妻久久久久久中文字幕| 嗯啊流水视频免费| 黄色免费看不卡的| 丰满人妻初撮| 久久久久久久三三三| 免费青青草成人无码av| 在线不卡一级高潮不卡无毒| 国产 精品 一区在线999| 年轻少妇久久久| 操欧美美女到高潮喷水| 黄色小说在线免费| 高清不卡国产| 欧美一区亚洲一区国产| 免费黄色网址麻豆| 成人午夜福利色| 欧美日韩国产综合色| 人妻少妇自慰高清图片| 抽插30秒视频| av久久电影| 这里只有97精品| 久久风流少妇| 亚洲AV无码专区色爱天堂预告片| 亚洲无码4610| av好片麻豆| 96欧美激情一| 巴青县| 日本一区二区三区9199| 欧美视频小黄片| 欧美性猛交一久二久三久| 国产熟女亂伦一区二区三区 | 婷婷丁香狠狠色一区二区| 国产色诱视频在线播放丝袜| 欧美日韩另类专区一区| 涩成人久久| 久久午夜伦理视频| 精品日韩123| 亚洲天堂岛大奶一区| 亚洲精品久久久久玩吗|