【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

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

poj 1182 并查集 食物链类

题意: 有n只动物,分别编号1....n。所有动物都属于A,B,C中的一种,已知A吃B,B吃C,C吃A。 按顺序给出下面两种共K条信息: 1. x 和 y 属于同一类。 2. x 吃 y 。 然而这些信息可能会出错,有可能有的信息和之前给出的信息矛盾,也有的信息可能给出的 x 和 y 不在n的范围内。 求k条信息中有多少条是不正确的。 解析: 对于每只动物,创建3个元素 i

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &