色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Huffman壓縮算法概述和詳細流程

FPGA開源工作室 ? 來源:FPGA開源工作室 ? 2024-10-21 13:48 ? 次閱讀

1 概述

Huffman壓縮算法是一種基于字符出現頻率的編碼算法,通過構建Huffman樹,將出現頻率高的字符用短編碼表示,出現頻率低的字符用長編碼表示,從而實現對數據的壓縮。以下是Huffman壓縮算法的詳細流程:
統計字符頻率:遍歷待壓縮的數據,統計每個字符出現的頻率。
構建優先隊列:將每個字符及其頻率作為一個結點放入優先隊列(或最小堆)中,根據字符頻率構建一個按頻率大小排序的優先隊列。
構建Huffman樹:不斷地從優先隊列中取出頻率最小的兩個結點,合并為一個新結點,并將新結點重新插入到優先隊列中,直到隊列只剩下一個結點,即Huffman樹的根結點。
生成Huffman編碼:通過遍歷Huffman樹,從根結點到每個葉子結點的路徑上的左右分支分別對應編碼0和1,根據路徑生成每個字符的Huffman編碼。
壓縮數據:根據生成的Huffman編碼,將待壓縮數據中的每個字符替換為對應的Huffman編碼,得到壓縮后的數據。
存儲壓縮表:將字符與對應的Huffman編碼關系存儲為壓縮表,以便解壓縮時使用。
存儲壓縮數據:將壓縮后的數據以二進制形式存儲。
在解壓縮時,需要根據存儲的Huffman編碼表和壓縮數據,使用相同的Huffman樹結構進行解碼,將壓縮數據解壓縮成原始數據,并輸出原始數據。
Huffman壓縮算法的優勢在于可以根據數據的特征自適應地確定編碼,使得出現頻率高的字符擁有更短的編碼,從而實現高效的數據壓縮。然而,Huffman算法對于小規模數據壓縮效果不佳,適用于處理較大規模的數據壓縮。

2 huffman壓縮算法過程詳細演示

下面將通過一個簡單的例子來演示Huffman壓縮算法的壓縮過程,假設有一個字符串 “ABRACADABRA” 需要進行壓縮。

統計字符頻率:

A: 5 次
B: 2 次
R: 2 次
C: 1 次
D: 1 次
2) 構建優先隊列:
構建一個優先隊列,按照字符頻率排序:

(C, 1), (D, 1), (B, 2), (R, 2), (A, 5)
3) 構建Huffman樹:
不斷地從優先隊列中取出頻率最小的兩個結點,合并為一個新節點,并重新插入隊列中,直到隊列只剩下一個節點,作為Huffman樹的根節點。

合并過程:

(C, 1)和(D, 1) -> (CD, 2)
(B, 2)和(R, 2) -> (BR, 4)
((CD, 2) 和 (BR, 4)) -> ((CD)BR, 6)
((A, 5) 和 ((CD)BR, 6)) -> (((CD)BR)A, 11)
最終得到的Huffman樹如下:
(((CD)BR)A)
/
(CD)BR A
/
CD BR
/ /
C D B R

生成Huffman編碼:
從根節點開始,左分支為0,右分支為1,生成每個字符的Huffman編碼:

A: 0
B: 101
R: 100
C: 1100
D: 1101
6) 壓縮數據:
將原始數據字符串 “ABRACADABRA” 中的每個字符使用對應的Huffman編碼替換,得到壓縮后的數據。

原始數據:ABRACADABRA
Huffman編碼:010110011001011010001011110
壓縮后數據:010110011001011010001011110

在實際壓縮過程中,還需要將Huffman編碼表(字符與編碼的映射關系)一并存儲,以便在解壓縮時使用。通過上述過程,原始數據被成功壓縮,并且根據Huffman編碼,高頻字符編碼較短,低頻字符編碼較長,實現了數據的有效壓縮。

3 c語言Huffman壓縮代碼示例

以下是一個簡單的C語言示例代碼,實現了Huffman算法進行數據壓縮和解壓縮的功能:

#include 
#include 
#include 

#define MAX_TREE_HT 100

// 結點結構體
typedef struct MinHeapNode {
    char data;
    unsigned freq;
    struct MinHeapNode *left, *right;
} MinHeapNode;

// 最小堆結構體
typedef struct MinHeap {
    unsigned size;
    unsigned capacity;
    MinHeapNode **array;
} MinHeap;

