武汉理工大学数据结构实验—哈夫曼树压缩图片

武汉理工大学数据结构综合实验——二叉树与赫夫曼图片压缩 文章目录实验目的一、实验要求二、分析与设计1.数据结构的设计2.核心算法设计生成Huffman树的算法生成Huffman编码的算法压缩编码的算法3.测试用例设计4.测试效果总结 实验目的 1. 掌握树的存储结构 2. 掌握二叉树的三种遍历方法 3. 掌握 Huffman 树、Huffman 编码等知识和应用 4. 使用 C++、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。 以下是本篇文章正文内容,下面案例可供参考 一、实验要求 针对一幅 BMP 格式的图片文件,统计 2. 阅读详情
AI摘要

本文介绍了一种基于霍夫曼编码的文件压缩算法实现,包括霍夫曼树的构建、编码过程、文件读写及压缩率计算。通过具体代码示例展示了如何对文件进行高效压缩。

Compress.h

#ifndef COMPRESS_H
#define COMPRESS_H
int Compress(const char* pFilename);
char Str2byte(const char* pBinStr);
int Encode(const char* pFilename, const HuffmanCode pHC, char* pBuffer, const int nSize);

struct HEAD
{
	char type[4];//文件类型
	int length;//原文件长度
	int weight[256];//权值数值
};
int WriteFile(const char* pFilename, const HEAD sHead, const char* pBuffer, const int nSize);
int InitHead(const char* pFilename, HEAD& sHead);
#endif

Huffman.h

#ifndef HUFFMAN_H
#define HUFFMAN_H
#define OK 1
#define SIZE 256
struct HTNode {
	int weight;//权值
	int parent;//父节点
	int lchild;//左孩子
	int rchild;//右孩子
};
typedef HTNode* HuffmanTree;//动态分配数组存储Huffman树
typedef char** HuffmanCode;//动态分配哈夫曼编码表


//void PreorderTraverse(int root, HuffmanTree pHT);
int HuffmanCoding(HuffmanCode& pHC, HuffmanTree& pHT);
int Select(HuffmanTree pHT, int nSize);
void TestHufTree(HuffmanTree pHT);
void TestHufCode(int root, HuffmanTree pHT, HuffmanCode pHC);
void TestHufTreeN(int root, HuffmanTree pHT);

int HfmTree(HuffmanTree& pHT, int* w, int n);

#endif

Compress.cpp

#include"huffman.h"
#include"Compress.h"
#include<iostream>
#pragma warning( disable : 4996)
using namespace std;
//Compress
//InitHead
//Encode
//Str2byte
//WriteFile
char Str2byte(const char* pBinStr)
{
	char b = 0x00;
	for (int i = 0; i < 8; i++)
	{
		b = b << 1;
		if (pBinStr[i] == '1')
		{
			b = b | 0x01;
		}
	}
	return b;
}

