【MOOC-浙大数据结构】第五周的编程作业——堆并查集Huffman编码

2024-03-29 12:58

本文主要是介绍【MOOC-浙大数据结构】第五周的编程作业——堆并查集Huffman编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.堆中的路径 

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int h[1001]; 
int main()
{h[0]=-10001;int n,m,i,j,x,size=0;scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%d",&x);for(j=++size;h[j/2]>x;j/=2)h[j]=h[j/2];h[j]=x;}while(m--){scanf("%d",&x);printf("%d",h[x]);while(x>1){x/=2;printf(" %d",h[x]);}printf("\n");}
}

2.File Transfer 

//并查集

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int father[10005];
int find(int x)
{int r=x,i=x,j;while(father[r]!=r)r=father[r];while(father[i]!=i)j=father[i],father[i]=r,i=j;return r;
}
void combine(int a,int b) 
{  int ta=find(a);  int tb=find(b);  if(ta!=tb)  father[ta]=tb;  	
}
int main()
{int n,i,j,x,y;char c;	scanf("%d",&n);for(i=0;i<=n;i++)father[i]=i;while(1){getchar();scanf("%c",&c);if(c=='C'){scanf("%d%d",&x,&y);if(find(x)==find(y))printf("yes\n");elseprintf("no\n");}else if(c=='I'){scanf("%d%d",&x,&y);combine(x,y);}else{int k=0;for(i=1;i<=n;i++){if(father[i]==i)k++;}if(k==1)printf("The network is connected.\n");elseprintf("There are %d components.\n",k);break;}}
}

3.Huffman Codes

1.带权路径长度最小(跟哈夫曼编码一样小);

2.无歧义编码——是前缀码:数据仅存在于叶子结点中;

3.没有度为1的结点

因为满足1,2必然有3,所以我们只要证明学生提交的编码满足1,2条件即可。

#include <stdio.h>
#include <algorithm>
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
struct LNode
{char name;int weight;int parent;
};
int GetWeight(LNode *hf,char c,int n)
{int i;for(i=0;i<n;i++){if(hf[i].name==c)return hf[i].weight;}      
}
void Select_2min(LNode *hf,int n,int &min1,int &min2)
{int flag=0,i;for(i=0;i<n;i++){if(!flag&&hf[i].parent==-1){min1=i;flag=1;}else if(flag&&hf[i].parent==-1){min2=i;break;}}   if(hf[min1].weight>hf[min2].weight)swap(min1,min2);	for(i=0;i<n;i++){if(hf[i].parent!=-1||i==min1||i==min2) continue;else if(hf[i].weight<hf[min1].weight){min2=min1; min1=i;}else if(hf[i].weight<hf[min2].weight)min2=i;}
}
int main()
{int n,m,i,j;int min1,min2,WPL=0;scanf("%d",&n);LNode *hf = (LNode*)malloc(sizeof(LNode)*(2*n));for(i=0;i<n;i++){getchar();scanf("%c %d",&hf[i].name,&hf[i].weight);hf[i].parent=-1;}for(i=n;i<2*n-1;i++){//建立哈夫曼树 Select_2min(hf,i,min1,min2);hf[i].weight=hf[min1].weight+hf[min2].weight;hf[min1].parent=i;hf[min2].parent=i;WPL+=hf[i].weight;hf[i].parent=-1;}scanf("%d",&m);while(m--){string code[1005];int sum=0;char c;for(i=0;i<n;i++){getchar();cin>>c>>code[i];sum+=GetWeight(hf,c,n)*code[i].length();}if(sum!=WPL) printf("No\n");else{int flag=0;//判断前缀是否相同sort(code,code+n);for(i=0;i<n;i++) {for(j=i+1;j<n;j++) {if(code[j].substr(0,code[i].size())==code[i])flag=1;}}if(flag) printf("No\n");else printf("Yes\n");}}
}

这篇关于【MOOC-浙大数据结构】第五周的编程作业——堆并查集Huffman编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858655

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应