优先队列优化哈夫曼编码

前言

个人小记


一、代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NODE 80
#define MAX_STR 50
#define MAX_HEAP 100
#define father(i) ((i)/2)
#define left(i)   ((i)*2)
#define right(i)  ((i)*2+1)typedef struct Node
{int f;char ch;struct Node *lchild,*rchild;
}Node;typedef struct Heap
{int count,size;Node** __data,**data;
}Heap;void swap(Node** a,Node** b)
{Node* t=*a;*a=*b;*b=t;return ;
}void down_update(Heap*,int);Heap* init_heap(int n)
{Heap* h=(Heap*)malloc(sizeof(Heap));h->count=0;h->size=n;h->__data=(Node**)malloc(sizeof(Node*)*n);h->data=h->__data-1;return h;
}int isempty(Heap *h)
{return h->count==0;
}int isfull(Heap* h)
{return h->count==h->size;
}void up_update(Heap* h,int i)
{while(i>1&&h->data[i]->f<h->data[father(i)]->f){swap(&(h->data[i]),&(h->data[father(i)]));i=father(i);}return ;
}int push(Heap* h,Node* node)
{if(isfull(h)){printf("堆已满,无法压入\n");return 0;}h->data[++h->count]=node;up_update(h,h->count);return 1;
}Node* top(Heap* h)
{if(isempty(h)){printf("堆空,无法查看\n");return 0;}return h->data[1];
}int pop(Heap* h)
{if(isempty(h)){printf("堆空,无法弹出\n");return 0;}h->data[1]=h->data[h->count--];down_update(h,1);return 1;
}void down_update(Heap* h,int i)
{while(left(i)<=h->count){int min=i,l=left(i),r=right(i);if(h->data[min]->f>h->data[l]->f)min=l;if(right(i)<=h->count&&h->data[min]->f>h->data[r]->f)min=r;if(i==min)break;swap(&(h->data[i]),&(h->data[min]));i=min;}return ;
}Node* init_node(char ch,int f)
{Node* node=(Node* )malloc(sizeof(Node));node->f=f;node->ch=ch;node->lchild=node->rchild=NULL;return node;
}
int fc=0;
Node** init_arr(int n,int* s)
{fc=0;Node** arr=(Node**)malloc(sizeof(Node*)*n);for(int i=0;i<n;i++) arr[i]=(Node*)malloc(sizeof(Node));for(int i=0;i<256;i++){if(s[i]!=0){Node* node=init_node((char)i,s[i]);arr[fc]=node;fc++;}}return arr;
}void clear_tree(Node* root)
{if(root==NULL)return ;clear_tree(root->lchild);clear_tree(root->rchild);free(root);return ;
}int* count(char str[],int n)
{int *s=(int*)malloc(sizeof(int)*256);for(int i=0;i<256;i++)s[i]=0;for(int i=0;i<n;i++)s[(int)str[i]]+=1;return s;
}Node* CLO_build_halfman_tree(Node** arr,Heap* h,int n)
{for(int i=0;i<n-1;i++){Node* node1=top(h);pop(h);Node* node2=top(h);pop(h);Node* new_node=init_node('0',node1->f+node2->f);new_node->lchild=node1;new_node->rchild=node2;push(h,new_node);arr[n-i-2]=new_node;}return arr[0];
}void clear_heap(Heap* h)
{if(h==NULL)return ;free(h->__data);free(h);return ;
}void halfman_coding(Node* root,char buff[],int k)
{buff[k]=0;if(root->lchild==NULL&&root->rchild==NULL){printf("%c:%s\n",root->ch,buff);return ;}buff[k]='0';halfman_coding(root->lchild,buff,k+1);buff[k]='1';halfman_coding(root->rchild,buff,k+1);return ;
}int main()
{char str[MAX_STR];// scanf("%[^/n]",str);printf("请输入字符串:");fgets(str,MAX_STR,stdin);//s[strcspn(s,'\n')]=0;char *newline = strchr(str, '\n');if (newline != NULL) *newline = '\0';int* s=count(str,strlen(str));Node** arr=init_arr(MAX_NODE,s);Heap* h=init_heap(MAX_HEAP);for(int i=0;i<fc;i++)push(h,arr[i]);//压入堆Node* root=CLO_build_halfman_tree(arr,h,fc);char buff[MAX_STR];halfman_coding(root,buff,0);clear_tree(root);clear_heap(h);return 0;
}