int Compress(const char* pFilename)
{
	int weight[256] = { 0 };
	//以二进制打开文件
	FILE* in = fopen(pFilename, "rb");
	if (in == NULL)
	{
		cout << "Failed to open the file!" << endl;
		exit(0);
	}
	cout << "成功打开文件 " << pFilename << endl;
	int ch;
	while ((ch = getc(in)) != EOF)
	{
		weight[ch]++;
	}
	fclose(in);
	//cout << "Byte Weight" << endl;
	//for (int i = 0; i < SIZE; i++)
	//{
	//    printf("0x%02X %d\n", i, weight[i]);
	//}

	HuffmanTree hfmt;
	HfmTree(hfmt, weight, SIZE);
	cout << "成功生成哈夫曼树" << endl;
	//    TestHufTree(hfmt);
		//    TestHufTreeN(511, hfmt);
	HuffmanCode hfmc = (HuffmanCode)malloc((SIZE + 1) * sizeof(char*));
	//    for (int i = 1; i <= SIZE; i++)
	//        hfmt[i].weight = weight[i - 1]
		//根据哈夫曼树进行编码
	HuffmanCoding(hfmc, hfmt);
	cout << "成功完成哈夫曼编码" << endl;
	//    cout << "先序遍历哈夫曼树输出编码信息:" << endl;
	//    TestHufCode(2 * SIZE - 1, hfmt, hfmc);//测试哈夫曼编码
	//    cout << "压缩后的文件编码:" << endl;

		//计算编码缓冲区大小
	int nSize = 0;
	for (int i = 0; i < 256; i++)
	{
		nSize += weight[i] * strlen(hfmc[i + 1]);
	}
	nSize = (nSize % 8) ? nSize / 8 + 1 : nSize / 8;

	//    cout <<"nSize = "<<nSize << endl << endl;

		//对原文件进行压缩编码
	char* pBuffer = NULL;
	pBuffer = (char*)malloc(nSize * sizeof(char));
	memset(pBuffer, 0, (nSize) * sizeof(char));
	//    cout << "begin: " << strlen(pBuffer) << endl;
	////    cout << "----";
	//    int n;
	//    cout << "input n:";
	//    cin >> n;
		//将编码写入缓冲区
	Encode(pFilename, hfmc, pBuffer, nSize);
	//    cout << "after: " << strlen(pBuffer) << endl;
	//    cout << "len of puf  = " << strlen(pBuffer) << endl;
	//    cout << "!pBuffer = " << !pBuffer << endl;
	if (!pBuffer)
	{
		cout << "!pBuffer = " << !pBuffer << endl;
		return -1;
	}
	cout << "\n压缩完毕" << endl;
	//for (int i = 1; i < strlen(pBuffer); i++)
	//{
	//    printf("%d", pBuffer[i]);
	//}

	HEAD sHead;
	InitHead(pFilename, sHead);
	cout << "原文件" << pFilename << "大小为:" << sHead.length << "Byte" << endl;
	int len_after = WriteFile(pFilename, sHead, pBuffer, nSize);
	cout << "大小为:" << len_after << "Byte \n头文件sHead大小为:" << sizeof(sHead) << "Byte" << endl;
	cout << "压缩比率:" << (double)len_after * 100 / sHead.length << "%" << endl;
	free(hfmt);
	free(hfmc);
	free(pBuffer);
	return OK;
}


int Encode(const char* pFilename, const HuffmanCode pHC, char* pBuffer, const int nSize)
{
	//开辟缓冲区
//    cout << "+++++";
	FILE* in = fopen(pFilename, "rb");
	if (in == NULL)
	{
		cout << "Failed to open the file!" << endl;
		exit(0);
	}
	pBuffer = (char*)malloc(nSize * sizeof(char));
	if (!pBuffer)
	{
		cerr << "开辟缓冲区失败" << endl;
		return -1;
	}
	cout << "loading";
	int sign = 0;//用于控制小数点输出
	char cd[SIZE] = { 0 };//工作区
	int pos = 0;//缓冲区指针
	int ch;
	//扫描文件,根据huffmman编码表对其进行压缩,压缩结果暂存到缓冲区中
	while ((ch = getc(in)) != EOF)
	{
		if (sign % 1000 == 1)
			printf(".");
		sign++;
		strcat(cd, pHC[ch + 1]);//从HC复制编码串到cd


		//打印压缩后的文件编码
//        printf("%s", pHC[ch + 1]);


		//压缩编码
		while (strlen(cd) >= 8)
		{
			//截取字符串左边的8个字符,编码成字节
			pBuffer[pos++] = Str2byte(cd);
			//字符串整体左移8个字节
			for (int i = 0; i < SIZE - 8; i++)
			{
				cd[i] = cd[i + 8];
			}
		}
	}
	if (strlen(cd) > 0)
	{
		pBuffer[pos++] = Str2byte(cd);
	}
	fclose(in);
	//for (int i = 1; i < nSize; i++)
	//{
	//    printf("%d ", pBuffer[i]);
	//}
//    cout << endl<<"before: " << strlen(pBuffer) << endl;
	return OK;
}

