#include<bits/stdc++.h> using namespace std; const int t=10; const int tt=10; typedef struct { int weight; int parent; int lchild; int rchild; } HTNode, HuffmanTree; typedef char ** HuffmanCode; void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2){ int m1,m2; s1=0,s2=0; m1=1000; m2=1000; for(int i=1;i<=upbound;i++){ int t=HT[i].weight; if(HT[i].parent==0){ if(t<m1) { m2=m1; s2=s1; s1=i; m1=HT[s1].weight; } else if(t<m2) { s2=i; m2=HT[s2].weight; } } } } void HuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,intw,int n){ HT=(HTNode*)malloc((2*n)sizeof(HTNode)); for(int i=1;i<=n;i++,w++){ HT[i].weight=w; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } int i=n+1; while(i<=2n-1){ int a=0,b=0; SelectTwoMin(i-1,HT,a,b); HT[i].weight=HT[a].weight+HT[b].weight; HT[i].lchild=a;HT[i].rchild=b; HT[i].parent=0; HT[a].parent=i;HT[b].parent=i; i++; } HC=(HuffmanCode)malloc((n+1)sizeof(char)); for(int i=1;i<=n;i++){ char back[n]; back[n-1]='\0'; int j=n-1; for(int c=i,p=HT[i].parent;p!=0;c=p,p=HT[p].parent){ if(HT[p].lchild==c) back[--j]='0'; else back[--j]='1'; } HC[i]=(char)malloc((n-j)*sizeof(char)); strcpy(HC[i],&back[j]); } } int main() { HuffmanTree ht; HuffmanCode hc; int n; string ans; cout<<"请输入需要编码的字符串:"; cin>>ans; n=ans.length(); cout<<"请依次输入每个字符在文件中出现的次数:"<<endl; int w[n]; for(int i = 0; i < n; ++ i) cin>>w[i]; HuffmanCoding(ht, hc, w, n); cout<<"哈夫曼树列表:"<<endl; cout<< setw(tt) << left <<"序号"<< setw(tt) << left <<"次数"<< setw(tt) << left <<"父节点"<< setw(tt) << left <<"左孩子"<< setw(tt) << left <<"右孩子"<<endl; for (int i = 1; i <= 2 * n - 1; ++ i) { cout<< setw(tt) << left <<i<< setw(t) << left <<ht[i].weight<< setw(t) << left <<ht[i].parent<< setw(t) << left <<ht[i].lchild<< setw(t) << left <<ht[i].rchild<<endl; } cout<<"每个节点对应的哈夫曼编码:"<<endl; cout<< setw(tt) << left <<"字符"<< setw(tt) << left <<"编码:"<<endl; for (int i = 1; i <= n; ++ i) cout<< setw(t) << left <<ans[i-1]<< setw(t) << left <<hc[i]<<endl; free(ht); for (int i = 1; i <= n; ++ i) free(hc[i]); return 0; }帮我写出这段代码的伪代码
时间: 2024-03-07 13:52:43 浏览: 75
1. 定义结构体HTNode,HuffmanTree,和HuffmanCode,其中HuffmanCode是char类型的二维数组。
2. 定义函数SelectTwoMin,它的参数为上界upbound,HuffmanTree HT,以及两个引用类型的变量s1和s2。函数的作用是在HT中选出两个权值最小的节点,将它们的下标分别赋值给s1和s2。
3. 定义函数HuffmanCoding,它的参数为HuffmanTree HT,HuffmanCode HC,以及int类型的数组w和n。函数的作用是根据w数组构建HuffmanTree,并生成每个节点的编码,并将编码存储到HC数组中。
4. 在main函数中,先读入需要编码的字符串ans和每个字符在文件中出现的次数w。
5. 调用HuffmanCoding函数,得到HuffmanTree ht和HuffmanCode hc。
6. 输出哈夫曼树列表和每个节点对应的哈夫曼编码。
相关问题
修改下列代码#include<bits/stdc++.h> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; typedef struct { … { LNode *p=G.v[i]; while(p->next) { cout<<p->data<<" "; p=p->next; } cout<<p->data<<endl; }
这段代码是一个图的邻接表存储结构的输出函数,但是代码中缺少了图的数据结构定义和初始化,下面是一个完整的代码示例:
```c++
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
typedef struct LNode {
int data;
LNode* next;
} LNode, *LinkList;
typedef struct {
LinkList first;
} VexNode;
typedef struct {
VexNode vexs[MAXN];
int vexnum, arcnum;
} Graph;
void init(Graph& G) {
// 初始化图
G.vexnum = G.arcnum = 0;
for (int i = 1; i <= MAXN; i++) {
G.vexs[i].first = NULL;
}
}
void addEdge(Graph& G, int u, int v) {
// 添加边
LNode* node = new LNode;
node->data = v;
node->next = G.vexs[u].first;
G.vexs[u].first = node;
}
void printGraph(Graph& G) {
// 输出图
for (int i = 1; i <= G.vexnum; i++) {
LNode* p = G.vexs[i].first;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
}
int main() {
Graph G;
init(G);
G.vexnum = 5;
G.arcnum = 5;
addEdge(G, 1, 2);
addEdge(G, 1, 3);
addEdge(G, 2, 4);
addEdge(G, 3, 4);
addEdge(G, 4, 5);
printGraph(G);
return 0;
}
```
在这个示例中,我们定义了图的数据结构 `Graph`,其中包括了顶点数组 `vexs` 和边的数量信息 `vexnum` 和 `arcnum`。`init` 函数用于初始化图,将顶点数组的 `first` 域初始化为 `NULL`。`addEdge` 函数用于添加边,具体实现是将一个节点插入到邻接表中。`printGraph` 函数用于输出图的邻接表存储结构。在主函数中,我们定义了一个 `Graph` 对象 `G`,并且添加了一些边,最后调用 `printGraph` 函数输出邻接表。
#include <bits/甩头dc++.h> using namespace std; int main() { long long n,a[100]; //cin>>n; a[1]=1; a[2]=2; a[3]=4; for(int i=4;i<=50;i++){ a[i] = a[i-1]+a[i-2]+a[i-3]; } while(cin>>n){ cout<<a[n]<<endl; } }请帮我优化这段代码
这段代码的时间复杂度为 O(n),可以考虑使用矩阵快速幂来优化。
以下是优化后的代码:
```
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 9;
struct Matrix {
LL a[4][4];
Matrix() {
memset(a, 0, sizeof(a));
}
Matrix operator * (const Matrix &b) const {
Matrix c;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
for (int k = 1; k <= 3; k++) {
c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j] % mod) % mod;
}
}
}
return c;
}
};
Matrix qpow(Matrix a, LL b) {
Matrix ans;
ans.a[1][1] = ans.a[2][2] = ans.a[3][3] = 1;
while (b) {
if (b & 1) {
ans = ans * a;
}
a = a * a;
b >>= 1;
}
return ans;
}
int main() {
LL n;
while (cin >> n) {
Matrix a;
a.a[1][1] = 1; a.a[1][2] = 1; a.a[1][3] = 1;
a.a[2][1] = 1; a.a[2][2] = 0; a.a[2][3] = 0;
a.a[3][1] = 0; a.a[3][2] = 1; a.a[3][3] = 0;
Matrix b = qpow(a, n - 2);
LL ans = ((b.a[1][1] * 4) % mod + (b.a[1][2] * 2) % mod + b.a[1][3]) % mod;
cout << ans << endl;
}
return 0;
}
```
时间复杂度降为 O(log n)。
阅读全文