二、测试结果

请输入字符串:aaaaabbccd
a:0
c:10
d:110
b:111

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.3 指针和函数

11.3 指针和函数 本节必须掌握的知识点&#xff1a; 指针作为函数的参数 数组作为函数的参数 指针作为函数的返回值 在C语言中&#xff0c;指针的一个重要作用就是作为函数参数使用&#xff0c;本节将介绍这一重要作用。 11.3.1 指针作为函数的参数 实验一百一十三&#xff…

电磁兼容(EMC):BUCK变换器基本原理及传导辐射分析设计

目录 1. BUCK电路拓扑及原理 2. Buck拓扑电路电磁场分析 3.总结 开关电源替代线性电源&#xff0c;解决了效率和体积问题&#xff0c;但也带来了新的EMI问题。开关电源也是产品内部的强辐射源之一&#xff0c;基于透过现象看本质&#xff0c;将复杂问题简单化&#xff0c;本…

Xilinx FPGA 管脚的默认电平配置方法 XDC约束

目录 未使用的引脚&#xff0c;XDC约束其他已使用的引脚&#xff0c;XDC约束 未使用的引脚&#xff0c;XDC约束 set_property BITSTREAM.CONFIG.UNUSEDPIN PULLDOWN [current_design] set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design] set_property BITSTREA…

T检验——单样本t检验/两独立样本t检验/配对样本t检验

T检验——单样本t检验/两独立样本t检验/配对样本t检验 1.单样本t检验1.1 适用范围 2. &#xff08; 独立样本t检验&#xff09;两独立样本t检验3.ANOVA多组样本显著性检验&#xff08;2组以上&#xff09;4. 配对样本T检验 1.单样本t检验 1.1 适用范围 单样本t检验:即已知样本…

Linux如何设置系统发送告警脚本到邮箱

本次测试版本&#xff1a;centos7.6 第一步安装mailx yum install mailx 安装结果如下&#xff1a; [rootCentOS764 ~]# yum install mailx Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile epel/x86_64/metalink …

成功解决“IndexError: deque index out of range”错误的全面指南

成功解决“IndexError: deque index out collections.deque out of range”错误的全面指南 引言 在Python编程中&#xff0c;collections.deque 是一个双端队列&#xff08;double-ended queue&#xff09;&#xff0c;支持从两端快速添加和删除元素。然而&#xff0c;与列表&…

Linux提权一

#信息收集 当前主机的操作系统 hostnamectl cat /etc/*-release lsb_release -a cat /etc/lsb-release # Debain cat /etc/redhat-release # Redhat cat /etc/centos-release # Centos cat /etc/os-release # Ubuntu cat /etc/issue 当前主机的内核版本 hostnamectl uname -a …

淘宝商品评论数据爬取:Python实战指南

淘宝作为中国领先的电商平台&#xff0c;其商品评论数据蕴含着丰富的用户洞察和市场信息。对于市场研究人员、产品开发者以及数据分析爱好者来说&#xff0c;能够自动爬取这些数据将极具价值。本文将提供一个使用Python进行淘宝商品评论数据爬取的详细指南&#xff0c;并强调在…

Linux网络-守护进程版字典翻译服务器

文章目录 前言一、pid_t setsid(void);二、守护进程翻译字典服务器&#xff08;守护线程版&#xff09;效果图 前言 根据上章所讲的后台进程组和session会话&#xff0c;我们知道如果可以将一个进程放入一个独立的session&#xff0c;可以一定程度上守护该进程。 一、pid_t se…

mysql(数据库)可视化工具——Navicat Premium

