基础算法之Huffman编码

news2024/11/19 16:48:20
// Type your code here, or load an example.
#include<iostream>
#include<string>
#include<queue>
#include <unordered_map>
#include <vector>

using namespace std;

//树节点结构
struct Node
{
    char ch;
    int freq;
    Node *left;
    Node *right;
    Node(char ch, int freq) : ch(ch), freq(freq), left(nullptr), right(nullptr) 
    {

    };
    Node(char ch, int freq, Node* left, Node* right) : ch(ch), freq(freq), left(left), right(right) 
    {

    };


};

//比较函数,用于优先队列
struct Compare
{
    bool operator()(Node * l,Node * r)
    {
        return l->freq > r->freq;
    }
};

//遍历HUffman树,存储编码
void encode(Node * root,string str,unordered_map<char,string> &huffmanCode)
{
    if(root==nullptr)
    {
        return;

    }
    //既没有左子节点又没有右子节点
    if(!root->left && !root->right)
    {
        huffmanCode[root->ch] = str;
    }
    //二叉树分支,左边是0,右边是1
    //二叉树末端节点是编码
    encode(root->left,str+'0',huffmanCode);
    encode(root->right,str+'1',huffmanCode);
}

//构建Huffman树,并返回根节点
Node* buildHuffmanTree(string text)
{
    //将字符串中字符按照频率出现次数进行统计
    unordered_map<char, int> freq;
    for (char ch : text) {
        freq[ch]++;
    }

    //使用优先队列,构建Huffman树
    //Node* 表示元素类型
    //vector<Node*>使用底层容器,作为队列
    //比较函数对象,用于确定队列中元素的顺序
    priority_queue<Node*, vector<Node*>, Compare> pq;
    for (auto pair : freq) {
        pq.push(new Node(pair.first, pair.second));
    }

    while (pq.size() != 1) {
        Node *left = pq.top(); pq.pop();
        Node *right = pq.top(); pq.pop();
        int sum = left->freq + right->freq;
        pq.push(new Node('\0', sum, left, right));
    }

    return pq.top();
}

int main() {
    string text="AAAAABCD";
    cout << "输入一个字符串: ";
    //getline(cin, text);

    Node* root = buildHuffmanTree(text);
    unordered_map<char, string> huffmanCode;
    encode(root, "", huffmanCode);

    string strEncoded;
    for (char ch : text) {
        strEncoded += huffmanCode[ch];
    }

    cout << "ASCII编码长度: " << text.length() * 8 << " bits\n";
    cout << "Huffman编码长度: " << strEncoded.length() << " bits\n";
    cout << "压缩比: " << (text.length() * 8.0 / strEncoded.length()) << "\n";

    return 0;
}

在这里插入图片描述

1举例子

当然,我将根据提供的代码逐步解释如何为例子中的字符串 “beep boop beer!” 构建Huffman树并返回根节点。我们按照代码中的步骤来操作。

首先,我们需要统计字符串中每个字符的频率。在我们的例子中,字符频率如下:

  • ‘b’: 3
  • ‘e’: 5
  • ‘p’: 2
  • ‘o’: 2
  • ’ ': 2 (空格字符)
  • ‘r’: 1
  • ‘!’: 1

代码中的 buildHuffmanTree 函数负责构建Huffman树。下面是函数中的关键步骤:

  1. 统计频率:
    这一步通过遍历整个字符串并使用一个哈希表(unordered_map<char, int>)来计算每个字符的出现次数。

  2. 创建初始节点:
    对于每个唯一字符,我们创建一个新的 Node,包含字符(ch)和频率(freq)。这些节点被加入到优先队列(priority_queue)中,该队列使用自定义的比较函数 Compare 对节点进行排序,以确保频率最低的节点位于队列的顶部。

  3. 构建树:
    然后,我们进入一个循环,直到优先队列中只剩下一个节点为止。在每次循环中,我们执行以下操作:<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】(一)从绪论到各种线性表

目录 一、绪论Introduction 1、数据结构 2、逻辑结构&#xff08;数据元素之间的相互关系&#xff09; 3、物理结构&#xff08;数据逻辑结构在计算机中的存储形式&#xff09; 4、数据类型&#xff08;一组性质相同的值的集合及定义在此集合上的一些操作的总称&#xff09…

幻兽帕鲁服务器多少钱?2024年Palworld游戏主机费用

幻兽帕鲁服务器多少钱&#xff1f;价格便宜&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;4核32G配置113元1个月、339元3个月&#xff1b;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例 题目438&#xff1a;找到字符串中所有字母异位词 说明&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字…

Java基础—面向对象OOP—18三大特性:封装、继承与多态

