【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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言