国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

哈夫曼編碼

等長(zhǎng)編碼:占的位置一樣

變長(zhǎng)編碼(不等長(zhǎng)編碼):經(jīng)常使用的編碼比較短,不常用的比較短

最優(yōu):總長(zhǎng)度最短

最優(yōu)的要求:占用空間盡可能短,不占用多余空間,且不能有二義性

這里給出哈夫曼二叉樹(shù)的實(shí)現(xiàn):

HuffmanTree.h:

#pragma once

template <typename T>
class HuffmanTree {
public:
    HuffmanTree(int nCount, T* InData, int* InWeight);
private:
    typedef struct _HuffNode {
        T tValue;
        int weight;
        int n_lChild;
        int n_rChild;
        int n_Father;
    }Tree, *pTree;
    pTree m_pTreeRoot;
    int nTreeCount;
public:
    void show();
    void HuffmanCode(char** &InHuffmanCode,int nCount);
private:
    void select(int nCount, int* SmallValueA_Index, int* SmallValueB_Index);
};

template<typename T>
inline HuffmanTree<T>::HuffmanTree(int nCount, T * InData, int* InWeight)
{
    nTreeCount = 2 * nCount;
    m_pTreeRoot = (pTree)calloc(nTreeCount + 1, sizeof(Tree));
    for (size_t i = 1; i <= nCount; i++) {
        m_pTreeRoot[i].tValue = InData[i-1];
        m_pTreeRoot[i].weight = InWeight[i-1];
    }
    for (size_t i = nCount + 1; i < nTreeCount; i++) {
        int SmallValueA_Index;
        int SmallValueB_Index;
        select(i - 1, &SmallValueA_Index, &SmallValueB_Index);
        m_pTreeRoot[SmallValueA_Index].n_Father = i;
        m_pTreeRoot[SmallValueB_Index].n_Father = i;
        m_pTreeRoot[i].n_lChild = SmallValueA_Index;
        m_pTreeRoot[i].n_rChild = SmallValueB_Index;
        m_pTreeRoot[i].weight = m_pTreeRoot[SmallValueA_Index].weight + m_pTreeRoot[SmallValueB_Index].weight;
        m_pTreeRoot[i].tValue = '0';
    }

}

template<typename T>
inline void HuffmanTree<T>::show()
{
    std::cout << "Index" << "   " << "Value" << "   " << "weight" << "   " << "ParentIndex" << "   " << "lChild" << "   " << "rChild" << "   " << std::endl;
    for (size_t i = 1; i < nTreeCount; i++) {
        printf("%-5.0d   %-5c   %-6d   %-11d   %-6d    %-6d\r\n", i, m_pTreeRoot[i].tValue, m_pTreeRoot[i].weight, m_pTreeRoot[i].n_Father, m_pTreeRoot[i].n_lChild, m_pTreeRoot[i].n_rChild); 
    }
}

template<typename T>
inline void HuffmanTree<T>::HuffmanCode(char **& InHuffmanCode, int nCount)
{
    InHuffmanCode = (char**)malloc(sizeof(char*)*(nCount + 1));
    char* code = (char*)malloc(nCount);
    code[nCount-1] = '\0';
    for (size_t i = 1; i <= nCount; i++) {
        int cha = i;
        int parent = m_pTreeRoot[i].n_Father;
        int start = nCount - 1;
        while (parent) {
            if (m_pTreeRoot[parent].n_lChild == cha) {
                code[--start] = '0';
            }
            else {
                code[--start] = '1';
            }
            cha = parent;
            parent = m_pTreeRoot[parent].n_Father;
        }
        InHuffmanCode[i] = (char*)malloc(nCount - start);
        strcpy(InHuffmanCode[i], &code[start]);
    }
}



template<typename T>
inline void HuffmanTree<T>::select(int nCount, int * SmallValueA_Index, int * SmallValueB_Index)
{
    int nMin;
    for (size_t i = 1; i < nCount; i++) {
        if (m_pTreeRoot[i].n_Father == 0) {
            nMin = i;
            break;
        }
    }
    for (size_t i = nMin + 1; i <= nCount; i++) {
        if (m_pTreeRoot[i].n_Father == 0 && m_pTreeRoot[i].weight < m_pTreeRoot[nMin].weight) {
            nMin = i;
        }
    }
    *SmallValueA_Index = nMin;
    for (size_t i = 1; i <= nCount; i++)
    {
        if (m_pTreeRoot[i].n_Father == 0 && i != *SmallValueA_Index)
        {
            nMin = i;
            break;
        }
    }
    for (size_t i = nMin + 1; i <= nCount; i++)
    {
        if (m_pTreeRoot[i].n_Father == 0 && m_pTreeRoot[i].weight < m_pTreeRoot[nMin].weight &&  i != *SmallValueA_Index)
        {
            nMin = i;
        }
    }
    *SmallValueB_Index = nMin;
}

