鱼C论坛

 找回密码
 立即注册
查看: 2341|回复: 9

希望大佬帮我看看这段C++代码,用文字进行描述一下如果可以的话再用python写一下感谢

[复制链接]
发表于 2022-3-28 21:57:57 | 显示全部楼层 |阅读模式
50鱼币

C .rar

199.19 KB, 下载次数: 18

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-29 07:13:39 From FishC Mobile | 显示全部楼层
为啥不直接发代码呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-29 09:06:21 | 显示全部楼层
wp231957 发表于 2022-3-29 07:13
为啥不直接发代码呢

#include<bits/stdc++.h>
using namespace std;
struct Node{
int val;
char ch;
int lson, rson;
// val 记录出现的频率
// ch 记录叶子结点对应的字符
// lson 和 rson 分别对应左右子树
Node(){}
Node(int val, char ch): val(val), ch(ch){
  lson = rson = 0;
}
}no[1000];
int cnt;

class MyPriorityQueue{
int arr[1000], cnt, siz;
public:
int top(){
  int ret = -1;
  for(int i = 1; i <= cnt; i++){
   if(arr[i] == -1) continue;
   if(ret == -1 || no[ret].val > no[i].val){
    ret = i;
   }
  }
  return ret;
}
// 返回一个val值最小的结点编号
int pop(){
  int t = top();
  for(int i = 1; i <= cnt; i++){
   if(arr[i] == t){
    arr[i] = -1;
    siz--;
   }
  }
}
// 删除pop出的结点
void push(int x){
  arr[++cnt] = x;
  siz++;
}
// 加入一个结点
int size(){
  return siz;
}
// 返回优先队列里面的结点个数
}pq;

int num[256];
// 记录每种字符出现的次数

map<char, string> bm;
// 存字符对应的编码

void dfs(int u, string ans){
if(!u) return;
if(no[u].lson == 0 && no[u].rson == 0){
  bm[no[u].ch] = ans;
  return;
}
dfs(no[u].lson, ans + "0");
dfs(no[u].rson, ans + "1");
}
// 在哈夫曼树上递归,算出叶子节点对应的编码

int main(){
string s, t = "";
cin >> s;

for(auto ch : s) num[ch]++;
// 统计每种字符出现次数

for(int i = 0; i < 256; i++){
  if(num[i]){
   no[++cnt] = Node(num[i], i);
   pq.push(cnt);
  }
}
// 先将每个结点放进优先队列

if(pq.size() == 1){
  no[++cnt].lson = pq.top(); pq.pop();
  pq.push(cnt);
}
// 特殊处理只有一种字符的情况

while(pq.size() != 1){
  cnt++;
  no[cnt].lson = pq.top(); pq.pop();
  no[cnt].rson = pq.top(); pq.pop();
  no[cnt].val = no[no[cnt].lson].val + no[no[cnt].rson].val;
  pq.push(cnt);
}
// 每次合并两个子树

dfs(pq.top(), "");
// 优先队列里面唯一的结点一定是哈夫曼树的根节点

for(auto P : bm){
  cout << P.first << " : " << P.second << endl;
}
// 输出每种字符以及对应的编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-29 09:07:35 | 显示全部楼层
Lijingyang 发表于 2022-3-29 09:06
#include
using namespace std;
struct Node{

第一次上传不去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-29 09:47:55 From FishC Mobile | 显示全部楼层
注解已经描述了啊,请问楼主想知道的是....?
C++ 和 Python 不同,虽说结果可以实现一致,但所用的方法也有差异的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-29 10:13:38 | 显示全部楼层
傻眼貓咪 发表于 2022-3-29 09:47
注解已经描述了啊,请问楼主想知道的是....?
C++ 和 Python 不同,虽说结果可以实现一致,但所用的方法也 ...

我没有学过C++所以看不太懂,那希望你可以用python帮我转化一下,可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-29 12:43:07 From FishC Mobile | 显示全部楼层
请问代码抄对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-29 14:40:20 | 显示全部楼层

S神马意思,哈哈哈,有点懵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-29 15:32:03 From FishC Mobile | 显示全部楼层
没有关系,但发现你的代码好像不对。arr[1000] 是数组,但是在 MyPriorityQueue::top() 函数里面 if(arr == -1) 用来和 -1 比较?
还有很多其它的问题...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-30 08:20:34 | 显示全部楼层
傻眼貓咪 发表于 2022-3-29 15:32
没有关系,但发现你的代码好像不对。arr[1000] 是数组,但是在 MyPriorityQueue::top() 函数里面 if(arr == ...

我就是将源代码复制过来了耶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 02:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表