1. 程式人生 > >用陣列實現哈夫曼編碼

用陣列實現哈夫曼編碼

昨天我們班了一場小型的c++資料結構考試,然後博主平時上課也算認真學了吧,但是課後卻沒有去及時鞏固,複習。有許多程式碼當時能敲出來,卻因為缺乏重複的練習,因此敲程式碼的速度特別慢,而且許多地方都有一些bug。導致昨天有個很簡單的huffman編碼的問題我都沒有解決。所以,今天我又花了一個小時的時間把這個題目再寫了一遍,雖然一個小時還是比較長,但是畢竟是我自己獨立完成的,沒有看任何之前的程式碼,我也算滿意了!

題目是這樣的,有一個字串,JAVAPROGRAMMING,希望你能夠用不等長的HUFFMAN編碼給它加密,最後得出它的WPL值。其實這道題目非常簡單,根據字母出現的頻率建立huffman樹,最後用葉子結點的權值乘上它的length值,最後求和即可得到答案。真的非常非常非常簡單!!!!!!!我是真的菜!!!!!!

最後貼上程式碼。因為在演算法方面我現在還沒有花時間,所以我的程式碼會有很多很多可以優化的地方,若有 有緣人看見我的程式碼,並且有任何建議,希望你能夠提出來,我會及時修改,感謝你!!!

#include <iostream>
#include <cstring>
using namespace std;

int findParent(int i,struct element huffman[],int n);
void huffmanTree(int w[],struct element huffman[],int n);
void findMin(int& i1,int& i2,struct element huffman[],int n);
struct element
{
    int parent;
    int lChild;
    int rChild;
    int weight;
};
int main()
{
    char str[20];
    cin >> str;
    int arr_big[27] = {0};
    int count = 0;
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < 27; j++)
        {
            if(str[i] == char('A' + j))
            {
                arr_big[j] += 1;
                if(arr_big[j] == 1)
                {
                    count++;//記錄一共出現了幾個字母!
                }
                break;
            }
        }
    }
    int count2 = 0;
    int arr_small[count] = {0};
    for(int i = 0; i < 27; i++)
    {
        if(arr_big[i] != 0)
        {
            arr_small[count2++] = arr_big[i];
        }
    }
    struct element huffman[2 * count - 1];
    huffmanTree(arr_small,huffman,count);
    int sum = 0;
    for(int i = 0;i < count;i++)
    {
        int length = 0;
        if(huffman[i].lChild == -1&&huffman[i].rChild == -1)
        {
            length = findParent(i,huffman,count);
            sum += length * huffman[i].weight;
        }
    }
    cout << sum;
    return 0;
}
void huffmanTree(int w[],struct element huffman[],int n)
{
    for(int i = 0; i < 2 * n - 1; i++)
    {
        huffman[i].parent = -1;
        huffman[i].lChild = -1;
        huffman[i].rChild = -1;
        huffman[i].weight = -1;
    }
    for(int i = 0; i < n; i++)
    {
        huffman[i].weight = w[i];
    }
    for(int i = n; i < 2 * n - 1; i++)
    {
        int i1,i2;
        findMin(i1,i2,huffman,n);
        huffman[i].lChild = i1;
        huffman[i].rChild = i2;
        huffman[i1].parent = i;
        huffman[i2].parent = i;
        huffman[i].weight = huffman[i1].weight + huffman[i2].weight;
    }
}
void findMin(int& i1,int& i2,struct element huffman[],int n)
{
    int min = 9999999;
    for(int i = 0; i < 2 * n - 1; i++)
    {
        if(huffman[i].weight == -1&&huffman[i].parent == -1)
        {
            break;
        }
        if(huffman[i].weight < min&&huffman[i].parent == -1)
        {
            min = huffman[i].weight;
            i1 = i;
        }
    }
    min = 999999;
    for(int i = 0; i < 2 * n - 1; i++)
    {
        if(huffman[i].weight == -1)
        {
            break;
        }
        if(huffman[i].weight < min&&i != i1&&huffman[i].parent == -1)
        {
            min = huffman[i].weight;
            i2 = i;
        }
    }
}
int findParent(int i,struct element huffman[],int n)
{
    int length = 0;
    if(huffman[i].parent == -1)
    {
        return 0;
    }
    length += (findParent(huffman[i].parent,huffman,n) + 1);
    return length;
}

相關推薦

陣列實現編碼

昨天我們班了一場小型的c++資料結構考試,然後博主平時上課也算認真學了吧,但是課後卻沒有去及時鞏固,複習。有許多程式碼當時能敲出來,卻因為缺乏重複的練習,因此敲程式碼的速度特別慢,而且許多地方都有一些bug。導致昨天有個很簡單的huffman編碼的問題我都沒有解決。所以,今天

java使用優先級隊列實現編碼

