Lijingyang 发表于 2022-3-28 21:57:57

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

wp231957 发表于 2022-3-29 07:13:39

为啥不直接发代码呢

Lijingyang 发表于 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;
int cnt;

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

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

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

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

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

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

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

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

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

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

for(auto P : bm){
cout << P.first << " : " << P.second << endl;
}
// 输出每种字符以及对应的编码

Lijingyang 发表于 2022-3-29 09:07:35

Lijingyang 发表于 2022-3-29 09:06
#include
using namespace std;
struct Node{


第一次上传不去{:7_113:}

傻眼貓咪 发表于 2022-3-29 09:47:55

注解已经描述了啊,请问楼主想知道的是....?
C++ 和 Python 不同,虽说结果可以实现一致,但所用的方法也有差异的。{:10_254:}

Lijingyang 发表于 2022-3-29 10:13:38

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

我没有学过C++所以看不太懂,那希望你可以用python帮我转化一下,可以吗

傻眼貓咪 发表于 2022-3-29 12:43:07

请问代码抄对吗?

Lijingyang 发表于 2022-3-29 14:40:20

傻眼貓咪 发表于 2022-3-29 12:43
请问代码抄对吗?

S神马意思,哈哈哈,有点懵

傻眼貓咪 发表于 2022-3-29 15:32:03

没有关系,但发现你的代码好像不对。arr 是数组,但是在 MyPriorityQueue::top() 函数里面 if(arr == -1) 用来和 -1 比较?
还有很多其它的问题...

Lijingyang 发表于 2022-3-30 08:20:34

傻眼貓咪 发表于 2022-3-29 15:32
没有关系,但发现你的代码好像不对。arr 是数组,但是在 MyPriorityQueue::top() 函数里面 if(arr == ...

我就是将源代码复制过来了耶{:5_99:}
页: [1]
查看完整版本: 希望大佬帮我看看这段C++代码,用文字进行描述一下如果可以的话再用python写一下感谢