1003 entropy encoder

本文介绍了一种基于哈夫曼树实现的数据压缩方法,通过去除消息中的冗余信息达到高效编码的目的。针对英文字符集,该算法通过构建最优哈夫曼树来降低高频字符的二进制表示长度,从而减少整体的二进制位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1003 Problem D

An entropy encoder is a data encoding method that achieves lossless data compression by encoding a message with “wasted” or “extra” information removed.

题意:对于一串字符,让使用频率高的二进制表示尽可能小,最终使得表示这串字符的二进制数最少。

思路:对于英文字母的编码就是求最优树,哈夫曼树每次让权值最小的树结合,得到新的节点,再利用新得到的权值,去计算下一个最小权值,最终让所有权值结合成一棵树,即得到最优树,以此来编码。

感想:权值的记录,以及左右兄弟的组合是问题关键,处理好此处,问题自然可解。

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

struct str{

    int l,r,c;

}tree[64];

int f[60];

int k;

string s;

void hefuman(int n,int p){

     if(f[n]==0) return ;

     if(n<=26) k+=f[n]*p;

     else{

       hefuman(tree[n].l,++p);

       hefuman(tree[n].r,p);

     }

}

int main(){

   int i,j,left,right;

   while(cin>>s){

       if(s=="END") break;

       int len=s.length();

       for(i=0;i<=60;i++) tree[i].c=-1;

       memset(f,0,sizeof(f));

       for(i=0;i<len;i++){       //统计字符个数

           if(s[i]=='_') f[26]++;

           else  f[s[i]-'A']++;

       }

       int node=26;

       while(1){

           int min=1000;

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

                if(tree[i].c==-1){

                   if(min>f[i]&&f[i]){

                        min=f[i];

                        left=i;

                    }

                }

           }

           min=1000;

           for(j=0;j<=node;j++){

                if(tree[j].c==-1){

                    if(min>f[j]&&j!=left&&f[j]){

                        min=f[j];

                        right=j;

                    }

                }

           }

           if(min==1000) break;

           f[++node]=f[left]+f[right];

           tree[node].l=left;

           tree[node].r=right;

           tree[node].c=-1;

           tree[left].c=node;

           tree[right].c=node;

       }

       k=0;

       if(node==26)  k=len;

       else hefuman(node,0);

       len*=8;

       printf("%d %d %.1f\n",len,k,len*1.0/k);

    }

   return 0;

 

}

### Mage Encoder 使用方法及文档 #### 1. 安装依赖库 为了使用 MAGE (MAsk Generative Encoder),首先需要安装必要的 Python 库。根据官方开源项目教程[^1],可以按照以下命令来设置环境: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 pip install git+https://gitcode.com/gh_mirrors/mage/mage.git@main ``` #### 2. 数据准备 MAGE 支持多种输入形式的数据集处理方式。通常情况下,图像数据会被转换成张量格式并进行预处理。对于特定任务,可能还需要额外的标注信息。 #### 3. 初始化模型 初始化 MAGE 模型可以通过调用 `mage.model.MAGE` 类完成。此过程涉及配置参数的选择以及加载预训练权重(如果适用)。下面是一个简单的实例化代码片段: ```python from mage import MAGE, get_config config = get_config('path/to/config.yaml') # 加载配置文件 model = MAGE(config) ``` #### 4. 训练与评估 一旦模型被成功创建,在给定的数据集上执行训练循环即可开始学习过程。这一步骤同样遵循标准的 PyTorch 实践模式,即定义损失函数、优化器,并迭代更新网络参数直到收敛为止。 ```python import torch.optim as optim optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.CrossEntropyLoss() for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch {epoch + 1}, Loss: {running_loss / len(trainloader)}') ``` #### 5. 推理应用 经过充分训练后的 MAGE 可用于各种下游任务,比如表征学习和图像合成等。此时只需传入待预测样本至已保存的最佳状态下的模型中即可获得输出结果。 ```python checkpoint = torch.load('best_model.pth') model.load_state_dict(checkpoint['state_dict']) with torch.no_grad(): predictions = model(test_input) ``` #### 6. 融合编码器集成 考虑到多模态应用场景的需求,还可以考虑引入 fusion encoder 来增强跨模态间的特征交互效果[^2]。具体实现时可以在原有架构基础上加入自注意力机制或交叉注意力层以促进不同来源的信息交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值