int InitHead(const char* pFilename, HEAD& sHead)
{
	//初始化文件头
	strcpy(sHead.type, "HUF");//文件类型
	sHead.length = 0;//原文件长度
	for (int i = 0; i < SIZE; i++)
	{
		sHead.weight[i] = 0;
	}
	FILE* in = fopen(pFilename, "rb");
	int ch;
	while ((ch = fgetc(in)) != EOF)
	{
		sHead.weight[ch]++;
		sHead.length++;
	}
	fclose(in);
	in = NULL;
	return OK;
}

int WriteFile(const char* pFilename, const HEAD sHead, const char* pBuffer, const int nSize)
{
	//生成文件名
	char filename[256] = { 0 };
	strcpy(filename, pFilename);
	strcat(filename, ".huf");
	//以二进制流形式打开文件
	FILE* out = fopen(filename, "wb");
	//写文件头
	fwrite(&sHead, sizeof(char), 1, out);
	//写压缩后的编码
	fwrite(pBuffer, sizeof(char), nSize, out);
	//关闭文件,释放文件指针
	fclose(out);
	out = NULL;
	cout << "生成压缩文件:" << filename << endl;
	int len = sizeof(HEAD) + strlen(pFilename) + 1 + nSize;
	return len;
}

Huffman.cpp

#include<iostream>
#include<cstring>
#include"huffman.h"
#pragma warning( disable : 4996)
using namespace std;
/*
void PreorderTraverse(int root, HuffmanTree pHT)
{
	cout << pHT[root].weight << " ";//访问节点
	if (pHT[root].lchild)//左孩子
	{
		PreorderTraverse(pHT[root].lchild, pHT);
	}
	if (pHT[root].rchild)//右孩子
	{
		PreorderTraverse(pHT[root].rchild, pHT);
	}
}
*/
int HuffmanCoding(HuffmanCode& pHC, HuffmanTree& pHT)
{
	//    pHC = (HuffmanCode)malloc((SIZE + 1) * sizeof(char*));
		//无栈非递归遍历 
	char cd[SIZE] = { '\0' };//记录访问路径
	int cdlen = 0;//记录当前路径长度
	for (int i = 1; i < 512; i++)
	{
		pHT[i].weight = 0;//遍历 Huffman树时用作节点的状态标志
	}

	int p = 2 * SIZE - 1;//根节点
	while (p != 0)
	{
		if (pHT[p].weight == 0)//向左
		{
			pHT[p].weight = 1;
			if (pHT[p].lchild != 0)
			{
				p = pHT[p].lchild;
				cd[cdlen++] = '0';
			}
			else if (pHT[p].rchild == 0)//登记叶子节点的字符编码
			{
				pHC[p] = (char*)malloc((cdlen + 1) * sizeof(char));
				cd[cdlen] = '\0';
				strcpy(pHC[p], cd);//复制编码
			}
		}
		else if (pHT[p].weight == 1)//向右
		{
			pHT[p].weight = 2;
			if (pHT[p].rchild != 0)//右孩子为叶子节点
			{
				p = pHT[p].rchild;
				cd[cdlen++] = '1';
			}
		}
		else
		{
			//退回父节点,编码长度减1
			pHT[p].weight = 0;
			p = pHT[p].parent;
			--cdlen;
		}
		//        printf("*");
	}
	return OK;
}

int Select(HuffmanTree pHT, int nSize)
{
	int minValue = 0x7FFFFFFF;//最小值
	int min = 0;
	//找到最小权值的元素序号
	for (int i = 1; i <= nSize; i++)
	{
		if (pHT[i].parent == 0 && pHT[i].weight < minValue)
		{
			minValue = pHT[i].weight;
			min = i;
		}
	}
	return min;
}

void TestHufTree(HuffmanTree pHT)
{
	for (int i = 1; i < 2 * SIZE; i++)
	{
		printf("pHT[%d]\t%d\t%d\t%d\t%d\n", i, pHT[i].weight, pHT[i].parent, pHT[i].lchild, pHT[i].rchild);
	}
}

int HfmTree(HuffmanTree& pHT, int* w, int n)
{
	int m = 2 * n - 1;
	pHT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
	if (!pHT)
	{
		cerr << "内存分配失败! " << endl;
		return -1;
	}
	//初始化树
	HuffmanTree p = pHT + 1;//0号单元不使用
	for (int i = 0; i < m; i++)
	{
		p->weight = (i < n) ? w[i] : 0;
		p->parent = 0;
		p->lchild = 0;
		p->rchild = 0;
		p++;
	}
	for (int i = n + 1; i <= m; i++)
	{
		//第一个最小元素
		int s1 = Select(pHT, i - 1);//找出前i-1个中最小元素
		pHT[s1].parent = i;

		//第二个最小元素
		int s2 = Select(pHT, i - 1);
		pHT[s2].parent = i;

		pHT[i].weight = pHT[s1].weight + pHT[s2].weight;
		pHT[i].lchild = s1;
		pHT[i].rchild = s2;
	}
	return 0;
}

void TestHufCode(int root, HuffmanTree pHT, HuffmanCode pHC)
{
	if (pHT[root].lchild == 0 && pHT[root].rchild == 0)
	{
		printf("0x%02X %s\n", root - 1, pHC[root]);
	}
	if (pHT[root].lchild)//访问左孩子
	{
		TestHufCode(pHT[root].lchild, pHT, pHC);
	}
	if (pHT[root].rchild)
	{
		TestHufCode(pHT[root].rchild, pHT, pHC);
	}
}

void TestHufTreeN(int root, HuffmanTree pHT)
{
	cout << pHT[root].weight << "\t" << pHT[root].lchild << "\t" << pHT[root].rchild << "\t" << pHT[root].parent << "\n";
	if (pHT[root].lchild != 0)
	{
		TestHufTreeN(pHT[root].lchild, pHT);
	}
	if (pHT[root].rchild != 0)
	{
		TestHufTreeN(pHT[root].rchild, pHT);
	}
}

main.cpp

#include"huffman.h"
#include"Compress.h"
#include<iostream>
#include<cstdlib>
using namespace std;
#pragma warning( disable : 4996)

int main()
{
	cout << "= = = = = = = =Huffman 文件压缩= = = = = = = =" << endl;
	cout << "请输入文件名:";
	char filename[256];
	cin >> filename;
	Compress(filename);


	//    system("pause");
	return 0;
}
哈夫曼编码实现图片压缩与解压 整体思路: 读原文件,获得权值列表,生成哈夫曼树,遍历树生成哈夫曼编码。 写入压缩文件,后缀.huf,先写入文件头(包括文件类型,权值列表,文件长度,以便于从压缩文件中再次生成哈夫曼编码来解压,也可以用其他的方式,比如直接将哈夫曼编码以先序遍历的方式写入压缩文件的开始,代码中有体现)。 将原文件编码后写入压缩文件。 读取压缩文件,生成哈夫曼树,每次读取到0则向左子树移动,读取到1向右子树移动,直到遇到叶子结点,将叶子结点存储的编码写入解压文件。 值得注意的的是,权值数组的运作。图片文件按二进制读取,一. 阅读详情

相关推荐

数据结构 - 哈夫曼树及哈夫曼编码:压缩、解压

什么是哈夫曼树? 哈夫曼树(Huffman Tree):给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,这样的二叉树也称为最优二叉树 一棵带权二叉树: 这里有几个概念: 路径:从一个结点到另一个结点经过的所有结点为两结点间的路径,如上图结点A到结点8的路径为:A-B-C-D-8 路径长度:树中一个结点到另一个结点的经过的边数,A到结点8的路径长度为4 权值:对于树的结点,可以定义一个有某种意义的数值为权重值 如结点为商品,我们就可以设置权值为商品价格,权值

key_768的博客 2122

数据结构与算法综合实验(一)之二叉树与哈夫曼图片压缩

实验内容 1、创建工程。 2、读取源文件。 3、生成哈夫曼树。 4、生成哈夫曼编码。 5、压缩原文件。 6、保存压缩文件。 7、扩展功能。 实验代码参考:https://blog.youkuaiyun.com/cxh_1231/article/details/80530668 main.cpp 主函数 #include "iostream" #include "file.h" #include"Huffman...

有机盐的博客 3654

基于哈夫曼编码的图像压缩算法实现

哈夫曼编码是一种常用的压缩编码算法,采用变长码编码,属于无损压缩算法的一种,它可以将一组符号编码成对应的二进制编码,使得编码后的数据具有最短的码长,也叫霍夫曼编码。在图像压缩中,哈夫曼编码可以被用来表示像素信息,从而实现对图像的压缩。 具体来说,哈夫曼编码的基本思路是将出现频率较高的符号用较短的编码表示,而出现频率较低的符号则用较长的编码表示。对于图像数据,我们可以将出现频率较高的像素值编码为较短的码字,而对于出现频率较低的像素值,则编码为较长的码字。

qq_60737285的博客 5250

[数据结构与算法综合实验]二叉树与哈夫曼图片压缩

哈夫曼编码 (Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码 (VLC) 的一种。Huffman 于 1952 年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做 Huffman 编码(有时也称为霍夫曼编码)。

春天熊的技术博客 4912

哈夫曼图片压缩

构建哈夫曼树,哈夫曼编码,实现图片压缩

哈夫曼树实现图片压缩与解压

功能要求 1. 针对一幅BMP格式的图片文件,统计256种不同字节的重复次数,以每种字节重复次数作为权值,构造一颗有256个叶子节点的哈夫曼二叉树。 2. 利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。 3. 压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如pic.bmp 压缩后pic.bmp.huf 4. 解压缩

【数据结构与算法综合实验】二叉树与赫夫曼图片压缩实践

说明:这是武汉理工大学计算机学院数据结构与算法综合实验课程的第一次项目:二叉树与赫夫曼图片压缩实践代码。 源码下载地址:点击此处下载本次实验项目(运行环境:VS2017) 关注微信公众号【知行校园汇】可免费下载全部源码。 纸上得来终觉浅,绝知此事要躬行。 实验教材: 任务列表: 阶段 工作内容 交付物 ...

拾年之璐 1万+

武汉理工大学计算机数据结构与算法实验一——二叉树与哈夫曼图片压缩

1.实验目的 通过“图片压缩编码”的编程实践,学习树、遍历二叉树、哈夫曼树、哈夫曼编码和他们的编程应用。 (1)掌握树的存储结构 (2)掌握二叉树的三种遍历方法 (3)掌握并理解Huffman树、Huffman编码等知识和应用 (4)掌握文件的操作 (5)使用Huffman算法实现图像压缩程序 2.实验内容 使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩。图片文件名为“Pic.bmp”,压缩后保存为“Pic.bmp.huf”文件。使用VS2010作为开发工具,开发一个控制台程序,使用Huffman压缩算法对图片文件“Pic.bmp”进行压缩。具体要求如下: (1)读取原文件,统计权值: 运行程序,输入文件名。 以“Pic.bmp”文件为例。若文件存放在F盘根目录下,输入文件完整路径“F:\Pic.bmp”。按回车结束。以字节流的方式,只读打“Pic.bmp”文件。 逐字节读取文件,统计文件中256种字节重复的次数,保存到一个数组中int weight[256]中。 (2)生成Huffman树 根据(1)中统计的结果,构建Huffman树。定义一个结构体来记录每个节点的权值、父节点、左孩子和右孩子。使用结构体数组来存储这个Huffman树。 (3)生成Huffman编码 遍历(2)中生成的Huffman树,记录256个叶子节点的Huffman编码,保存在字符串数组中。 (4)压缩原文件 使用Huffman编码对原文件中的字节重新编码,获得压缩后的文件数据。 (5)保存压缩文件 将编码过的数据,保存到文件“Pic.bmp.huf”中。

软工专硕考研_18武汉理工大学软工专硕考研经验分享(学渣版)

本帖最后由 清泉流响 于 2018-4-10 08:14 编辑2018年4月9号上午9.43分地点:江苏昆山在做的事情:上班摸鱼,2018考研已经告一段落,本着吃水不忘挖井人的理念,特此将学渣版本经验贴,哦不也许是教训帖(经验贴有大佬发了),继续做下去。写在前面:我并不是高分录取的大佬,甚至最后选导都因为自己飞机晚点所以导致当时没有选到导师,直到昨天学院分配之后,这一年的考研生涯才算正式结束。但是...

weixin_39729840的博客 947

代码复现——SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架

根据《SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs》(《SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架》)论文思路,简单复现代码,以实现SymAgent中的Agent-Planner和Agent-Executor模块。Agent-Planner利用大语言模型的归纳推理能力从知识图谱中提取符号规则,指导高效的问题分解。

qq_60040306的博客 1607

ROS2_IGH方案配置(二)——Ubuntu22.04 实时内核性能验证与调优

本文详细介绍了在Ubuntu22.04系统上配置ROS2_IGH方案时,如何验证和调优PREEMPT_RT实时内核性能。通过使用cyclictest工具进行基准测试和压力测试,分析中断与硬件延迟,并优化内核参数,确保系统满足工业控制领域对硬实时性的苛刻要求。文章还提供了针对ROS2的特殊优化建议和性能监控方案,帮助开发者实现毫秒级延迟的稳定控制。

weixin_30791095的博客 224

图像压缩编码(哈夫曼树)

1.首先图片压缩编码对不同文件的压缩效率是不一样的      这也是我在最后发现自己的压缩比率超高(类似于未压缩)发现的。多次确认算法无误后终于在以为大佬的博客中找到了答案。此处感谢下面这位大佬的博客。 哈夫曼编码压缩解压缩实现&amp;不同类型文件压缩比的测试 https://blog.youkuaiyun.com/to_be_better/article/details/50431352   ...

qq_42794545的博客 6320

【NAS for PVE _04】安装TrueNAS

前篇说到如何调试 Proxmox VE 8.2 为安装虚拟机做准备,本篇主要讲述如何在 Proxmox VE 上安装 TrueNAS 系统,并开启NFS供其他系统挂载使用官网下载好TrueNAS系统镜像。

村口王师傅。 6146

图像压缩之哈夫曼编码

1.基本概念 (1).路径:一棵树中,从一个结点到另一个结点所经过的所有结点,称为两个结点之间的路径,如上图,G到B的路径为G->F->B。 (2).路径长度:从一个结点到另一个结点所经过的“边”的数量称为两个结点之间的路径长度。如上图,G到B的路径为G->F->B经过两条边,故路径长度为2 (3).结点的带权路径长度:指树的根结点到该结点的路径长度与该结点权重的乘积。如上图:结点B的带权路径长度为 2x15=30 (4).树的带权路径长度:指一棵树中,所有叶子结点的带权路径长度.

机器人视觉感知 6570

080、多轴运动控制:插补器设计(螺旋线插补)

本文分享了螺旋线插补器设计的实战经验。针对五轴点胶机Z轴抖动问题,作者分析了螺旋线数学本质,提出基于归一化时间参数的速度规划方法,强调各轴严格同步的重要性。文章详细介绍了速度分解、加减速处理、嵌入式优化技巧(查表法、定点化),并总结了起点闭合、速度波动、数值处理等常见问题解决方案。最后给出5条实用建议:注重速度规划而非纯数学推导、预先仿真、保留调试接口、考虑机械谐振、防范编码器丢脉冲。通过优化插补周期、电子齿轮比和S形速度曲线,成功将设备良率从60%提升至95%。

m0_50546716的博客 87

【C语言趣味教程】(0) 专栏介绍

这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过

有道无术, 术尚可求。有术无道, 止于术。 2万+

哈夫曼树和哈夫曼编码应用之图片压缩编码c++实现

本人正在学习数据结构,在前几天做了压缩图片的项目,感觉到有必要分享给大家。因此今天我就分享给大家c语言数据结构有关哈夫曼树压缩图片的项目实现。   一:下面先介绍有关的知识: 1.背景 压缩软件是用特定算法压缩数据的工具,压缩后的文件称为压缩包,可以对其进行解压。那么为什么要用到压缩软件呢?我们都知道,文件是用编码进行存储的,编码要用到字节,而不可避免的一个文件中会出现很多重复的字节,用压缩...

ITxiaoangzai的博客 1万+

AI上推荐 之 多任务loss优化(自适应权重篇)

1. 写在前面 在多任务学习中,往往会将多个相关的任务放在一起来学习。例如在推荐系统中,排序模型同时预估候选的点击率和浏览时间。相对于单任务学习,多任务学习有以下优势: 多个任务共享一个模型,占用内存量减少; 多个任务一次前向计算得出结果,推理速度增加; 关联任务通过共享信息,相互补充,可以提升彼此的表现。 前面的一篇文章,主要是从模型结构的角度聊了下多任务学习,介绍了工业界非常经典也常用的MMOE模型,然而,对于多任务学习, Loss的优化也非常重要, 因为我们知道通过多个目标去指导网络进行统一的训练

Miracle8070 1万+

Huffman树压缩和解压文件

Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树; ②选择两个根结点值最小的二叉树,构造一个新的二叉树,直至剩一个树为止。 Huffman树的存储(静态三叉链,n为叶子结点个数) Huffman编码 前缀编码:对每一个字符规定一个0,1串作为其代码,并要...

qq_41891805的博客 675

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 838

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分析。Impedance是时域阻抗曲线,也是最主要的观测指标,注意:impedance曲线的时间刻度不是延时,延时=时间刻度/2,因为TDR测量的是用一来一回的原理去测量的。Use Lossy peeling 默认不勾选,勾选的话代表同时仿真无损和有损方案,不勾选代表仅仿真有损方案。

weixin_54787054的博客 857

数据结构专题实验6——哈夫曼树的应用(图片解压缩)(C++实现)

软件工程专业本科,数据结构学期实训第一期,此系列旨在分享和讲解本人写过的项目代码,方便各位朋友们学习,以求共同进步。

qq_60545192的博客 1669

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android图片压缩原理分析(三)—— 哈夫曼压缩讲解

查阅源码后发现:在Android系统在7.0版本之前内部使用的是libjpeg非turbo版,并且为了性能关闭了Huffman编码计算,使用默认的哈夫曼表,而不是算数编码。从Android 7.0版本开始,系统内部使用了libjpeg-turbo库并且启用Huffman编码,标示就是optimize_code已经设置为了TRUE,也就是默认使用Huffman压缩计算生成新的哈夫曼表。libjpeg-turbo是一个C语音编写的高效JPEG图像处理库,相当于是一个libjpeg的增强版。

hirezy 2473

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

哈夫曼树实现文件压缩

最近在学了哈夫曼树之后,作为练习,写了一个文件压缩的小项目; 在这里和大家分享一下;主要实现思路: 利用哈夫曼树的特性对字符进行哈夫曼编码,其中运用到了最小堆;利用最小堆的特性,找出构造哈夫曼树的结点;统计文件字符出现的次数,本质是利用字符出现的次数进行构造哈夫曼树; 然后通过遍历哈夫曼树获取哈夫曼编码;配置文件的主要内容:字符,字符出现次数,哈夫曼编码 当解压缩时可以利用配置文件中的内容构造出

John的博客 5484

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

哈夫曼图片压缩及解压

哈夫曼图片压缩及解压 文件 功能 Huffman 哈夫曼编码 compress 解压 //Compress.h #ifndef COMPRESS_H #define COMPRESS_H typedef unsigned char * buffer; int Compress(const char *pFilename); unsigned char Str2by...

dongken9651的博客 3791
上一篇: C++中的模板及其特化相关知识(详细完整)
下一篇: 优快云博客如何升级!冲就完事了!
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值