当前位置: 首页 > news >正文

利用huffman树实现对文件A先编码后解码

利用huffman树实现对文件A先编码后解码,范围为ASCII码0-255的值,如何解决特殊符号问题是一个难点,注意应使用unsigned char存储数据,否则ASCII码128-255的值可能会出问题:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
const int N = 1e4;
using namespace std;
struct HuffmanNode
{int data;double weigh;int parent, lchild, rchild;
};
class HuffTree
{
private:vector<HuffmanNode>hufftree;map<int, vector<int>>eachcode;int n;//字符结点数
public:HuffTree() { hufftree.resize(0), n = 0; }void createHuffTree(vector<HuffmanNode>& leafs);~HuffTree();void GetCode(int c);//第i个符号的编码void SelectSmall(int& least, int& less, int i);void Decode(ifstream& is, ofstream& os);void geteachcode();string getcode(int ne);
};
void HuffTree::SelectSmall(int& least, int& less, int i)
{while ((hufftree[least].parent != -1 || hufftree[less].parent != -1)){if ((hufftree[least].parent != -1) || least == less)least++;if ((hufftree[less].parent != -1) || least == less) less++;}if (hufftree[least].weigh > hufftree[less].weigh)swap(least, less);for (int j = min(least, less); j < i; j++){if (j == least || j == less)continue;if (hufftree[j].parent == -1 && hufftree[j].weigh < hufftree[less].weigh){if (hufftree[j].weigh < hufftree[least].weigh){less = least;least = j;}else{less = j;}}}
}
void HuffTree::createHuffTree(vector<HuffmanNode>& leafs)
{n = leafs.size();hufftree.resize(2 * n - 1);for (int i = 0; i < n; i++){hufftree[i].data = leafs[i].data;hufftree[i].weigh = leafs[i].weigh;hufftree[i].lchild = hufftree[i].rchild = hufftree[i].parent = -1;}for (int i = n; i < 2 * n - 1; i++){int least = 0, less = 1;SelectSmall(least, less, i);hufftree[least].parent = hufftree[less].parent = i;hufftree[i].parent = -1;hufftree[i].lchild = least;hufftree[i].rchild = less;hufftree[i].weigh = hufftree[least].weigh + hufftree[less].weigh;}
}
void HuffTree::GetCode(int c)
{int i = 0;for (auto it = hufftree.begin(); it != hufftree.end(); it++){if (hufftree[i].data == c)break;i++;}if (i >= hufftree.size())return;int p = i;int parent = hufftree[i].parent;while (parent != -1){if (hufftree[parent].lchild == p)eachcode[c].insert(eachcode[c].begin(), 0);else eachcode[c].insert(eachcode[c].begin(), 1);p = parent;parent = hufftree[parent].parent;}
}
void HuffTree::geteachcode()
{for (auto it = eachcode.begin(); it != eachcode.end(); it++){cout << it->first << ":";for (int i = 0; i < it->second.size(); i++){cout << it->second[i];}cout << endl;}
}
string HuffTree::getcode(int ne)
{string res;for (int i = 0; i < eachcode[ne].size(); i++){res += to_string(eachcode[ne][i]);}return res;
}
void HuffTree::Decode(ifstream& is, ofstream& os)
{string target = "";int root = hufftree.size() - 1;int p = root;char c;while (is.get(c)){if (c == '0')p = hufftree[p].lchild;else p = hufftree[p].rchild;if (hufftree[p].lchild == -1 && hufftree[p].rchild == -1){unsigned char rchar=hufftree[p].data;os << rchar;p = root;}}
}
HuffTree::~HuffTree()
{}
int main()
{/*srand(time(0));ofstream out("random.txt");if (!out){cerr << "无法打开文件!" << endl;return 1;}for (int i = 0; i < N; i++){unsigned char rchar;rchar = rand() % 256;int data = rchar;out << rchar;}out.close();*/map<int, int>m;ifstream ifs_2("random.txt", ios::binary);char ch_1;while (ifs_2.get(reinterpret_cast<char&>(ch_1))){int data = static_cast<unsigned char>(ch_1);m[data]++;}ifs_2.close();map<int, double>m2;for (auto it = m.begin(); it != m.end(); it++){//m2[it->first] = static_cast<double>(it->second) / N;m2[it->first] = static_cast<double>(it->second);cout << it->first << "频率:" << m2[it->first] << endl;}HuffTree t;vector<HuffmanNode>leafs;leafs.resize(N);int i = 0;for (auto it = m2.begin(); it != m2.end(); it++){leafs[i].data = it->first;leafs[i].weigh = it->second;i++;}t.createHuffTree(leafs);for (int k = 0; k <= 255; k++){t.GetCode(k);}t.geteachcode();ifstream file("random.txt", ios::binary);string buf;char ch;ofstream os("B.txt", ios::binary);while (file.get(ch)){unsigned char uch = static_cast<unsigned char>(ch);int ne = uch;string is = t.getcode(ne);for (int i = 0; i < is.size(); i++){os << is[i];}}os.close();file.close();ofstream ofs("C.txt", ios::binary);ifstream ifs("B.txt", ios::binary);t.Decode(ifs, ofs);ofs.close();ifs.close();cout << "文件A与文件C的比较结果为: ";ifstream fileA("random.txt", ios::binary);ifstream fileC("C.txt", ios::binary);char bufA, bufC;while (fileA.get(bufA) && fileC.get(bufC)){if (bufA != bufC){cout << "不一致" << endl;return 0;}}cout << "一致" << endl;fileA.close();fileC.close();return 0;
}

相关文章:

利用huffman树实现对文件A先编码后解码

利用huffman树实现对文件A先编码后解码&#xff0c;范围为ASCII码0-255的值&#xff0c;如何解决特殊符号问题是一个难点&#xff0c;注意应使用unsigned char存储数据&#xff0c;否则ASCII码128-255的值可能会出问题&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #includ…...

第三十九章 基于VueCli自定义创建项目

目录 1. 选择创建模式 2. 选择需要的功能 3. 选择历史模式还是哈希模式 ​4.CSS预处理器 5. 选择ESLint规则 6. 开始创建项目 ​7. 自定义项目最终结构 1. 选择创建模式 输入创建的项目名&#xff0c;创建项目&#xff1a; 这里选择自定义模式&#xff1a; 2. 选择需要…...

网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施

在数字媒体时代&#xff0c;视频点播已成为用户获取信息和娱乐的重要方式。EasyPlayer.js作为一款流行的点播播放器&#xff0c;以其强大的功能和易用性受到广泛欢迎。然而&#xff0c;在使用过程中&#xff0c;用户可能会遇到视频地址无法播放的问题&#xff0c;这不仅影响用户…...

LLaMA-Factory学习笔记(1)——采用LORA对大模型进行SFT并采用vLLM部署的全流程

该博客是我根据自己学习过程中的思考与总结来写作的&#xff0c;由于初次学习&#xff0c;可能会有错误或者不足的地方&#xff0c;望批评与指正。 1. 安装 1.1 LLaMA-Factory安装 安装可以参考官方 readme &#xff08;https://github.com/hiyouga/LLaMA-Factory/blob/main/…...

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…...

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…...

战略共赢 软硬兼备|云途半导体与知从科技达成战略合作

2024年11月5日&#xff0c;江苏云途半导体有限公司&#xff08;以下简称“云途”或“云途半导体”&#xff09;与上海知从科技有限公司&#xff08;以下简称“知从科技”&#xff09;达成战略合作&#xff0c;共同推动智能汽车领域高端汽车电子应用的开发。 云途半导体与知从科…...

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…...

elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案

没有使用selectableRange 禁用时分秒&#xff0c;是因为他会禁止每天的时分秒。 我们需要解决的是当开始时间、结束时间是同一天时&#xff0c; 开始时间不能超过结束时间。 如果直接清空&#xff0c;用户体验不好。所以用watch监听赋值&#xff0c;当前操作谁&#xff0c;它不…...

Oracle 聚集因子factor clustering

文章目录 聚集因子(Factor clustering)举例说明查询聚集因子聚集因子的优化结论 最近发现突然忘记聚集因子的原理了&#xff0c;故整理记录一下 聚集因子(Factor clustering) 在Oracle中&#xff0c;聚集因子&#xff08;Clustering Factor&#xff09;用于衡量数据在表中存储…...

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的&#xff0c;但是这样存储是不是会更加消耗存储性能呢&#xff1f; 其实kafka的数据存储是追加形式的&#xff0c;也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的&#xff0c;这…...

云技术基础

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 https://space.bilibili.com/350329294* 为什么要学云技术&#xff1f; 无论是防御还是…...

字节序(Byte Order)

这里写自定义目录标题 有两种主要的字节序&#xff1a;字节序与平台字节序转换 字节序&#xff08;Byte Order&#xff09;是指数据在内存中存储时字节的排列顺序。由于不同的计算机体系结构可能采用不同的字节序&#xff0c;因此理解字节序非常重要&#xff0c;特别是在处理多…...

融云:社交泛娱乐出海机会尚存,跨境电商异军突起

近年来&#xff0c;直播、语聊房、游戏社区&#xff0c;这些中国网友熟悉的网络社交形式&#xff0c;正在海外市场爆发出新的生命力。无论是被炒到几百人民币一个的 Clubhouse 邀请码&#xff0c;还是先后登顶中东下载榜的 Yalla、JACO&#xff0c;这些快速掀起体验浪潮的社交娱…...

django博客项目实现站内搜索功能

Django博客站内搜索功能实现 1. 准备工作 确保Django项目已经创建好&#xff0c;并且有一个用于存储博客文章的模型&#xff08;例如Post&#xff09;。 2. 定义搜索表单 在应用目录下创建一个forms.py文件&#xff0c;定义一个搜索表单。 from django import formsclass …...

蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片&#xff1a; 【问题描述】 小蓝有很多数字卡片&#xff0c;每张卡片上都是一个数字&#xff08;0到9&#xff09;。 小蓝…...

Android 延时操作的常用方法

一、简介 在Android开发中我们可能会有延时执行某个操作的需求&#xff0c;例如我们启动应用的时候&#xff0c;一开始呈现的是引导页面&#xff0c;3秒后进入主界面&#xff0c;这就是一个延时操作。还有一种是执行某些接口任务时&#xff0c;需要有超时机制。下面介绍常用的…...

AI驱动的轻量级笔记应用Blinko

什么是 Blinko &#xff1f; Blinko 是一个创新的开源项目&#xff0c;专为想要快速捕捉和整理瞬间想法的个人而设计。Blinko 允许用户在灵感迸发的瞬间无缝记录想法&#xff0c;确保不会错过任何创意火花。 Blinko 的设计初衷是让笔记记录变得更简单&#xff0c;让用户专注于内…...

一文搞懂 UML 类图

面向对象设计 主要就是使用UML的类图&#xff0c;类图用于描述系统中所包含的类以及它们之间的相互关系&#xff0c;帮助人们简化对系统的理解&#xff0c;它是系统分析和设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据 一、UML类图简介 统一建模语言 UML …...

Zabbix 7 最新版本安装 Rocky Linux 8

前言 本实验主要在Rocky Linux 中安装Zabbix&#xff0c;其他centos8、Debian、Ubuntu、Alma Linux都可以安装&#xff0c;就是在中间件有点不同。Nginx就要配置一下&#xff0c;官网给的教程也算是很规范的&#xff0c;就是在MySQL上要自己安装&#xff0c;他没有告诉我们&am…...

亚马逊Buy for Me代购服务全流程实测:从下单到收货的5个关键步骤

亚马逊Buy for Me代购服务实战手册&#xff1a;从零开始的安全跨境购物指南 跨境购物早已不是新鲜事&#xff0c;但每次打开海外电商网站时&#xff0c;那些"仅限本地销售"的提示依然让人头疼。去年冬天&#xff0c;我为了给家人买一款日本限定的保温杯&#xff0c;辗…...

离职见人品:软件测试工程师如何优雅交接,为职业生涯赋能

在职业旅程的每一次转折点&#xff0c;如何“结束”与如何“开始”同等重要。对于软件测试工程师而言&#xff0c;离职远非简单地提交代码、归还电脑那么简单。它更像是一次对个人职业素养、专业精神和人脉网络的集中检阅。一次专业、周到、负责任的交接&#xff0c;不仅能确保…...

libiec61850开源库核心功能完全实战指南:从协议解析到电力系统通信应用

libiec61850开源库核心功能完全实战指南&#xff1a;从协议解析到电力系统通信应用 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 …...

Agent--多轮对话系统设计6道高频考题解析

去年面试某大厂AI岗位&#xff0c;多轮对话这块被追问了好几道题&#xff0c;有些问题当时答得磕磕绊绊&#xff0c;回来后我把相关知识点重新梳理了一遍。这次复盘把面试中遇到的核心问题分享出来&#xff0c;希望对准备面试的同学有点帮助。真题现场&#xff1a; 面试刚开始&…...

告别重复劳动:用快马平台生成你的专属工作流自动化agent

今天想和大家分享一个提升工作效率的小技巧——用自动化agent框架处理那些重复又繁琐的工作流程。作为一个经常要组织会议的程序员&#xff0c;我发现自己每天要花大量时间做同样的事情&#xff1a;从聊天记录里提取会议信息、手动创建日历事件、再给参会人发邮件通知。直到发现…...

测试右移的复仇:上线后bug如何让公司赔光融资

当质量防线在“最后一公里”失守在软件交付的终点线前&#xff0c;测试团队常被一种“虚假的安全感”所笼罩。测试环境用例全绿&#xff0c;性能压测数据达标&#xff0c;验收报告签字盖章&#xff0c;一切似乎都指向一个平稳的上线。然而&#xff0c;当代码被部署到生产环境&a…...

5步打造高效工作流:Super Productivity开源工具新手实战指南

5步打造高效工作流&#xff1a;Super Productivity开源工具新手实战指南 【免费下载链接】super-productivity Super Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitL…...

OpenClaw技能市场巡礼:Top5适合Phi-3-vision-128k-instruct的图文处理插件

OpenClaw技能市场巡礼&#xff1a;Top5适合Phi-3-vision-128k-instruct的图文处理插件 1. 为什么需要为多模态模型搭配专用技能&#xff1f; 去年我在尝试用OpenClaw处理一批产品截图时&#xff0c;发现一个有趣现象&#xff1a;当我把图片直接丢给普通文本模型时&#xff0c…...

别再买错卡了!手把手教你用Arduino Uno和MFRC522模块DIY智能门禁(附完整代码和避坑指南)

从零搭建Arduino RFID门禁&#xff1a;硬件选购、代码优化与避坑全指南 第一次接触Arduino和RFID技术时&#xff0c;我被琳琅满目的硬件选择和复杂的代码搞得晕头转向。特别是当兴冲冲买回一堆组件后&#xff0c;发现卡片根本无法被识别——原来是因为忽略了频率匹配这个关键细…...

Git 批量拉取所有远程分支到本地(Git Bash + CMD 双版本)

在使用 Git 开发时&#xff0c;经常需要将远程所有分支一次性拉取到本地&#xff0c;避免手动逐个创建。下面分别给出 Git Bash 和 Windows CMD 下的一键批量拉取脚本。一、Git Bash 脚本&#xff08;适用于 Git Bash / Linux /macOS&#xff09;bash运行git fetch originfor b…...