Navicat Premium是一款功能强大的数据库管理工具&#xff0c;它支持多种数据库管理系统&#xff0c;包括MySQL、MariaDB、SQL Server、SQLite、Oracle和PostgreSQL等。Navicat Premium提供了直观的用户界面&#xff0c;使用户能够轻松地管理数据库结构、执行复杂的SQL查询、导入…

CUDA Unity Compute Shader 3

计划 这应该是第3章的读书笔记&#xff0c;但是因为第3章读起来比较困难&#xff0c;所以先看了《CUDA并行程序设计编程指南》的第5章和第6章&#xff0c;感觉读起来顺畅多了&#xff0c;《CUDA并行程序设计编程指南》暂定精读第5、6、7章 1.如何生成ptx文件 属性->CUDA C/…

探索iOS上的C语言编程软件:从入门到精通的全方位指南

探索iOS上的C语言编程软件&#xff1a;从入门到精通的全方位指南 在iOS平台上进行C语言编程&#xff0c;虽然不如其他主流编程语言那么普及&#xff0c;但仍然有一批热衷于C语言的开发者们在这个领域里耕耘。本文将深入探索iOS上的C语言编程软件&#xff0c;从四个方面、五个方…

[QT] MAC使用Qt Creator运行程序如何仅运行一个进程?

大家刚开始使用QtCreator会发现每次run程序&#xff0c;都会出现一个程序进程&#xff0c;使得调试操作增加。如下&#xff0c;每次run都会出现一个demo14的进程。 如何每次run后&#xff0c;就关闭上一次的进程&#xff0c;而重新拉起新进程呢&#xff1f; 看这里 这是默认…

C# 集合(一) —— Array类

总目录 C# 语法总目录 集合一 Array 集合1. Array 类1.1 搜索1.2 排序1.3 翻转1.4 转换 集合 1. Array 类 //创建方式 //方式一 Array arr Array.CreateInstance(typeof(string), 3); arr.SetValue("lisi", 0); arr.SetValue("zhangsan", 1); arr.SetVa…

Redis-02

redis安装包位置 /opt/redis-7.2.5 redis默认安装路径&#xff1a; 配置文件路径&#xff1a;/usr/local/bin/redisconfig gcc安装位置 /opt/rhredis启动&#xff1a; 在/usr/local/bin目录下输入redis-server redisconfig/redis.confredis性能测试命令 redis-benchmark [opt…

【WEEK14】 【DAY5】Swagger第三部分【中文版】

2024.5.31 Friday 接上文【WEEK14】 【DAY4】Swagger第二部分【中文版】 目录 16.6.配置API分组16.6.1.修改SwaggerConfig.java16.6.2.重启 16.7.实体配置16.7.1.新建pojo文件夹16.7.2.修改HelloController.java16.7.3.重启 16.8.常用注解16.8.1.Swagger的所有注解定义在io.swa…

MySQL之高级查询学习笔记(四)

数据库高级查询通常涉及复杂的查询需求&#xff0c;需要利用 SQL 的各种高级功能和语法来实现。以下是一些常见的数据库高级查询示例&#xff1a; 1. 聚合函数和 GROUP BY 求和、平均值、计数等&#xff1a; SELECT SUM(salary) AS total_salary, AVG(age) AS average_age, …

NIUSHOP多商户V6版预售背后的前端技术革新

随着电子商务的快速发展&#xff0c;多商户电商平台成为了市场上的热门选择。在这个背景下&#xff0c;NIUSHOP多商户V6版的预售活动引发了广泛关注。本文将从前端技术的角度&#xff0c;探讨NIUSHOP多商户V6版在预售背后所蕴含的技术革新和亮点。 一、引言 NIUSHOP多商户系统…

node.js点餐系统app-计算机毕业设计源码84406

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

php反序列化学习(3)

1、session 当session_start()被调用或者php.ini中session.auto_start为1时&#xff0c;php内部调用会话管理器&#xff0c;访问用户session被序列化后&#xff0c;存储到指定目录&#xff08;默认为/tmp&#xff09;。 漏洞产生&#xff1a;写入格式与读取格式不一致 处理器…