哈夫曼編碼 左右 integer string enc ash 小根堆 rac sta 思路: 構建小根堆 根據小根堆實現哈夫曼樹 根據哈夫曼樹對數據進行編碼 代碼實現如下: /** * @Author: DaleyZou * @Description: 使用jav

Java如何實現編碼

哈夫曼樹 既然是學習哈夫曼編碼,我們首先需要知道什麼是哈夫曼樹:給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。   哈夫曼編碼

C++實現編碼--使用編碼樹壓縮和解壓縮

      壓縮就是位域的操作,假設A對應0000,B對應1111,則AB壓縮後為00001111即為0x0F,AB原本為2個位元組,壓縮後變為1個位元組。其它資料類似一樣的壓縮操作即可。       解壓縮就是取出每一個位,如果是0,則走到哈夫曼編碼樹的左孩子,如果是1,

java使用優先順序佇列實現編碼

思路: 構建小根堆 根據小根堆實現哈夫曼樹 根據哈夫曼樹對資料進行編碼 程式碼實現如下: /** * @Author: DaleyZou * @Description: 使用java實現一個哈夫

Java實現編碼和解碼

題目:將一個字串進行哈夫曼編碼;編碼過程中,會得到每個字元的編碼,通過已知的每個字元的編碼對之前的編碼進行解碼。 分析: 首先是哈夫曼編碼演算法,引用李澤年寫的《多媒體技術教程》中對哈夫曼編碼演算法的描述: •Initialization: Put all symbols

c語言實現編碼

#include <stdio.h>#include <math.h>#define MAX 100#define MAXSYMBS 30#define MAXNODE 59#define DEEP 10 typedef struct{ float w

C++實現編碼--構建編碼

     哈夫曼編碼分為動態和靜態之分。靜態哈夫曼編碼需要統計和計算每個欄位的權重(比如文字'A'字母出現的次數),效率會很低,特別是壓縮大檔案,基本是不現實的。只是,理解靜態哈夫曼編碼是基礎,理解壓縮和解壓思想。     本文使所使用的演算法和構建思路跟我們通常的資料結構

java實現編碼

哈夫曼演算法 眾所周知,哈夫曼演算法適用於檔案壓縮領域。由於上機需要,就寫了一個Java程式碼實現。 哈夫曼演算法的內容 1.將帶有符號的字母儲存為葉子節點,其權值為符號出現的次數 2.從這些葉子結點中找到權值最小的兩個節點,然後將其合併成一個新節點

編碼(Huffman coding)的那些事,(編碼技術介紹和程序實現)

信號 truct 依次 while 交換 需要 .text 示例 system 前言   哈夫曼編碼(Huffman coding)是一種可變長的前綴碼。哈夫曼編碼使用的算法是David A. Huffman還是在MIT的學生時提出的,並且在1952年發表了名為《

編碼解碼 C++實現

錯誤 urn using 過程 簡單 cin n) struct ren 哈夫曼編碼是一個通過哈夫曼樹進行的一種編碼,一般情況下,以字符:‘0’與‘1’表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,這裏我們從每一個葉子結點開始向上遍歷,如果該結點為父節點的

轉載:樹的構造和編碼(C++代碼實現

作者 pos blank 字符 element start man null == 作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h>

資料結構————檔案壓縮(利用編碼實現

檔案壓縮原理: 首先檔案壓縮是通過HuffmaCode實現的、整體思路通過讀取檔案獲取字元出現頻率,通過字元出現頻率可以構建HuffmanTree,每個檔案中出現的字元通過HuffmanTree獲取HuffmanCode,從而將檔案中的字元同過HuffmanTree獲取相應編碼,並寫入壓

編碼實現(讀入檔案的形式)

#include<bits/stdc++.h> using namespace std; int w[30]; typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef

最小堆實現樹的構造及編碼、解碼

      以下程式的演算法思想主要來自於浙江大學陳越老師主編的資料結構一書。最大堆(最小堆思想差不多)(之後會寫一篇部落格介紹),這裡主要講講哈夫曼樹的定義及實現。 Huffman Tree 相關概念: 結點的路徑長度:從根結點到該結點的路徑上分支的數

Java理解實現樹以其編碼解碼

哈夫曼樹以其編碼解碼 要求: 1.從終端讀入字符集大小為n(即字元的個數),逐一輸入n個字元和相應的n個權值(即字元出現的頻度),建立哈夫曼樹,進行編碼並且輸出。 將它存於檔案hfmtree中(選做)。 2.利用已建好的哈夫曼編碼檔案hfmtree,對鍵盤輸入的正文進行譯碼。輸出字元正文

編碼實現文字壓縮和解壓(C++)

哈弗曼樹:又稱最優二叉樹,是帶權路徑長度最短的樹。 哈夫曼編碼:是一種字首編碼,即同一字符集中任何一個字元的編碼都不是另外一個字元編碼的字首(最左子串)。         在哈弗曼樹中,若用‘0’表示左子樹,‘1’表示右子樹,那麼每當從根遍歷到一個葉子節點時都會形成一個0

編碼實現檔案的壓縮和解壓

哈夫曼編碼的概念 哈夫曼編碼是基於哈夫曼樹實現的一種檔案壓縮方式。 哈夫曼樹:一種帶權路徑最短的最優二叉樹,每個葉子結點都有它的權值,離根節點越近,權值越小(根節點權值為0,往下隨深度增加依次加一),樹的帶權路徑等於各個葉子結點的數值與其權值的乘積和。哈夫曼樹如圖: 從圖中我們可以看出

資料結構之---C語言實現樹和編碼

//哈夫曼樹 //楊鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTr

【Matlab程式設計】編碼的Matlab實現

       在前年暑假的時候,用C實現了哈夫曼編譯碼的功能,見文章《哈夫曼樹及編譯碼》。不過在通訊模擬中,經常要使用到Matlab程式設計,所以為了方便起見,這裡用Matlab實現的哈夫曼編碼的功能