// 創建新結點
MinHeapNode* newNode(char data, unsigned freq) {
    MinHeapNode* node = (MinHeapNode*)malloc(sizeof(MinHeapNode));
    node->left = node->right = NULL;
    node->data = data;
    node->freq = freq;
    return node;
}

// 創建最小堆
MinHeap* createMinHeap(unsigned capacity) {
    MinHeap* minHeap = (MinHeap*)malloc(sizeof(MinHeap));
    minHeap->size = 0;
    minHeap->capacity = capacity;
    minHeap->array = (MinHeapNode**)malloc(minHeap->capacity * sizeof(MinHeapNode*));
    return minHeap;
}

// 交換兩個結點
void swapMinHeapNodes(MinHeapNode** a, MinHeapNode** b) {
    MinHeapNode* t = *a;
    *a = *b;
    *b = t;
}

// 最小堆調整
void minHeapify(MinHeap* minHeap, int idx) {
    int smallest = idx;
    int left = 2 * idx + 1;
    int right = 2 * idx + 2;

    if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq)
        smallest = left;

    if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq)
        smallest = right;

    if (smallest != idx) {
        swapMinHeapNodes(&minHeap->array[smallest], &minHeap->array[idx]);
        minHeapify(minHeap, smallest);
    }
}

// 獲取最小結點
MinHeapNode* extractMin(MinHeap* minHeap) {
    MinHeapNode* temp = minHeap->array[0];
    minHeap->array[0] = minHeap->array[minHeap->size - 1];
    --minHeap->size;
    minHeapify(minHeap, 0);
    return temp;
}

// 插入結點
void insertMinHeap(MinHeap* minHeap, MinHeapNode* minHeapNode) {
    ++minHeap->size;
    int i = minHeap->size - 1;
    while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) {
        minHeap->array[i] = minHeap->array[(i - 1) / 2];
        i = (i - 1) / 2;
    }
    minHeap->array[i] = minHeapNode;
}

// 創建和構建最小堆
MinHeap* buildMinHeap(char data[], int freq[], int size) {
    MinHeap* minHeap = createMinHeap(size);
    for (int i = 0; i < size; ++i)
        minHeap->array[i] = newNode(data[i], freq[i]);
    minHeap->size = size;
    
    for (int i = size / 2 - 1; i >= 0; --i)
        minHeapify(minHeap, i);
    
    return minHeap;
}

// 檢查結點是否是葉子結點
int isLeaf(MinHeapNode* root) {
    return !(root->left) && !(root->right);
}

// 構建霍夫曼樹
MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) {
    MinHeapNode *left, *right, *top;
    MinHeap* minHeap = buildMinHeap(data, freq, size);

    while (minHeap->size != 1) {
        left = extractMin(minHeap);
        right = extractMin(minHeap);
        top = newNode('$', left->freq + right->freq);
        top->left = left;
        top->right = right;
        insertMinHeap(minHeap, top);
    }

    return extractMin(minHeap);
}

