计算Huffman平均编码长度

您所在的位置:网站首页 平均编码长度怎么算 计算Huffman平均编码长度

计算Huffman平均编码长度

2024-07-17 07:46| 来源: 网络整理| 查看: 265

题目:输入:

第一行为一个整数,表示输入数据中有n种字符

第2~n+1行为n个整数,表示每个字符出现的次数

输出:Huffman编码的平均长度(保留两位小数)

代码:

#include

#include

#include

using namespace std;

struct HuffmanNode {

    int weight; // 权重,出现的次数或者频率

    char ch; // 存储符号

    string code; // 存储该符号对应的编码

    int leftChild, rightChild, parent; // 左、右孩子,父结点

};

class HuffmanCode {

public:

    HuffmanCode(string str); // 构造函数

    ~HuffmanCode(); // 析构函数

    void getMin(int& first, int& second, int parent); // 选取两个较小的元素

    void Merge(int first, int second, int parent); // 合并

    void Encode(); // 编码:利用哈夫曼编码原理对数据进行加密

    

private:

    HuffmanNode* HuffmanTree; // 数组

    int leafSize; // 统计不同字符的个数

    double average;//记录编码平均长度

};

// 构造函数

HuffmanCode::HuffmanCode(string str) {

    int len = (int)str.size(); // 字符串的长度

    int arr[256], i; // 存储字符串各个字符的个数

    HuffmanTree = new HuffmanNode[256]; // 动态分配空间

    // 1.初始化HuffmanTree数组

    for (i = 0; i < (2 * len - 1); i++) { // 叶子结点为len,则树最多有2*len-1个结点

        HuffmanTree[i].leftChild = HuffmanTree[i].rightChild = HuffmanTree[i].parent = -1;

        HuffmanTree[i].code = "";

    }

    // 2.统计输入的字符串的各个字符出现的个数

    memset(arr, 0, sizeof(arr)); // 清零

    for (i = 0; i < len; i++) // 统计次数

        arr[str[i]]++; // str[i] -> 转成对应的ASCII码,如'0'->48

    leafSize = 0; // 出现不同字符的个数

    for (i = 0; i < 256; i++) {

        if (arr[i] != 0) { // 有出现的字符

            // cout



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3