由于本身理解还不是很到位&#xff0c;所以写的很绕&#xff0c;后续待补充优化 1、封装&#xff08;底层&#xff09;&#xff1a;该露的露&#xff0c;该藏的藏 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉低耦合&#xff1a;仅暴露少量的方…

休息日的思考与额外题——链表

文章目录 前言链表知识点 一、 92. 反转链表 II二、21. 合并两个有序链表总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷题班&#xff0c;训练…

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; SAO-CNN-BiLSTM-Attention雪消融优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 雪消融优化器( SAO) 是受自然界中雪的升华和融化行为的启发&#xff0c;开发了一种…

Linux true/false区分

bash的数值代表和其它代表相反&#xff1a;0表示true&#xff1b;非0代表false。 #!/bin/sh PIDFILE"pid"# truenginx进程运行 falsenginx进程未运行 checkRunning(){# -f true表示普通文件if [ -f "$PIDFILE" ]; then# -z 字符串长度为0trueif [ -z &qu…

shell脚本——条件语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…

IP关联是什么?有什么后果?如何防止电商账号因IP关联被封?

在跨境电商的世界里&#xff0c;IP关联给多账号运营的商家带来了挑战。比如&#xff0c;亚马逊IP关联规则的执行对于那些经营多个店铺的卖家来说可能是一个不小的障碍。IP关联的影响不只是限于亚马逊&#xff0c;其他平台如Instagram、Facebook也有类似的机制&#xff0c;在之前…

Note-归一化层和前向源码

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 目录 简介BN层计算过程参数说明验证问题:bn层前面的cov不需要bia的原因 LN层计算过程参数说明验证问题:transfomer用LN而不是BN的原因 简介 深度学习中常见的归一化层包括批量归一化&#xff08;Batch Norma…

应急响应-流量分析

在应急响应中&#xff0c;有时需要用到流量分析工具&#xff0c;。当需要看到内部流量的具体情况时&#xff0c;就需要我们对网络通信进行抓包&#xff0c;并对数据包进行过滤分析&#xff0c;最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…

Redis面试(二)

1.Redis集群了解吗 前面说到了主从同步存在高可用和分布式问题&#xff0c;哨兵机制解决了高可用问题&#xff0c;而集群就是终极方案&#xff0c;一举解决高可用 和分布式问题。 1.数据分区&#xff1a;数据分区或称数据分片是集群最核心的功能&#xff0c;集群将数据分散到…

【人工智能】鲁滨逊归结原理-Python实现

一、实验目的 了解鲁滨逊归结算法原理&#xff0c;利用Python编写程序&#xff0c;实现鲁滨逊归结算法。 二、实验原理 鲁滨逊归结原理又称为消解原理&#xff0c;是鲁滨逊提出的一种证明子句集不可满足性&#xff0c;从而实现定理证明的一种理论及方法。它是机器定理证明的基…

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

任务修复实例(1)

实例1 任务名&#xff1a;增强防御&#xff08;quest_template.id 8490&#xff09; 涉及的两个数据表分别为 smart_script 和 creature_summon_groups smart_script Reactstate 取值参考源码 UnitDefines.h 的 ReactStates 定义&#xff0c;其中&#xff1a;0为被动&#…

第18章_JDK8-17新特性(下)(新语法结构,API的变化,其它结构变化,小结与展望)

文章目录 第18章_JDK8-17新特性&#xff08;下&#xff09;6. 新语法结构6.1 Java的REPL工具&#xff1a; jShell命令6.2 异常处理之try-catch资源关闭6.3 局部变量类型推断6.4 instanceof的模式匹配6.5 switch表达式6.6 文本块6.7 Record6.8 密封类 7. API的变化7.1 Optional类…

[docker] Docker镜像的创建以及Dockerfile的使用

一、Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/bash …

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成&#xff08;Docker 三要素&#xff09; 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …

03 Verilog HDL 语法

Verilog HDL&#xff08;Hardware Description Language&#xff09;是在 C 语言的基础上发展起来的一种硬件描述语言&#xff08;用它可以表示逻辑电路图、逻辑表达式、数字逻辑系统所完成的逻辑功能等&#xff09;具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间…

Edius 9.0 下载安装教程,附安装包和工具,轻松解决软件安装

前言 Edius是一款非线性视频编辑软件&#xff0c;它可以帮助用户快速编辑一切&#xff0c;支持更多格式、更多分辨率而无需等待&#xff0c;无论是纪录片还是4K影视制作&#xff0c;软件都能很好的驾驭&#xff0c;是用户最喜欢的后期制作专业工具。 准备工作 1、Win7及以上…