測(cè)試數(shù)據(jù)(主函數(shù)):

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include "HuffmanTree.h"

int main() {
	char a[] = { 'A','B','C','D','E','F' };
	int b[] = { 5,32,18,7,25,13 };
	HuffmanTree<char> arr(6, a, b);
	arr.show();
	char** HuffmanCode = nullptr;
	arr.HuffmanCode(HuffmanCode,6);
	std::cout << "編碼值:" << std::endl;
	for (size_t i = 1; i <= 6; i++)
	{
		printf("  %c:   %s\n",a[i-1],HuffmanCode[i]);
	}
	return 0;
}

運(yùn)行結(jié)果截圖:
【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu)與算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),二叉樹(shù)
如果發(fā)現(xiàn)文章中有錯(cuò)誤,還請(qǐng)大家指出來(lái),我會(huì)非常虛心地學(xué)習(xí),我們一起進(jìn)步?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-586015.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)與算法】哈夫曼編碼(最優(yōu)二叉樹(shù)實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)與哈夫曼編碼

    數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)與哈夫曼編碼

    編碼是信息處理的基礎(chǔ)(重新表示信息)。 普通的編碼是等長(zhǎng)編碼,例如7位的ASCIL編碼,對(duì)出現(xiàn)頻率不同的字符都使用相同的編碼長(zhǎng)度。 但其在傳輸和存儲(chǔ)等情況下編碼效率不高 。 可使用不等長(zhǎng)編碼,來(lái)壓縮編碼:高頻字符編碼長(zhǎng)度更短,低頻字符編碼長(zhǎng)度更長(zhǎng)。 ? [例

    2023年04月15日
    瀏覽(41)
  • 數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)和哈夫曼編碼

    數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)和哈夫曼編碼

    切入正題之前,我們先了解幾個(gè)概念: 路徑:從樹(shù)的一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)分支所構(gòu)成的路線 路徑長(zhǎng)度:路徑上的分支數(shù)目 樹(shù)的路徑長(zhǎng)度:從根結(jié)點(diǎn)出發(fā)到每個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和 帶權(quán)路徑長(zhǎng)度:該結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長(zhǎng)度乘以該結(jié)點(diǎn)的權(quán)值 樹(shù)的帶權(quán)路徑長(zhǎng)度:樹(shù)中所有

    2024年02月11日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)課程實(shí)驗(yàn)五:哈夫曼樹(shù)與哈夫曼編碼

    實(shí)驗(yàn)日期:2022-12-20 ? 目錄 一、實(shí)驗(yàn)?zāi)康?1、掌握哈夫曼樹(shù)的建立 2、掌握哈夫曼編碼方式 二、實(shí)驗(yàn)內(nèi)容

    2024年02月05日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】實(shí)驗(yàn)十:哈夫曼編碼

    【數(shù)據(jù)結(jié)構(gòu)】實(shí)驗(yàn)十:哈夫曼編碼

    實(shí)驗(yàn)十?哈夫曼編碼 一、實(shí)驗(yàn)?zāi)康呐c要求 1 )掌握樹(shù)、森林與二叉樹(shù)的轉(zhuǎn)換; 2 )掌握哈夫曼樹(shù)和哈夫曼編碼算法的實(shí)現(xiàn); 二、?實(shí)驗(yàn)內(nèi)容 1.? 請(qǐng)編程實(shí)現(xiàn)如圖所示的樹(shù)轉(zhuǎn)化為二叉樹(shù)。 2.? 編程實(shí)現(xiàn)一個(gè)哈夫曼編碼系統(tǒng),系統(tǒng)功能包括: (1)? 字符信息統(tǒng)計(jì):讀取待編碼的源文

    2024年02月15日
    瀏覽(19)
  • (數(shù)據(jù)結(jié)構(gòu))哈夫曼編碼實(shí)現(xiàn)(C語(yǔ)言)

    哈夫曼的編碼:從一堆數(shù)組當(dāng)中取出來(lái)最小的兩個(gè)值,按照左下右大的進(jìn)行繪制,將兩個(gè)權(quán)值之和,放入隊(duì)列當(dāng)中,然后再進(jìn)行取出兩個(gè)小的,以此類(lèi)推,直到全部結(jié)束,在根據(jù)圖根節(jié)點(diǎn),到葉子節(jié)點(diǎn),每一個(gè)分支來(lái)得出編碼,向左0,向右1,即可得到一個(gè)結(jié)果。

    2024年02月16日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)--哈夫曼編碼(C語(yǔ)言版)】

    【數(shù)據(jù)結(jié)構(gòu)--哈夫曼編碼(C語(yǔ)言版)】

    哈夫曼樹(shù) 介紹哈夫曼樹(shù)前先介紹下面幾個(gè)名詞: 1. 結(jié)點(diǎn)的路徑長(zhǎng)度 l 從根結(jié)點(diǎn)到該結(jié)點(diǎn)的路徑上分支的數(shù)目 ,如下圖結(jié)點(diǎn) a 的 l = 3 。 2. 樹(shù)的路徑長(zhǎng)度 樹(shù)中所有葉子結(jié)點(diǎn)的路徑長(zhǎng)度之和 ,如下圖該樹(shù)的路徑長(zhǎng)度為 2 + 3 + 3 + 2 + 2 。 3. 結(jié)點(diǎn)的權(quán) w 給每一個(gè)結(jié)點(diǎn)賦予一個(gè)新的數(shù)

    2024年02月04日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu) 實(shí)驗(yàn)17:Huffman樹(shù)和Huffman編碼——學(xué)習(xí)理解哈夫曼樹(shù)

    數(shù)據(jù)結(jié)構(gòu) 實(shí)驗(yàn)17:Huffman樹(shù)和Huffman編碼——學(xué)習(xí)理解哈夫曼樹(shù)

    目錄 前言 實(shí)驗(yàn)要求 算法描述 個(gè)人想法 代碼實(shí)現(xiàn)和思路、知識(shí)點(diǎn)講解 知識(shí)點(diǎn)講解 文件傳輸 Huffman樹(shù)的存儲(chǔ) Huffman的構(gòu)造 ?Huffman編碼 編碼和譯碼 代碼實(shí)現(xiàn) 文件寫(xiě)入和輸出 Huffman樹(shù)初始化 構(gòu)造Huffman樹(shù) 求帶權(quán)路徑長(zhǎng)度 Huffman編碼 Huffman譯碼 結(jié)束 代碼測(cè)試 測(cè)試結(jié)果 利用Huffman編

    2024年02月03日
    瀏覽(40)
  • 數(shù)據(jù)結(jié)構(gòu)與算法--哈夫曼樹(shù)應(yīng)用

    第1關(guān):統(tǒng)計(jì)報(bào)文中各個(gè)字符出現(xiàn)的次數(shù) 任務(wù)描述 本關(guān)任務(wù): 給定一串文本,統(tǒng)計(jì)其中各個(gè)字符出現(xiàn)的次數(shù); 測(cè)試說(shuō)明 平臺(tái)會(huì)對(duì)你編寫(xiě)的代碼進(jìn)行測(cè)試: 測(cè)試輸入:` abcdeabcdeabcdabcdabcdabcbccc 預(yù)期輸出: a 6 b 7 c 9 d 5 e 2 代碼: 第2關(guān):對(duì)第一關(guān)報(bào)文中的各個(gè)字符進(jìn)行哈夫曼編

    2024年02月06日
    瀏覽(22)
  • 【算法數(shù)據(jù)結(jié)構(gòu)系列】哈夫曼樹(shù)進(jìn)階解讀

    作者:半身風(fēng)雪 簡(jiǎn)介:移動(dòng)開(kāi)發(fā)全棧領(lǐng)域工作者

    2024年02月10日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之(赫夫曼樹(shù),哈夫曼樹(shù),壓縮軟件)

    數(shù)據(jù)結(jié)構(gòu)與算法之(赫夫曼樹(shù),哈夫曼樹(shù),壓縮軟件)

    一:思考 ? ? ? ? 1.電報(bào)發(fā)送:二戰(zhàn)的時(shí)候大家都知道那時(shí)候普遍會(huì)應(yīng)用電報(bào),如果讓你來(lái)設(shè)計(jì)一個(gè)電報(bào)的發(fā)送編碼你該如何設(shè)計(jì)呢? ????????2.壓縮算法:給你10000個(gè)字符(每個(gè)字符1btye,也就是8bit)的文件,你怎么存儲(chǔ)可以盡可能的節(jié)省空間呢? ????????我相信大

    2024年02月09日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包