// 打印霍夫曼編碼
void printCodes(MinHeapNode* root, int arr[], int top) {
    if (root->left) {
        arr[top] = 0;
        printCodes(root->left, arr, top + 1);
    }

    if (root->right) {
        arr[top] = 1;
        printCodes(root->right, arr, top + 1);
    }

    if (isLeaf(root)) {
        printf("%c: ", root->data);
        for (int i = 0; i < top; ++i)
            printf("%d", arr[i]);
        printf("
");
    }
}

// 壓縮數據
void huffmanCompression(char data[]) {
    int freq[256] = {0};
    int n = strlen(data);
    for (int i = 0; i < n; ++i)
        ++freq[data[i]];

    char arr[256];
    int freq2[256];
    int size = 0;
    
    for (int i = 0; i < 256; ++i) {
        if (freq[i] != 0) {
            arr[size] = (char)i;
            freq2[size] = freq[i];
            ++size;
        }
    }

    MinHeapNode* root = buildHuffmanTree(arr, freq2, size);
    int arr2[MAX_TREE_HT], top = 0;
    printCodes(root, arr2, top);
}

int main() {
    char data[] = "hello world";
    huffmanCompression(data);
    
    return 0;
}

這個示例代碼演示了使用Huffman算法對輸入的數據進行壓縮,并打印出各個字符的Huffman編碼。huffmanCompression 函數首先統計輸入數據中每個字符的出現頻率,并構建Huffman樹,然后通過遞歸遍歷Huffman樹獲取每個字符的Huffman編碼并打印出來。在 main 函數中,我們對一個簡單的字符串進行了壓縮,并輸出了每個字符的Huffman編碼。

需要注意的是,這個示例代碼僅演示了Huffman算法的基本壓縮原理,實際應用中可能需要對數據內容、編碼方式等進行更多處理和優化。

4 C語言Huffman解壓縮算法示例

以下是一個簡單的C語言示例代碼,實現了Huffman算法進行數據解壓縮的功能:

#include 
#include 
#include 

// 結點結構體
typedef struct MinHeapNode {
    char data;
    struct MinHeapNode *left, *right;
} MinHeapNode;

// 解壓縮數據
void huffmanDecompression(char data[], MinHeapNode* root) {
    int n = strlen(data);
    MinHeapNode* current = root;
    
    for (int i = 0; i < n; ++i) {
        if (data[i] == '0') {
            current = current->left;
        } else {
            current = current->right;
        }

        if (current->left == NULL && current->right == NULL) {
            printf("%c", current->data);
            current = root;
        }
    }
}

int main() {
    // 構造Huffman樹
    MinHeapNode *root = (MinHeapNode*)malloc(sizeof(MinHeapNode));
    root->left = root->right = NULL;

    MinHeapNode *A = (MinHeapNode*)malloc(sizeof(MinHeapNode));
    A->data = 'A';
    A->left = A->right = NULL;

    MinHeapNode *B = (MinHeapNode*)malloc(sizeof(MinHeapNode));
    B->data = 'B';
    B->left = B->right = NULL;

    MinHeapNode *C = (MinHeapNode*)malloc(sizeof(MinHeapNode));
    C->data = 'C';
    C->left = C->right = NULL;

    root->left = A;
    root->right = B;
    A->left = C;
    A->right = NULL;
    B->left = B->right = NULL;
    C->left = C->right = NULL;

    // 待解壓縮的數據
    char data[] = "00100110001";

    // 解壓縮數據
    huffmanDecompression(data, root);
    
    return 0;
}

在這個簡單的示例代碼中,我們首先構建了一個簡單的Huffman樹,然后定義了一個待解壓縮的數據字符串。huffmanDecompression 函數接受壓縮后的數據和Huffman樹的根結點作為參數,通過逐位解析壓縮后的數據,按照Huffman樹逐步走到葉子結點,從而解壓縮出原始數據并打印。

在 main 函數中,我們構造了一個簡單的Huffman樹,并指定了一個簡單的待解壓縮的數據字符串,然后調用 huffmanDecompression 函數進行解壓縮操作。解壓縮過程中,輸出的字符序列應該是根據Huffman樹進行解碼后的原始數據。

需要注意的是,這個示例代碼中的Huffman樹和待解壓縮的數據都是固定的,實際應用中可能需要根據具體的壓縮數據和Huffman樹結構進行相應的解壓縮處理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4607

    瀏覽量

    92837
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62571
  • Huffman
    +關注

    關注

    0

    文章

    4

    瀏覽量

    6352

原文標題:Huffman算法壓縮解壓縮(C)

文章出處:【微信號:leezym0317,微信公眾號:FPGA開源工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【案例分享】經典的壓縮算法Huffman算法

    前兩天發布那個rsync算法后,想看看數據壓縮算法,知道一個經典的壓縮算法Huffman
    發表于 07-17 04:30

    STM32自定義USB設備開發詳細流程講解

    STM32自定義USB設備開發詳細流程講解及全套資料源碼下載
    發表于 08-03 09:50

    關于ADPCM壓縮算法流程介紹

    關于ADPCM壓縮算法流程介紹
    發表于 06-03 06:44

    視頻壓縮算法的特點和處理流程是怎樣的?

    在本文中,我們將著重探討視頻壓縮算法的特點和處理流程,我們將對基本的視頻壓縮算法進行解釋,包括靜態圖像
    發表于 06-08 06:49

    常用數據無損壓縮算法分析

    在數據采集和數據傳輸系統中常運用數據壓縮技術,數據壓縮通常可分為無損壓縮和有損壓縮兩種。結合常用數據無損壓縮
    發表于 12-23 10:17 ?0次下載

    多晶硅制備詳細流程及圖解

    多晶硅制備詳細流程
    發表于 01-10 16:18 ?66次下載
    多晶硅制備<b class='flag-5'>詳細流程</b>及圖解

    基于ADPCM的語音壓縮算法研究

    摘 要 ADPCM算法目前已成為很受用的語音壓縮算法之一。給出PCM概念。討論DPCM,DM,ADM與ADPCM的 壓縮算法原理以及
    發表于 04-08 11:20 ?84次下載

    基于0閾值的雙位圖壓縮_雙Huffman組合壓縮算法_許海英

    基于0閾值的雙位圖壓縮_雙Huffman組合壓縮算法_許海英
    發表于 03-19 11:31 ?0次下載

    JPEG圖像壓縮算法流程詳解

    在實際應用中,JPEG圖像編碼算法使用的大多是離散余弦變換、Huffman編碼、順序編碼模式。這樣的方式,被人們稱為JPEG的基本系統。這里介紹的JPEG編碼算法流程,也是針對基本系
    發表于 12-01 09:20 ?4.2w次閱讀
    JPEG圖像<b class='flag-5'>壓縮</b><b class='flag-5'>算法</b><b class='flag-5'>流程</b>詳解

    Huffman霍夫曼壓縮編碼算法實現分析

    哈夫曼編碼Huffman方法于1952年問世,迄今為止仍經久不衰,廣泛應用于各種數據壓縮技術中,且仍不失為熵編碼中的最佳編碼方法,deflate等壓縮算法也是結合了
    發表于 12-01 09:56 ?6943次閱讀

    PID程序算法詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是PID程序算法詳細資料概述免費下載
    發表于 07-24 08:00 ?36次下載

    壓縮感知的理論框架和應用的系統概述和信號重構算法研究

    本文對壓縮感知理論的理論框架和應用進行了系統概述。該理論針對稀疏信號,在對信號進行采樣的同時完成數據壓縮,從而大量節約了計算資源、存儲資源和傳輸資源。它包括信號的稀疏變換、觀測矩陣的設計和信號的重構
    發表于 12-18 17:21 ?8次下載
    <b class='flag-5'>壓縮</b>感知的理論框架和應用的系統<b class='flag-5'>概述</b>和信號重構<b class='flag-5'>算法</b>研究

    PE工具安裝的詳細流程詳細說明

    PE工具安裝的詳細流程詳細說明
    發表于 12-10 08:00 ?29次下載

    BOSHIDA DC電源模塊檢測穩定性能詳細流程

    BOSHIDA DC電源模塊檢測穩定性能詳細流程 DC電源模塊是電力電子產品中非常常見和重要的設備。它們被廣泛應用于各種公共場所和工業領域,如通信系統、計算機、工業自動化以及醫療設備等。為確保電源
    的頭像 發表于 06-30 11:08 ?612次閱讀
    BOSHIDA DC電源模塊檢測穩定性能<b class='flag-5'>詳細流程</b>

    自動售貨機MDB協議中文解析(七)MDB-RS232控制紙幣器的詳細流程和解析

    自動售貨機MDB協議中文解析(七)MDB-RS232控制紙幣器的詳細流程和解析
    的頭像 發表于 09-09 10:04 ?549次閱讀
    主站蜘蛛池模板: 99热这里精品| 老少配xxxxx欧美| 特黄特黄aaaa级毛片免费看| 97影院理论午夜伦不卡偷| 精品国产免费人成视频| 午夜熟女插插XX免费视频| 耽美肉文 高h失禁| 青青草国产自偷拍| 91综合久久久久婷婷| 久久精品国产亚洲AV未满十八| 小777论坛| 国产区免费在线观看| 我们中文在线观看免费完整版| 刺激一区仑乱| 日本人的xxxxxxxxx69| 波多野结衣的AV一区二区三区| 欧美 亚洲综合在线一区| 最近2019中文字幕MV免费看| 久久久久综合| 又粗又大又爽又黄的免费视频| 交换:年轻夫妇-HD中文字幕| 亚洲看片无码免费视频| 国产中文字幕乱码免费| 亚洲精品久久久久无码AV片软件| 国产精品免费大片一区二区| 视频一区视频二区在线观看| 高清国产免费观看视频在线| 日日夜夜噜噜| 国产成人精品男人免费| 我的漂亮朋友在线观看全集免费| 国产精品免费一区二区三区四区| 无码日本亚洲一区久久精品 | 东京热影院| 色婷婷AV国产精品欧美毛片| 国产99久久亚洲综合精品西瓜tv| 视频一区国产在线二区| 国产色精品久久人妻无码 | 99久久国产极品蜜臀AV酒店| 欧美黑大炮18p| 成人午夜精品无码区久久漫画日本| 日韩美一区二区|